본문 바로가기

CS/운영체제

[ 운영체제 ] 프로세스의 상태, Context Switch

반응형

프로세스는 커널의 PCB에 의해 관리된다. PCB 안에는 프로세스에 관한 정보들이 저장되어 있는데, '상태' 정보가 그 중 하나다. 상태의 종류를 알아보기 전에 상태 정보를 저장하는 이유를 한번 생각해보자.

 

 

우리는 운영체제를 배우면서 늘 두 가지 사실을 기억하고 있어야 한다.

1. CPU는 한 가지 일(프로세스)만 처리할 수 있다!
2. 컴퓨터는 고철 덩어리에 불과하다(근데 반도체를 곁들인). 마법처럼 짠! 하는 일은 없다.

 

물론 요즘에는 성능이 좋은 CPU가 많이 나와서 여러 개의 프로세스를 동시에 처리할 수 있지만 사실 그것도 여러개의 CPU를 하나의 CPU처럼 보이게 만들어 놓은 것에 불과하다. 하나의 칩에는 한 가지 일만 수행할 수 있다. 이러한 문제 때문에 '상태' 정보가 필요하다. CPU를 최대한 쉬지 않게 하기 위한 장치라고 생각하면 된다. 

 

 

 

CPU가 하나의 프로세스만 처리할 수 있다면 다음과 같은 의문점이 생긴다.

내 컴퓨터는 여러 개의 프로그램 동시에 돌릴 수 있는데...

 

사실 이건 착각에 불과하다. 엄밀하게 말하면 컴퓨터는 여러 개의 프로세스를 굉장히 빠른 속도로 여러 번에 걸쳐 수행한다. 그러나 속도가 워낙 빨라서 마치 동시에 돌아가는 것처럼 느끼는 것이다. 이것을 'illusion'이라고 한다. 

이렇게 생각했겠지만 사실은...
이게 맞다

 

이러한 문제 때문에 언제, 어떤 프로세스를 실행시켜야 하는지 결정하는 것도 컴퓨터 입장에서 굉장히 중요한 문제다. 효율성과 직결되기 때문이다. 이는 '스케줄링' 파트에서 자세하게 다루니 우선 패스하자. 

 

 

 

그러면 이제 프로세스의 상태와 각 상태가 무엇을 의미하는지 알아보자.

 

프로세스의 상태

  • new: PCB가 생성되었으나, 메모리를 아직 할당받지 못한 상태
  • ready: CPU 할당받을 수 있는 자격을 가진 프로세스. 즉, 메모리를 할당받음. 큐 자료구조 사용.
  • running: 실제 CPU를 사용하고 있는 프로세스
  • waiting: ready 큐에 들어가지 못하고 기다림
  • terminated: 프로세스 종료

 

일상 생활에서 프로세스의 상태와 아주 유사한 예시가 있다. 우리가 병원에서 진료를 받는 과정을 통해 프로세스의 상태를 이해해보자. 병원에서 CPU는 의사에 대응된다. 의사는 한 명의 환자만 볼 수 있다. 멀티 진료가 가능하다고 우긴다면 할 말 없다.

 

  • new: 아직 번호표를 뽑지 않은 환자
  • ready: 번호표를 뽑고 대기 중인 환자
  • running: 의사에게 진료를 받고 있는 환자
  • waiting: x-ray 찍으러 잠시 의사 곁은 떠난 환지
  • terminated: 약 처방받고 집으로 가는 환자

 

여기서 waiting을 잘 이해해야 한다. 병원에서 의사와 간호사의 역할은 정해져 있다. 컴퓨터도 마찬가지다. CPU가 하는 일과 다른 디바이스가 하는 일은 정해져 있다. CPU가 프린트를 할 수는 없지 않은가? 이렇게 CPU 곁을 떠나 잠시 다른 일을 하러 간 프로세스의 상태를 'waiting'이라고 하며 이를 'blocked'된 상태라고도 한다. 

 

 

 

 

프로세스가 A가 running 상태로 바뀐다는 것은 CPU에 있던 프로세스를 밀어내고 자기가 쓰겠다는 뜻이다. 여기서 '프로세스가 CPU를 쓴다는 것'의 의미를 생각해보자. CPU는 연산 장치에 불과하다. 다른 프로세스가 들어왔다고 해서 '아, 프로세스 A가 들어왔네'라고 판단하지 않는다. 즉, '나는 프로세스 A야'라는 정보는 프로세스가 CPU에게 알려줘야 한다. 좀 더 정확하게 말하면, 컴퓨터 언어는 이진수이기 때문에 프로세스가 CPU에게 '나는 프로세스 A야'라는 정보를 담은 코드를 CPU에게 전달하면 된다. 

 

프로세스가 CPU에게 전달하는 정보는 PC와 Register가 있다. Register는 CPU가 처리하던 코드로 이해하면 되고, PC는 처리하던 코드에서 다음에 실행할 주소로 이해하면 된다. 생각해보면 당연하고 간단하다. 아래 예시를 통해 이해해보자.

 

의사가 A 환자를 진료하고 있다고 가정해보자. A 환자는 한 번의 진료로 끝나지 않아 다음에 다시 병원에 방문하기로 했다. 의사는 환자에게 진료 기록과 어디까지 진행했는지를 환자에게 알려주고 다음에 진료할 때 이를 들고오라고 당부했다. 즉, 다음에 방문할 때 '이 진료 기록의 6번째 줄부터 이어서 하시면 돼요'와 같이 말하면 되는 것이다. 여기서 진료 기록이 Register에 대응하고, 6번째 줄이 PC에 대응한다.

 

크게 어렵지 않은 개념이라 이해가 될 것이라고 생각한다. 이렇게 프로세스가 CPU에게 자신의 Register와 PC를 전달하는 과정을 'Context Switch'라고 한다. 그림으로 보면 아래와 같다.

 

Context Switch 과정

그러면 context switch를 하는 동안 CPU는 어떤 일을 할까? 정답은 '아무 일도 안 한다'이다. 위 그림에서 'idle'의 의미는 CPU가 놀고 있다는 뜻이다. 따라서 프로세스를 너무 자주 바꾸면, 즉 context switch를 너무 많이 하면 오버헤드가 발생하기 때문에 성능이 오히려 더 떨어지게 된다. 

 

반응형