동시에 일어나는 여러 실행 흐름이 같은 메모리에 읽고 쓴다면 실행 흐름의 feasible interleaving
중에는 잘못된 결과를 낳는 것들이 있고, 이들은 확률적으로 발생하므로 실험적으로 찾기 까다로움
시그널 핸들러와 관련해서 발생하는 레이스 컨디션은 sigprocmask
함수를 사용해서 blocked bit
를 적절히 조작하거나, sigsuspend
와 같이 원자적으로 동작하는 함수를 사용함으로써 해결할 수 있음
정상적인 call-and-return
순서를 거치지 않고 한 함수에서 실행 중인 다른 함수로 제어를 넘기는 user-level
의 exceptional control flow
setjmp
와 longjmp
함수의 형태로 제공됨
#include <setjmp.h>
void setjmp(jmp_buf env);
void longjmp(jmp_buf env, int retval);
setjmp는 PC, SP, 범용 레지스터와 같은 calling environment
를 env 버퍼에 저장하고 최초 호출 시 0을 반환
longjmp는 env
버퍼에 저장된 calling environment
를 복구하고 env 버퍼를 초기화한 가장 최근 setjmp가 반환하도록 함
이때 setjmp는 nonzero return value인 retval을 반환함
nonlocal jump를 사용하면 깊이 중첩된 function call에 대해 예외가 발생했을 때 intermediate call들을 거치지 않고 바로 반환할 수 있음
setjmp, longjmp는 자바의 catch
, throw
와 비슷함
가상 페이지는 unallocated, cached, uncached로 구분
1. Unallocated
가상 메모리 시스템에 의해 할당되지 않은 페이지
해당 페이지와 연관된 데이터가 존재하지 않고 디스크 상에서 공간을 차지하지 않음
2. Cached
물리 메모리 상에 캐시되어 있는 할당된 페이지
3. Uncached
물리 메모리 상에 캐시되어 있지 않은 할당된 페이지
DRAM은 SRAM보다 10배 느리고, 디스크는 DRAM보다 100,000배 느림
또한 디스크 섹터의 첫 바이트를 읽는(첫 바이트에 접근하는) 비용은 동일 섹터의 연속된 바이트를 읽는 비용보다 100,000배 비쌈
이러한 이유로 가상 페이지 크기는 4KB ~ 2MB
정도로 크고, DRAM cache는 fully associative
이고, SRAM cache보다 정교한 교체 알고리즘
을 사용하고, write-through가 아닌 write-back
정책을 사용함
가상 페이지를 물리 페이지에 매핑
하기 위해 사용하는, 물리 메모리에 저장되어 있는 자료구조
OS에 의해 관리됨
페이지 테이블 엔트리(PTE)
의 배열
각 가상 페이지는 페이지 테이블의 고정된 위치에 PTE를 가짐
PTE는 유효 비트
와 n-bit address field
로 구성됨 (가상 메모리 주소 공간 크기가 2^n임)
유효 비트는 해당 페이지가 물리 메모리에 캐시되어 있는지 나타냄
유효 비트가 설정되어 있는 경우 address field는 해당 가상 페이지가 캐시된 물리 페이지의 시작 주소를 저장함
유효 비트가 설정되어 있지 않은 경우, address field가 null이면 가상 페이지가 할당되지 않았음을 의미하고, null이 아니면 디스크 상의 가상 페이지 시작 주소를 저장함