- 현재 CPU를 점유하는 프로세스를 다음으로 스케쥴링 될 프로세스로 바꿀 때 발생하는 과정으로서,
현재 프로세스의 (문자 그대로의)상태, CPU의 레지스터 값 - MMU의 PTBR - PC 레지스터 등을
하나의 snapshot으로서, 커널 메모리의 PCB에 저장한후, 다음 프로세스의 PCB에서 실행에 필요한 상태를 load하는... 일련의 과정. - 문맥 전환으로 인해 초래되는 TLB MISS 역시 오버헤드로 볼 수 있다.
- ARM 아키책쳐의 경우 이러한 오버헤드를 최소화하기 위하여 여러개의 레지스터셋을 배치하여 문맥 전환 시 포인터만 변경하는 전략.
프로세스 전체의 메모리(Virtual address space)를 물리 메모리에 적재하지 않고도, 프로세스를 실행할 수 있는 기법
가상 주소 공간을 Page 단위로 분할 후, Demade Paging기법을 통해 구현
- 메모리를 가상화하였을 때, (가상 주소 공간) 이를 물리 메모리에 어떻게 매핑시키는지가 관건
가상 메모리란 프로세스의 모든 메모리를 물리 메모리에 적재하지 않고도, 프로세스를 실행할 수 있는 기법
-
다른 프로세스에 대한 보호
Virtual address를 Phsical address로 변환하는 과정에서 MMU가 유효한 범위를 확인하여 다른 프로세스에 대한 접근을 보호 -
실제 물리적 메모리 크기가 수용할 수 있는 크기보다 더 많은 프로세스를 가용
2.1. 각 프로세스의 가상 주소 공간을 일정한 크기의 page로 나누어, 단편화를 최소화
2.2. 사용되지 않는 페이지를 DISK에 스왑아웃
실제 물리 주소공간의 크기보다 더 많은 메모리를 사용할 수 있다. (Demand paging) -
프로세스 간 공유되는 영역은 물리메모리에 한 곳에만 적재한 후 Page Table이 동일한 곳을 가르키게 함.
- MMU를 통한 가상 메모리 주소에서 물리 메모리 주소로의 변환이라는 오버헤드
-
- 스핀락
1.1. test-and-set 사용 : 메모리 공간에 new value 삽입 후 old 리턴
1.2. compare-and-swap 사용 : 메모리 공간의 값이 old == expected인 경우에만 new value 삽입하고 old 리턴
1.3. fetch-and-add 사용 : 메모리 공간의 값을 +1 증가시키는 연산. ticket 과 turn
- 스핀락
-
- OS의 도움 - 스핀락은 CPU 낭비 심함.
2.1. yield - cpu 양도
2.2. park, unpark, setpark : 락 획득 실패 시 잠재우며, 큐에서 대기.
2.3. futex : linux 버전의 park
- OS의 도움 - 스핀락은 CPU 낭비 심함.
2.1. yield - cpu 양도
test-and-set & compare-and-swap
- 쓰레드 동기화 기법들
- lock이다 / 임계영역을 mutex로 감싸, lock획득한 쓰레드만이 진입 /
- mutex만으로는 병행 프로그래밍안됨
- 다른 쓰레드의 작업에 의해 특정 조건이 만족되었는지 확인할 수 있어야 함.
- Cond var은 wait/signal 메커니즘을 기반으로, 쓰레드 대기 큐를 제공.
- mutex lock과 Condition variable이 같이 사용되면 그 결과가 monitor다.
Ref