문맥 교환 (Context Switching)

김찬수·2023년 3월 21일
0

문맥 교환을 설명하기 위해 멀티 태스킹을 먼저 짚어보고 문맥교환은 무엇인지, 그 절차는 어떻게 구성되어있는지 알아보도록 하자.

컴퓨터를 사용할 때, 화면의 크롬 브라우저와 같이 한 프로그램 안에서 여러 탭을 나누기도 하고, 슬랙이나 카톡, 디스코드 등 서로 다른 프로그램을 각각의 창으로 동시에 실행하기도 한다.
이런 상황을 멀티 태스킹이라고 한다.


이런 멀티 태스킹이 어떻게 가능한 지를 이해하기 위해서는 프로세스와 스레드의 개념을 알아야한다.
먼저 프로세스란 현재 실행중인 프로그램으로 볼 수 있다. 하나의 프로세스는 운영체제로 부터 시스템 자원을 할당받아 실행될 수 있게 된다. 각 프로세스는 서로에게 영향을 미치지 않는 독립적인 구조이다.
스레드는 한 프로세스 내에서 명령 단위로 실행하는 일꾼이며 할당 받은 자원을 실제로 사용하는 주체가 된다. 스레드는 프로세스 내부에 존재하며 각 스레드는 프로세스의 자원들을 공유한다.


앞서 본 멀티태스킹의 상황과 같이 여러 개의 프로세스와 스레드들이 동시에 실행될 수 있다. 프로세스가 동시에 실행되면 멀티프로세스, 스레드가 동시에 실행되면 멀티스레드라고 한다.
사진은 메이플스토리 게임에서 자쿰을 파티 사냥하는 모습이다.
파티를 구성하고 있는 각각의 유저들은 서로 독립된 프로세스로 볼 수 있고, 서로 다른 스킬을 사용하는 자쿰의 팔은 각각이 모험가를 상대하는 자쿰의 프로세스를 구성하는 스레드로 볼 수 있다.


이러한 멀티 프로세스와 멀티 스레드는 운영체제가 제공하는 주요기능 중 하나인 시분할 시스템에 의해 작동된다. 시분할 시스템은 여러 프로세스가 사용하는 시스템에서 컴퓨터의 자원을 시간적으로 분할하여 프로그램을 번갈아가며 처리해준다.
그렇게함으로 각 프로세스에게 독립된 컴퓨터를 사용하는 느낌을 준다.
이러한 기능을 구현하고자 생겨난 기법이 문맥 교환이다.


문맥교환이란, CPU를 사용하는 실행의 주체가 특별한 명령에 의해 다른 주체로 바뀌게 되는 경우에 문맥교환이 일어난다.

프로세스가 실행되던 도중 인터럽트가 발생하고, 현재 상태가 PCB에 저장된 뒤 다른 프로세스가 실행된다.

이러한 문맥교환이 일어나면 오버헤드가 발생하며, 문맥교환에서의 오버헤드는 cpu가 쉬고 있는 상태를 말한다. ( 교착상태 )

이제 각 절차에 대해 살펴보겠다.


문맥교환의 첫번째 절차로 유저모드에서 프로세스 실행중 인터럽트가 발생한다.

컴퓨터의 세계에서 인터럽트란 기존에 진행되던 프로세스와 관계없이 우선순위가 더 높은 작업을 먼저 처리한다 라는 의미이다.
프로세스의 실행 도중, 하드웨어 또는 소프트웨어에서 입출력장치에 의한 요청이 들어오면 상위 명령을 우선 실행한다.
문맥교환을 발생시키는 요소에는 크게 두 가지가 있는데, time interrupt는 다수의 프로세스를 실행하면서 운영체제가 각각에게 할당한 CPU 시간을 소진했음을 의미하고, I/O 요청 sysyem call은 하드웨어 중에서도 입출력장치가 작동하기 위해 운영체제에 신호를 보내는 것이다.


유저모드는 제한적인 명령만 수행하고 커널 모드는 운영체제가 cpu의 제어권을 가지고 모든 종류의 명령을 수행한다.
메모리 접근과 같이 시스템에 중요한 영향을 미치는 연산은 커널 모드에서만 실행 가능하게끔 되어있다.
그러한 성질로 인하여 메모리에 프로세스의 상태를 저장하기 위해서는 커널 모드로 들어가야 한다.


커널모드에 들어간 프로세스의 데이터는, Process Control Block, 통칭 PCB라는 곳에 임시로 저장된다.

컴퓨터가 동작을 하기 위해서는 메모리에서 데이터를 읽어와야 하는데
PCB에는 프로세스의 이름은 무엇인지, 프로세스의 상태는 어떠한지, 이 프로세스를 실행시킬 우선도는 얼마나 높은지등의 각종 데이터가 저장된다.

운영체제는 이러한 데이터들을 저장한 PCB를 사용하여 각 프로세스간의 전환을 원활하게 한다. 여기까지의 과정이 문맥교환이다.


멀티스레드 방식 역시 동일한 문맥교환 절차를 거친다. 각 스레드의 현재 상황을 TCB를 활용하여 저장한 뒤 스레드간의 전환을 가능하게 한다.

멀티스레드 방식은 앞서 본것과 같이 코드 데이터 힙의 자원을 공유하기 때문에 자원을 효율적으로 관리할 수 있다.
그러나 자원을 공유하기 때문에 생기는 단점은 하나에 스레드에 문제가 생기면 전체적인 프로세스에 영향을 미친다는 것이다.

멀티프로세스 방식은 각각 독립된 메모리 영역을 갖고 있어 작업량이 많을 수록 문맥교환으로 인한 성능 저하를 유발한다.
하지만 독립된 메모리 영역을 가지고 있기 때문에 하나의 프로세스에 문제가 생겨도 다른 프로세스에는 영향을 미치지 않는다.

때문에 우리의 컴퓨터는 어느 한쪽이 아닌 두 가지 방식을 적절히 활용하여 멀티태스킹 작업을 진행한다.

profile
프로그래머 지망생

0개의 댓글