context switching(문맥 교환)
CPU/코어에서 실행 중이던 프로세스/스레드가 다른 프로세스/스레드로 교체되는 것.
( 엄연히 말하면 위 정의는 틀렸다. 오늘날의 CPU는 실행 단위(unit of execution)를 스레드로 한다. 그렇기에 더이상 cpu는
프로세스를 실행한다는 말은 성립이 되지 않기에, 실행 중이던 프로세스가 다른 프로세스로 교체되는 것은 더 이상 성립이
되지 않는다. 만약 누군가가 프로세스에 대해 문맥 교환이 일어났다고 함은, 그건 싱글 스레드로 구성된 프로세스가 있는
데, 그 스레드가 다른 프로세스의 싱글 스레드로 교체가 되었다는 말이다.)
Context
프로세스/스레드의 상태(cpu상태, 메모리 상태 등등)
Context Switching이 일어나는 시점
1. 주어진 time slice(quantum)를 다 사용
2. I/0작업을 해야 할 때
3. 다른 Resource를 기다려야 할 때
4. 인터럽트가 발생을 할 때!
so on....
Context Switching은 누구에 의해 실행되는가?
OS kernel에 의해 실행이 된다.
OS kernel : 운영체제의 기능 증 하나로써, 각종 Resource(메모리, cpu 등등)을 관리/감독하는 역할.
Context Switching은 구체적으로 어떤 과정으로 일어나는가??
다른 프로세스끼리의 스위칭인지(process context switching)
같은 프로세스 내의 스레드들끼리의 스위칭인지(thread context switching)
에 따라 다르다.
Process Context Switching vs Thread Context Switching
공통점
1. kernel 모드에서 실행
2. cpu의 레지스터 상태(중간값, 마지막으로 실행된 명령어의 위치 so on..)를 교체
차이점
다른 프로세스끼리 사이의 문맥 교환에서는 가상 메모리 주소 체계 관련하여 추가 작업을 해줘야 한다.
참고로, 문맥 교환이 발생을 하면, 통제권은 OS에게 넘어가고 Kernel 모드로 진입을 한다.
MMU(Memeory Management Unit)
TLB : 가상 주소와 실제 메모리 주소를 매핑하기 위한 Cache Memory.
( 만약, 다른 프로세스 사이에서 문맥 교환이 발생 시에 TLB를 비워 주는 작업을 해 주지 않으면, 위 예제에서는 P2가 실행돼야 하는데, P1에 접근해서 실행되버릴 수가 있다.)
Thread Context Switching이 더 빠른 이유
Thread Context Switching은 하나의 프로세스 내의 스레들 사이의 문맥 교환이다.
고로, 같은 메모리 공간을 공유하기에 메모리 주소 관련 처리는 하지 않아도 되기 때문!!
Context Switching이 미치는 악영향
CPU 내에는 자주 사용되거나 향후 자주 사용될 것 같은 데이터를 저장하는 Cache Memory가 있다.
Context Switching 시 cpu 상태의 값은 이 Cache Memory에 저장이 되게 된다.
고로, 새롭게 시작하는 프로세스/스레드가 실행돼서, Cache Memory에 접근을 해 봤자, 내가 원하는 데이터가 없을 가능성
이 매우 크다.
왜냐하면, 이전의 프로세스/스레드의 데이터로 Cache Memory가 오염됐기 때문이다.
그나마, 스레드는 같은 메모리 공간을 공유하기에 Caching Miss가 일어날 확률이 매우 크지는 않지만,
메모리에 독립적으로 존재하는 프로세스들 사이에서 문맥 교환 발생 시, Caching Miss가 발생할 가능성이 매~~~우 크다.
'CS 과목(CS科目) > 운영체제(OS)' 카테고리의 다른 글
스핀락(spinlock) 뮤텍스(mutex) 세마포(semaphore) (0) | 2022.12.23 |
---|---|
동기화(synchronization), 경쟁 조건(race condition), 임계 영역(critical section) (0) | 2022.12.23 |
cpu bound vs io bound (0) | 2022.12.20 |
헷갈리는 개념들에 대한 정리(feat 프로세스, 스레드, 멀티태스킹, 멀티스레딩 etc) (0) | 2022.12.19 |
Stack Frame( in Java ) with THIS pointer (0) | 2022.12.19 |