[운영체제] 프로세스 관리

조민서·2022년 1월 5일
2

운영체제

목록 보기
6/10

1. 프로세스 (Process)

프로세스는 메인 메모리에 할당되어 실행중인 상태인 프로그램을 말한다. 프로그램은 일반적으로 하드디스크(보조기억장치)에 저장되어 아무 일도 하지 않는 상태이다. 프로세스는 실행하면서 stack pointer, data, text, register 등이 끊임없이 변한다. 프로세스는 job, task 등으로 불리기도 한다.


1.1. 프로세스 상태

New: 프로그램이 메인 메모리에 할당된다.
Ready: 할당된 프로그램이 초기화와 같은 작업을 통해 실행되기 위한 모든 준비를 마친다.
Running: CPU가 해당 프로세스를 실행한다.
Waiting: 프로세스가 끝나지 않은 시점에서 I/O로 인해 CPU를 사용하지 않고 다른 작업을 한다. (해당 작업이 끝나면 다시 CPU에 의해 실행되기 위해 ready 상태로 돌아가야 한다.)
Terminated: 프로세스가 완전히 종료된다.

위 그림은 프로세스 상태 전이도의 모습이다. running에서 ready로 변할 때는 time sharing system에서 해당 프로세스가 CPU시간을 모두 소진하였을 때 인터럽트에 의해 강제로 ready상태로 변하고, CPU는 다른 프로세스를 실행시킨다.


1.2. PCB (Process Control Block)

PCB는 프로세스에 대한 모든 정보가 모여있는 곳으로, Task Control Block(TCB) 이라고도 한다. PCB안에는 프로세스의 상태, 프로세스 번호(PID), 해당 프로세스의 program counter(pc), register값, MMU정보, CPU점유 시간 등이 포함되어 있다. PCB는 운영체제 내부의 프로세스를 관리하는 코드 부분에 저장되어 있다.

CPU는 한 프로세스가 종료될 때까지 수행하는 것이 아니라 여러 프로세스를 중간 중간에 바꿔가면서 수행한다. 그러므로 CPU는 수행중인 프로세스를 나갈 때, 이 프로세스의 정보를 어딘가에 저장하고 있어야 다음에 이 프로세스를 수행할 때 이전에 수행한 그 다음부터 이어서 작업할 수 있다. 이러한 정보를 저장하는 곳이 PCB이다.


1.3. 프로세스 큐(Queue)

프로세스는 수행하면서 상태가 여러 번 변하는데 이에 따라 서비스를 받아야하는 곳이 다르다. 그리고 프로세스는 일반적으로 여러 개가 한 번에 수행되므로 그에 따른 순서가 필요하다. 이러한 순서를 대기하는 곳을 큐(queue)라고 부른다.

  • Job Queue: 하드디스크에 있는 프로그램이 실행되기 위해 메인 메모리의 할당 순서를 기다리는 큐이다.
  • Ready Queue: CPU 점유 순서를 기다리는 큐이다.
  • Device Queue: I/O를 하기 위한 여러 장치가 있는데, 각 장치를 기다리는 큐가 각각 존재한다.

위와 같이 여러 큐가 존재하는데, 각 큐 내부에 저장된 실제 데이터는 각 프로세스의 PCB가 저장되어 있다. 그리고 이러한 순서를 기다리는 공간이 있다면 이 순서를 정해주는 알고리즘이 있어야 한다. 이러한 알고리즘을 스케줄링(Scheduling)이라 한다.


1.4. 프로세스 스케줄링

Job Scheduler(Long-term scheduler, 장기 스케줄러)

Job Queue는 메모리에 올라가고자 하는 프로그램들이 줄을 서는 대기열이다. 이 프로그램들 중 어떤 것을 먼저 메모리에 올릴지 결정하는 프로그램을 Job scheduler라고 한다. 한번 올라간 녀석들은 메모리에 꽤 오래 머무르기에, 상대적으로 스케줄링 빈도가 뜸하다 하여 Job scheduler를 Long-term scheduler라고 한다.


CPU Scheduler(Short-term scheduler, 단기 스케줄러)

Ready Queue는 CPU 서비스를 받고자 하는 프로세스들이 줄을 서는 대기열이다. 이 프로세스들 중 어떤 것에 먼저 CPU를 할당할지 결정하는 프로그램을 CPU scheduler라고 한다. CPU 스위칭은 짧은 시간 동안 많이 일어나기에, 상대적으로 스케줄링 빈도가 잦다 하여 CPU scheduler를 Short-term scheduler 라고 한다.

CPU scheduling은 말 그대로 프로세스가 CPU를 점유하는 순서를 정해주는데 이는 매우 빠른 시간안에 이루어져야한다. 현대 컴퓨터가 여러 프로그램을 동시에 사용하는 것과 같은 효과를 주는 이유가 이 스케줄링 속도가 매우 빠르게 이루어지기 때문이다.


Device Scheduler

Device Queue는 I/O 서비스를 받고자 하는 프로세스들이 줄을 서는 대기열이다. 이 프로세스들 중 어떤 것에 먼저 I/O 자원을 할당할지 결정하는 프로그램을 Device scheduler라고 한다. 사실 세부적으로 보자면 Print scheduler, Disk scheduler등 따로 있지만, 이들을 통칭하여 Device scheduler라고 한다.


1.5. 프로세스 종류

프로세스의 종류는 크게 두 가지로 나뉠 수 있다.

  • I/O Bound: 프로세스가 하는 일에 주로 I/O가 사용됨. (ex. 워드프로세서와 같은 문서 작업)

  • CPU Bound: 프로세스가 하는 일에 주로 CPU가 사용됨. (ex. 게임, 일기예보 시스템)

메모리에 너무 I/O Bound 프로세스만 올라오면 CPU가 놀고, 반대로 CPU Bound 프로세스만 올라오면 I/O가 놀기 때문에, 두 가지 종류의 프로세스들을 적절히 섞어서 올려주는 Job Scheduler의 역할이 중요하다.


2. 멀티프로그래밍(Multiprogramming)

멀티프로그래밍은 단일 프로세서(CPU) 환경에서 여러 개의 프로세스가 동시에 실행되는 것을 말한다.(실제로 동시에 실행되지는 않음) 여러 프로세스가 실행되려면 이 프로세스들은 모두 메인 메모리에 존재하고 있어야 한다. 멀티프로그래밍에 관한 몇 가지 용어와 개념에 대해 살펴보자.

2.1. Degree of multiprogramming

Degree of multiprogramming 는 현재 메모리에 할당되어 있는 프로세스 개수를 말한다.


2.2 Swapping(스와핑)

운영체제는 swapping이라는 작업을 통해 degree of multiprogramming(메모리에 올라가있는 프로세스의 개수)를 줄인다.

대략의 swapping 작업 내용은 다음과 같다.

  • swap out: PCB로 프로세스의 상태를 확인한 뒤, 만약 사용자가 다른 일을 하느라 해당 프로세스를 사용하고 있지 않다면, 운영체제는 swap disk(=backing store)로 해당 프로세스를 쫓아내어 메모리 공간을 확보한다.

  • swap in: 그 후 사용자가 돌아오면 쫓아냈던 프로세스를 다시 메모리에 들인다. 프로세스가 다시 메모리에 들어올 땐 꼭 똑같은 자리로 돌아가는 것이 아니라, 그때그때 비어있는 아무 자리에 들어가게 된다.


2.3. Medium-term scheduler

Medium-term scheduler는 말그대로 short-term보다는 덜 발생하지만, long-term보다는 자주 발생하는 scheduler이다. 하는 일은 운영체제가 실행하는 동안 주기적으로 메인 메모리에 있는 전체 프로세스를 검사하여 보조기억장치로 옮길 프로세스를 찾아 옮긴다. 옮기는 기준은 여러가지 있겠지만 대표적으로 장기간 사용하지 않는 프로세스가 있다.

이 기준으로 동작하는 것이 Swapping이다. 이는 메인 메모리에서 장시간 사용하지 않는 프로세스를 하드디스크(Swap device = Backing store, 일반적으로 하드디스크는 File system + Backing store 로 구성되어 있다.)로 옮겨주고(Swap out), 나중에 이 프로세스가 다시 사용되려고 하면 하드디스크에서 해당 프로세스를 다시 메인 메모리에 할당해준다.(Swap in)

Swap out을 통해 메인 메모리의 공간이 생기므로 이를 더욱 효율적으로 사용할 수 있다. 만약 swap out된 프로세스가 다시 swap in으로 메인 메모리에 할당하려고 할 때 이전의 공간으로 할당되는 것을 보장하지는 않는다. 왜냐하면 위에 말했듯이 swap out으로 생긴 메모리 공간은 다른 프로세스가 사용할 수 있기 때문이다.


2.4. Context Switching(문맥 전환)

Context switching은 CPU가 한 프로세스에서 다른 프로세스로 옮겨가는 것을 말한다. 즉, 한 프로세스가 실행중인 것을 멈추고 다른 프로세스가 실행되는 것이다.

Scheduler: 여기서 스케줄러는 CPU Scheduler를 말하며, CPU가 어느 프로세스를 선택할지 정한다.

Dispatcher: 실제 context switching이 발생하면 CPU의 내부 데이터를 이전 프로세스 데이터에서 새로 시작되는 데이터로 바꿔준다. 다시 말해서 현재 CPU 데이터는 이전 프로세스의 PCB에 갱신하고, 새로 시작되는 프로세스의 PCB 데이터를 CPU로 복원(restore) 해준다.

Context switching overhead: Context switching이 발생할 때마다, dispatcher에서 수행하는 작업을 매번 수행해야하며 이 모든 것은 overhead이다. 그리고 문맥 전환은 매우 자주 발생하는 작업이므로 overhead를 줄이기 위해서는 dispatcher를 구현하는 코드에 대한 효율을 최대한 높여주어야한다.

profile
내 두뇌는 휘발성 메모리다. 😪

0개의 댓글