본문 바로가기

CS/운영체제

[씨면기작] 프로세스의 상태변화에 대해서 설명해주세요.


 해당 글은 저의 주관이 가득 섞인 내용입니다. 특히 질문한 이유, 면접관의 의도 등은 개인적인 생각임을 밝힙니다.  


(0) 시간이 없어서 죄송해요 전체 글을 못읽겠어요. 빠르게 원하는 것만 가져갈게요!

프로세스의 상태변화는 다른 말로 문맥교환이라고 말하는데요, 문맥교환이 발생하는 것은 실행중인 프로세스의 종료, 인터럽트 발생 또는 새로운 자원을 획득하기 위해 비실행 상태가 되었을때 발생하게 됩니다. 비실행 상태가 되었을때 대기중인 다른 프로세스가 스케줄링되어 실행 상태가 됩니다. 이 과정을 프로세스의 상태변화라고 하며 다른말로 문맥교환이라고 말할 수 있습니다.


(1) 질문한 이유가 뭐예요? 

후에 배우겠지만 사실 프로세스 하나가 계속해서 동작하는 것은 아닙니다. 저희가 알아차리지 못할만큼 빠른 속도로 프로세스가 전환되면서 계속해서 동작합니다. 그렇기 때문에 프로세스의 상태변화는 계속해서 일어나게 되는데요. 아마도 면접관이 이러한 질문을 하게 됐다면? 다음 질문에 문맥교환, 스케줄링, 시분할 등에 대해서 질문하기 위해서 첫번째 질문으로 했다고 봐도 될것 같습니다.

이제 위에 말씀드린 문맥교환, 스케줄링, 시분할과 같은 내용은 잊고 프로세스의 상태변화에 대해서만 생각을 해보겠습니다. 프로세스의 상태는 크게 실행과 비실행 상태로 나눌 수 있습니다. 여기서 엄청 크게 나누었기 때문에 딱 두가지로 생각하시면 될 것 같습니다. 프로세스가 실행 중이다. 비실행 중이다.

그렇다면, 실행중인 프로세스는 어떻게 비실행 상태가 될 수 있을까요? 그러한 경우는 여러가지가 있습니다. 대표적으로 몇가지만 말해보도록 하겠습니다.


📌첫번째는 실행중인 프로세스가 종료(Exit) 또는 인터럽트(Interrupt)가 발생했을 때 입니다. 프로세스는 메모리에 적재되어 있는 운영체제의 제어를 받고 있는 상태입니다. 그런 프로세스가 종료가 됐다는 뜻은? 프로그램이 종료가 되었다고 봐도 무방하겠습니다. 그렇기에 프로세스가 종료되었다면? 비실행 상태가 되었다고 생각하시면 됩니다.

인터럽트란? 방해하다라는 말인데, 프로세스가 실행중에 어떠한 방해를 받은 것입니다. 실제로 나쁜 방해가 아니고, 프로세스 실행중에 당연히 발생하는 과정을 뜻한다고 생각하면 됩니다. 예를 들어 내가 운전을 하고 있는데 시속 100km/h로 질주를 하고 있습니다. 그 순간 네비게이션에서 전방 100m에 0km/h 단속 구간이 있다면? 당연히 말도 안되지만 잠깐 멈춰야 합니다. 그런것을 인터럽트라고 생각하시면 되겠습니다.

📌두번째는 실행중인 프로세스가 새로운 자원을 할당 받기 위해서 입니다. 예를 들어, 똑같이 운전중이라고 가정을 합시다. 운전중에 기름에 EMPTY 불이 들어오게 된겁니다. 우리는 가솔린을 얻기위해서 잠시 주유소에 들려야합니다. 그렇게 하기 위해선 멈춰가야겠죠? 이러한 상황이라고 생각하시면 됩니다.


사실 위의 두 예제는 조금은 잘못됐다고 생각합니다. 단편적으로 이해하기는 쉽지만 실제 컴퓨터 적으로 이해하기에는 무리가 있습니다. 왜냐하면 다른 프로세스들은 계속해서 쌩쌩 달리고 있기 때문이죠. 글을 쓰면서 방금 생각해내서 좀 빈틈이 많아보입니다. 하지만, 쉽게 이해하기에는 좋은 예시라고 생각되니 단순하게 받아드려 주시면 되겠습니다.


정리하겠습니다. 실행중인 프로세스가 비실행 상태가 되는 이유는 종료 또는 인터럽트가 발생했을때 그리고 새로운 자원을 할당 받을 때가 되겠습니다. 해당 상황에서 실행중인 프로세스가 비실행 프로세스가 됩니다.

그리고 비실행 프로세스가 실행 프로세스가 되기 위해서 위에 주어진 내용과 반대겠죠? 프로그램이 실행 되었거나, 인터럽트가 해결 되었거나, 자원을 획득했을 때 프로세스의 상태는 실행상태로 전환됩니다.

이제 우리는 프로세스의 실행과 비실행 상태에 대해서 크게 나눠서 생각을 해봤습니다. 하지만, 프로세스가 종료되지 않는 이상 다시 실행 상태가 된다면? 이전까지 실행중이였던 내용들을 알고 있어야하는데 누가 가지고 있을까요?

다른 페이지에서 작성하기에는 내용이 너무 분산되어 버릴까봐 해당 페이지에 작성합니다.

이전까지 실행중이던 내용을 갖고 있는 것은 프로세스 제어 블록(PCB: Process Control Block)입니다. 프로세스가 생성되면서 갖고 태어나는 블록입니다. 해당 블록은 프로세스의 상태를 기록하고 있습니다.

[ 프로세스 식별, 프로세스의 상태, 프로세스 카운터, 레지스터 저장 영역, 프로세서 스케줄링 정보] 등을 갖고 있습니다. 그래서 실제 프로세스의 상태가 계속해서 변화해도 해당 블록을 참조해 바로 실행이 가능한 것입니다.

그렇다면? 우리는 개발자입니다. 이러한 과정 우리의 밥벌이를 책임져주는 컴퓨터에게 부담이 안갈까요? 이 내용은 추후에 다시 설명하겠습니다.

일단, 프로세스 제어 블록에 있는 내용을 저장했다가, 프로세스를 재실행하고 다시 비실행 시켰다가, 다른 프로세스는 재실행하는 과정을 계속해서 겪게 됩니다. 이 과정은 위에서 설명드렸던 것 처럼 문맥교환(Context Switching)이라고 합니다.

해당 키워드를 말하기 위해서 빌드업을 했습니다. 사실 면접을 준비하는 대부분의 취준생은 문맥교환이라는 키워드를 보자마자 설명이 가능할 것입니다. 하지만 해당 글을 작성하는 이유는 면접관이 질문을 한 이유를 생각하고 그 이유가 나온 배경을 설명하는 페이지이기 때문에 짧은 글을 길게 쓰는 것입니다.  어쨌든 저쨌든, 프로세스의 상태변화를 다른 말로 하면 문맥교환(Context Switching)이라고 합니다. 그래서 프로세스의 상태변화는 다른 말로 문맥교환이라고 말하는데요, 문맥교환이 발생하는 것은 프로세스의 종료, 인터럽트 발생 또는 새로운 자원을 획득하기 위해 비실행 상태가 되었을때 발생하게 됩니다. 비실행 상태가 되었을때 대기중인 다른 프로세스가 선택되어 실행 상태가 됩니다. 이 과정을 프로세스의 상태변화라고 하며 다른말로 문맥교환이라고 말할 수 있습니다.


(2) 해당 질문을 한 면접관의 의도는 무엇일까요?

문맥교환(Context Switching)에 대해서 알고 있냐 모르냐를 물어본것 같습니다. 문맥교환시에 발생하는 오버헤드 또는 문맥교환이 어떻게 일어나는지 아는가를 물어보기전에 배경지식을 알고 있는가를 파악하기 위한 면접 질문이라고 생각합니다. 만약 해당 질문을 받는다면? 나 문맥교환에 대해서 알고 프로세스의 문맥교환의 오버헤드가 크다는 사실을 압니다. 왜냐하면 ~ 에 대한 내용을 작성을 해보겠습니다. 어쨌든 저쨌든, 해당 면접관의 의도는 배경지식을 알고 있냐는 것 같습니다. 그리고 아마 이런 내용으로 시간을 뺏거나 하지 않을 겁니다.(?)

다음 씨면기작은 🔜문맥교환(Context Switching) 입니다.


프로세스의 상태 변화 과정

준비에서 실행

준비 큐 맨 앞에 있던 프로세스가 프로세서를 점유하는 것을 디스패치라고 합니다. 다중 프로그래밍 운영체제에서는 실행 상태인 프로세스가 할당된 시간만큼만 프로세서를 사용하도록 하여 특정 프로세스가 프로세서를 계속 독점하는 것은 방지합니다.

실행에서 준비

운영체제는 실행 상태의 프로세스가 프로세서를 계속 독점하지 않도록 인터럽트 클록을 두어 특정 프로세스가 할당된 시간 동안만 프로세서를 점유하게 합니다. 프로세스가 일정 시간이 지나도, 즉 타임아웃 되어도 프로세스를 반환하지 않는다면? 클록이 인터럽트를 발생시켜 운영체제에 프로세서 제어권을 부여하는 것입니다. 그러면 실행 상태의 프로세스는 준비 상태가 되고, 준비 큐의 첫 번째 프로세스가 실행 상태가 됩니다.

실행에서 대기(보류)

할당된 시간 이전에 실행 상태의 프로세스에 입출력 연산 등이 필요하거나 새로운 자원 요청 등의 문제로 프로세서를 스스로 양도하면서 대기 상태가 됩니다.

대기(보류)에서 준비

프로세스는 입출력 작업이 끝나면 깨워 대기에서 준비 상태가 됩니다.

그림으로 배우는 구조와 원리 운영체제 p98