멀티스레드의 동시성(Concurrency) 동작 방식에 대해 간략히 다룬 적이 있었다.
동시성 동작 방식은 싱글 코어에서 여러 작업을 동시에 실행되는 것처럼 보이기 위해 번갈아 가면서 작업을 수행하는데,
이때 다른 작업으로 바꿔서 실행할 때 내부적으로 콘텍스트 스위칭(Context Switching)이라는 게 일어난다.
이에 대해 자세히 알아보자.
콘텍스트 스위칭(Context Switching)
CPU(Control Processing Unit)가 어떤 프로세스(Process)를 실행하고 있는 상태에서
운영체제(Operating System)의 스케줄러(Scheduler)가 인터럽트(Interrupt)를 진행하여 더 높은 우선순위를 가진 프로세스가 실행되어야 할 때,
스케줄러가 레지스터(Register)에 저장된 기존 프로세스 정보 값이나 기존 프로세스 상태 값을 커널(Kernal) 내부에 존재하는 PCB(Process Control Block)에 저장하고,
새 프로세스의 정보 값이나 새 프로세스 상태 값을 PCB에서 다시 가져와 교체하는 작업
한마디로 스케줄러가 기존 실행 프로세스를 우선순위 때문에 미루고 새 프로세스로 교체해야 할 때 프로세스 상태 값을 교체하는 작업을 말한다. (참고로 '프로세스'를 기준으로 설명한 것이다.)
위 정의만 봐서는 미리 이해해야 하는 용어들이 많아 보인다. 하지만 육하원칙에 따라 주체, 대상, 방법 등 반드시 알고 넘어가야 하는 요소들이라서 일부러 자세히 풀어서 적었다. 따라서 용어에 대해 하나씩 살펴보고 아래에 간략히 정리해보았다.
💡 CPU(Control Processing Unit)
사용자들이 입력한 명령어를 해석하고 연산한 후 그 결과를 제어하는 역할을 하는 장치를 말한다.
💡 프로세스(Process)
운영체제(Operating System)에 의해 메모리 공간을 할당받아 CPU에서 실행/제어되고 있는 프로그램을 말한다.
프로세스와 스레드에 궁금하신 분들은 별도로 포스팅했으니 참고 바란다.
💡 스케줄러(Scheduler)
어떤 프로세스에게 자원을 할당할지 순서와 방법을 결정하는 운영체제 커널의 모듈을 지칭한다.
스케줄러의 개념과 스케줄러의 알고리즘에 대해서는 포스팅이 완료되면 여기 링크를 달아두려고 하니 참고 바란다.
💡 레지스터(Register)
n-bit의 정보를 저장할 수 있는 고속도의 기억장치를 말한다.
CPU에서는 외부 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하고 이동하는 고속도의 기억장치로 사용된다.
💡 커널(Kernal)
운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 되는데, 이때 메모리에 상주하는 운영체제의 부분을 커널이라 한다.
운영체제도 소프트웨어라서 메모리에 올라가야 하나 규모가 큰 프로그램이기 때문에 모두 올라간다면 한정된 메모리 공간의 낭비가 심할 것이기 때문에 커널로 분리해둔 것이다.
💡 PCB(Process Control Block)
특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영 체제 커널의 자료 구조를 말한다.
그 정보에는 프로세스 번호, 포인터, 프로세스 상태, 레지스터, 프로그램 카운터(코드 위치) 등이 있다.
프로세스 단위의 정보를 저장하는 PCB, 스레드 단위의 정보를 저장하는 TCB에 대해서는
포스팅이 완료되면 여기 링크를 달아두려고 하니 참고 바란다.
우선 콘텍스트 스위칭에서 콘텍스트가 무엇일까?
콘텍스트(Context)
OS에서의 콘텍스트란 CPU가 해당 프로세스를 실행하기 위한 프로세스의 정보를 말하는 것이다.
그러면 어떤 정보 덕분에 스위칭이 가능한 것일까?
여러 정보가 있겠지만 핵심은 프로그램 카운터(Program counter, PC)와 스택 포인트(Stack Pointer, SP)다.
프로그램 카운터(Program counter, PC)
마이크로프로세서 내부에 있는 레지스터 중의 하나로서, 다음에 실행될 명령어의 주소를 가지고 있어 실행할 기계어 코드의 위치를 지정한다. 간단히 코드 한줄한줄을 가리키는 주소 레지스터라고 생각하면 된다.
💡 참고로 마이크로프로세서는 CPU 안에 기계어를 상대적으로 쉽게 추가할 수 있도록 이용하는 방식인 '마이크로코드'를 사용한다는 동작 방식 자체에 초점을 맞춘 용어이므로 CPU랑 동일하게 생각하면 된다.
💡 기계어
컴퓨터가 직접 판독하고 실행할 수 있는 언어이며 0과 1의 조합으로 구성됐다. 이는 프로그램을 나타낼 수 있는 언어 중 가장 기계와 가까운 최하위 단계의 개념이다.
스택 포인터(Stack Pointer, SP)
CPU안에서 스택에 데이터가 채워진 마지막 위치를 가리키는 레지스터다. 스택 특성상 스택 포인터가 가리키는 곳까지가 데이터가 채워져 있는 영역이고 그 이후부터 스택의 끝까지는 데이터가 없는 영역인 것이다. 즉, 스택에 새로운 데이터가 추가되거나 제거되면 스택 포인터의 값이 증가하거나 감소한다.
💡 스택
한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조의 자료 구조이다.
이렇게 기계어 코드 위치 정보와 스택의 데이터 위치 정보 덕분에
콘텍스트 스위칭이 일어나더라도 프로세스 간, 스레드 간 전환이 가능한 것이다.
그렇다면 콘텍스트 스위칭은 언제 발생할까?
인터럽트(Interrupt)
CPU가 프로그램을 실행하고 있을 때 실행 중인 프로그램 밖에서 예외 상황이 발생하여 처리가 필요한 경우
CPU에게 알려 작동이 중단되지 않고 예외 상황을 처리할 수 있도록 하는 기능을 말한다.
콘텍스트 스위칭은 아래와 같은 인터럽트 요청이 와야 발생한다.
1. 입/출력을 요청할 때
2. CPU 사용시간이 만료되었을 때
3. 자식 프로세스를 만들 때
4. 인터럽트 처리를 기다릴 때
💡 이런 요청들이 어떤 동작 속에서 들어오는지 이해하기 위해서는 프로세스의 상태변화를 알아야 하는데,
이에 대해서는 포스팅이 완료되면 여기 링크를 달아두려고 하니 참고 바란다.
콘텍스트 스위칭 단점 - 오버헤드(Overhead)로 인한 성능 저하
콘텍스트 스위칭이 잦게 발생할수록 오버헤드(Overhead) 비용이 발생하여 성능이 떨어진다.
여기서 오버헤드란 사용된 시간과 사용된 메모리의 양을 말한다.
위 그림을 보면 프로세스 P0가 실행 중인 상태(excuting)에서 유휴 상태(idle)가 될 때 프로세스 P1이 곧바로 excuting이 되지 않고 idle을 좀 더 하다가 excuting이 된다.
그 이유는 프로세스 P0의 상태를 PCB에 저장하고 프로세스 P1 상태를 PCB에서 가져와야 하기 때문이다.
그런데, 이 과정에서 PCB를 저장하고 가져올 때 CPU는 아무런 일도 하지 못하게 된다.
따라서 이 아무런 일도 하지 못하게 되는 상황이 잦을수록 당연히 성능 저하로 이어지는 것이다.
스레드와 프로세스 중 콘텍스트 스위칭이 빠른 것은? - 스레드
스레드 단위로도 콘텍스트 스위칭이 가능하다.
스레드는 콘텍스트 스위칭될 때 스택(Stack)을 제외한 코드(Code), 데이터(Data), 힙(Heap) 영역은 프로세스의 것이기 때문에 자신의 PCB에는 스택 및 간단한 정보만 저장해서 프로세스 콘텍스트 스위칭보다 빠르다.
반면에 프로세스는 공유하는 데이터가 없으므로 임시 저장소인 캐시 메모리가 지금껏 쌓아놓은 데이터들이 사라지고 새로 데이터를 쌓아야 한다.
따라서 콘텍스트 스위칭의 오버헤드를 개선하기 위해 스레드 컨텍스트 스위칭을 사용하기도 한다.
출처
컨텍스트 스위칭(Context switching)
en.wikipedia.org/wiki/Context_switch
https://www.crocus.co.kr/1364
콘텍스트(Context)
https://jeong-pro.tistory.com/93
프로세스 제어 블록(Process Control Block)
ko.wikipedia.org/wiki/프로세스_제어_블록
마이크로프로세서
ko.wikipedia.org/wiki/마이크로프로세서
콘텍스트 스위칭 코드 예시
nesoy.github.io/articles/2018-11/Context-Switching
'프로세스 vs 스레드' 콘텍스트 스위칭 비교
stackoverflow.com/questions/5440128/thread-context-switch-vs-process-context-switch
'운영체제, 컴퓨터구조' 카테고리의 다른 글
교착상태(Deadlock) (0) | 2021.04.15 |
---|