이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
✅ Context swtiching
이전 포스팅에서 동시성(Concurrency)이란 여러 가지의 Task(Process/Thread)을 빠르게 번갈아가며 처리함으로서, 마치 작업이 동시에 실행되는 것처럼 보이는 것이라는 것을 알아보았다.
이 때 하나의 Task에서 다른 Task로 전환하는 것을 Context swtiching이라고 한다. 이 Context switching에 대해서 좀 더 자세히 알아보자.
🎯 Context switching이란 무엇인가?
Context switching이란 하나의 프로세스가 CPU(Processor)를 사용 중인 상태에서, 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(Context)를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 말한다.
한 프로세스의 Context는 그 프로세스의 프로세스 제어 블록(PCB)에 기록된다.
- Wikipedia
위키백과에서는 Context switching을 위와 같이 정의하고 있다.
조금 더 풀어서 설명하자면, 다른 프로세스를 실행해야하는 상황이 발생했을 때 기존에 실행되던 프로세스의 정보를 저장하고, 다음에 실행할 프로세스의 정보를 읽어와 적용하는 과정을 말한다.
여기서 이야기하는 Context는 무엇인가?
OS에서 이야기하는 Context는 CPU가 해당 프로세스를 실행하기 위해 필요한 정보들을 말한다.
프로세스가 실행하던 명렁어의 주소, 프로세스의 상태, 프로세스의 번호와 같은 정보들을 이야기하며, 이는 PCB라는 곳에 저장된다.
Context switching이 발생하면,
1) CPU는 기존에 실행하던 프로세스의 정보를 PCB에 저장해놓고
2) 다음에 실행하고자하는 프로세스의 정보를 PCB에서 불러와 실행한다.
이러한 과정이 존재하기 때문에, 한 Task에서 다른 Task로 전환이 되어도 아무런 이상 없이 동작할 수 있다.
🎯 Context switching이 발생하는 시기
그렇다면 Context switching은 어떤 상황에서 발생하는 것일까?
크게 3가지의 경우로 나눠볼 수 있다.
- 멀티 태스킹(Multitasking)
- OS의 Schedular에 의해 process들을 번갈아가며 처리하는 것을 말한다. 이 때, 하나의 프로세스에서 다른 프로세스로 CPU가 할당될 때 Context switching이 발생한다.
- 인터럽트 핸들링 (Interrupt handling)
- Interrupt란 컴퓨터 시스템에서 예외 사항이 발생했을 때, 처리할 수 있도록 알리는 것을 이야기 한다.
- Interrupt가 발생하면 Context switching이 발생하며,
I/O request(입출력 요청), time slice expired(주어진 시간 만료), fork a child(자식 프로세스 생성), wait for an interrupt(인터럽트 처리 대기) 등이 이에 해당한다.
- 사용자와 커널 모드 전환 (User and kernel mode switching)
- User mode에서 Kernel mode로 전환될 때를 이야기한다. 이러한 상황에 항상 Context switch가 발생하는 것은 아니지만, 운영체제에 따라 발생할 수도 있다.
🎯 Context switching overhead
동시성을 유지하기 위해 수 많은 Task들을 빠르게 돌아가며 처리를 한다고 했는데, 그러면 어느정도로 나눠서 처리할까?
엄청나게 짧게 나누어 처리해도 괜찮을까?
위의 그림에서는 Context switching에서 어떤 일들이 일어나는지 설명하고 있다.
이처럼 Context switching이 일어나는 동안에는 CPU 다른 작업(Task)를 처리할 수 없다. 이를 오버헤드(Overhead)라고 한다.
Context switching이 과도하게 발생하면 Overhead가 많이 발생하기 때문에 오히려 성능 저하가 발생할 수 있다.
✅ PCB: Process Control Block
🎯 PCB가 필요한 이유
PCB는 무엇이며 왜 필요할까?
현대의 컴퓨터는 여러 개의 프로세스를 같이 처리해야 하고, 그러다보면 Context switching이 일어날 수 밖에 없다.
다른 프로세스를 처리해야 할 때(Context switching이 일어났을 때) 코어는 현재 진행하고 있던 프로세스의 진행 정보를 저장해야하고, 다음에 작업을 진행할 프로세스의 진행 상황이나 정보를 알아야 한다.
PCB는 이러한 정보를 저장하는 운영체제에서 프로세스를 관리하기 위해 사용하는 자료구조이다.
🎯 PCB - 프로세스의 정보를 저장하는 자료구조
운영체제는 PCB에 프로세스의 고유 정보(번호)를 저장하여 어떤 프로세스의 정보인지 식별하고, 해당 프로세스의 정보들을 저장한다.
PCB에는 일반적으로 다음과 같은 정보들이 포함되어 있다.
- 프로세스 상태(Process state): 프로세스의 각 상태(new, ready, running, waiting, terminated...)를 저장
- 프로세스 번호(Process ID): 프로세스의 식별자
- 프로그램 카운터(Program counter): 프로세스의 실행될 다음 명령어의 주소를 저장
- 레지스터(CPU registers): CPU 레지스터에 있는 정보
- CPU 스케줄링 정보(CPU scheduling information): 우선순위, 스케줄링 큐 포인터 정보
- 메모리 관리 정보(Memory-management information): 프로세스에게 할당된 메모리의 정보
- 입출력 상태 정보(I/O status information): 프로세스에게 할당된 입출력 장치의 정보
✅ 참고 자료 & 링크
- https://velog.io/@maketheworldwise/Context-Switching#:~:text=%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%20%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0%20%EC%A0%95%EB%B3%B4-,Context%20Switching%20%EB%B0%9C%EC%83%9D%20%EC%8B%9C%EA%B8%B0%3F,%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8%20%EC%9A%94%EC%B2%AD%EC%9C%BC%EB%A1%9C%20%EB%B0%9C%EC%83%9D%EC%8B%9C%ED%82%A8%EB%8B%A4.
- https://jeong-pro.tistory.com/93
- https://yoongrammer.tistory.com/52