개발자 공부하기/운영체제

[운영체제] 프로세스의 개념 정복하기

스윗 앨리스 2020. 9. 26. 13:27
프로세스란?

메모리에 적재되어 CPU에서 실행중인 프로그램을 말한다.

* CPU (Central Processing Unit) : 컴퓨터에서 기억, 해석, 연산, 제어라는 4대 기능을 종합하는 중앙처리장치

 

 

프로세스의 구성 요소

1. 컴파일된 프로그램 코드 

텍스트 섹션에 저장된다.

 

2. 프로그램 카운터  (PC)

다음에 실행될 명령어의 주소를 가지고 있어 실행될 기계어 코드의 위치를 저장한다.

즉, 다음에 실행될 명령어 포인터라고 할 수 있다.

 

3. CPU 레지스터 내용

 

4. 프로세스 Stack

함수에서 사용되는 데이터 정보를 저장한다.

즉, 함수 매개변수(Parameter), 함수 내부에서 사용되는 지역변수, 복귀 주소 (return addresss)가 저장된다.

함수 호출이 완료되면 메모리 해제된다.

 

5. 데이터 섹션 

전역변수나 정적변수(static 변수) 가 저장된다.

프로그램 시작 시 동시 할당되고, 종료 시 해제 된다.

 

6.  힙(Heap) 

개발자가 필요에 의해 동적으로 할당하는 메모리

할당해야할 메모리를 런타임에 결정할 수 있는 경우, 유용하게 사용된다.

 

위 그림에서 볼 수 있는 것처럼,

텍스트 섹션은 가장 아래에 있고, 그 위에 데이터 섹션, heap 영역, Stack 영역이다.

 

화살표 방향의 의미는,

Heap 영역은 아래에서 위 방향으로 데이터를 저장해나가고, Stack은 맨위부터 아래방향으로 데이터 저장해 나간다는 뜻이다.

 

 

프로세스 상태 (Process State)

1. New : 프로세스가 생성되는 중

2. Running : CPU에서 명령이 실행되는 중

3. Waiting : 프로세스가 어떤 event(입출력 완료, signal 수신)가 발생하기를 기다리는 중

4. Ready : 프로세스가 CPU에 할당되어 실행되기를 기다리는 중

5. Terminated : 프로세스 실행 종료

 

그 다음을 이해하기 위해 아래 내용을 반드시 숙지해야 한다.

컴퓨터 하드웨어인 CPU는 여러개의 프로세스를 동시에 실행할 수 없다.
언제나 한순간에 오직 1개의 프로세스를 수행한다.
다만, 운영체제의 멀티태스킹(Multi tasking)과 스케줄링 기법으로 여러개의 프로세스가 동시에 실행되는 것처럼 보일뿐이다. 

 

때문에 우리는 일반적인 운영체제에서 프로세스 상태와 변화를 이해해야 한다.

프로세스의 상태 변화

1. new -> ready -> running

프로세스가 생성(New)되면, 바로 Running 상태로 가는 것이 아니라 Ready 상태에 있다.

여러개의 프로세스들은 대부분 Ready 상태에 있고, 운영체제의 스케줄링 기법에 따라 그 중 단 1개만 Running 으로 바뀔 수 있다.

Running 상태가 되면 실제 CPU를 이용해서 자기가 하고자하는 일을 수행한다.

 

*운영체제 스케줄러(Scheduler)란?

여러개의 프로그램을 동시에 실행되는 것처럼 보이게 하기 위해 어떤 규칙을 부여하는 것.

 

2. running -> waiting -> ready

Running 상태에 있는 프로세스는 계속 실행되는 것이 아니라 어떤 조건이 만족되면 상태가 변경된다.

예를 들어 scanf, read, printf 등 외부장치에 대해 입출력을 요구했을 때이다.

이 작업은 굉장히 느리기 때문에 CPU는 무작정 기다리는 것이 아니라 상태를 Waiting 으로 바꾸게 된다.

Waiting이 끝나는 시점은 I/O 이벤트 완료 인터럽트가 발생될 때이다.

이 인터럽트가 발생되면 다시 Ready 상태가 되어 다시 스케줄러에 의한 실행을 기다리게 된다.

 

3. running -> exit

Running 상태에 있던 프로세스의 종료를 의미한다.

 

4. running -> ready -> running -> ready -> running -> ready .... 

1ms ~ 10ms 마다 타이머 인터럽트가 발생하여 운영체제는 현재 실행중인 프로세스를 강제로 중지를 시킨 뒤 Ready 상태로 빼놓는다.

그리고 Ready 상태에 있는 다른 프로세스를 실행 시킨다. 이 과정은 매우 빠르게 상태 변화를 일으키며 반복되기 때문에 마치 여러개의 프로세스가 1개의 CPU를 가지고 동시에 실행되는 것처럼 보인다. 

=> 이를 통해 운영체제는 멀태태스킹 멀티프로세싱을 달성하게 된다.

 

 

프로세스 제어 블록 (Process Control Block, PCB)

프로세스의 실행을 제어하는데 사용하기 위한 자료구조

하나의 프로세스마다 한개의 이 자료구조가 만들어진다.

 

1. 프로세스 상태

2. 프로그램 카운터  (PC)

3. CPU 스케줄링 정보

4. 메모리 관리 정보

5. 회계 정보

6. 입출력 상태  (I/O status 정보)

 

운영체제는 프로세스가 관리 되기 위해 필요한 정보(PCB) 를 커널 영역에 저장하고 있다.

때문에 프로세스의 상태가 계속 변하더라도 PCB를 이용해 해당 프로세스가 연속성 있게 실행되는 것처럼 보인다.

 

 

Context Switch (문맥 교환)

쉽게 말해서 프로세스 교환을 의미한다.

프로세스 문맥(Context)이란 프로세스 제어를 위한 정보(PCB)를 의미한다.

 

스케줄러가 CPU에 다른 프로세스를 할당하려고 할 때, 현재 프로세스의 Context를 PCB에 저장하고, 

새로운 프로세스의 PCB로 교체한다.

 

* 문맥 교환 비용 (Overhead)

 

문맥교환이 빨라지면 동시에 많은 프로그램을 실행할 수 있는 장점이 있지만,

CPU 입장에서는 많은 메모리를 읽고, 저장하는 시간이 필요하게 된다.

이러한 PCB의 저장과 복구 과정이 일어나는 동안 프로세스의 유효한 동작은 중지된다.

즉, 프로그램의 순수한 사용 시간 외에 문맥교환을 위한 시간이 발생하게 된다. (overhead)

 

때문에 문맥교환의 비용을 적게 하면서 프로세스를 많이 실행하는 것이 최적화에 중요한 요소이다.

 

CPU의 프로세스 교체

프로세스 P0에서 P1으로 교체될 때의 모습을 도식화한 것이다. 

세로 축은 시간을 의미한다.

 

P0의 Context가 PCB에 저장되고, P1의 PCB에서 Context가 로드되어 CPU나 필요한 메모리 공간에 올라가게 된다.

PCB의 저장과 복구 과정에서 idle이 발생(overhead)하게 되고, 이 시간 동안 P1의 유효한 동작은 중지된다.

 

그림에서 볼 수 있는 것처럼 두 프로세스의 실행이 겹치는 순간은 없다. 

1개의 CPU는 1개의 프로세스만 실행할 수 있기 때문에.