2 분 소요

Chapter 03 : 프로세스와 스레드


01. 프로세스의 개념

초기 컴퓨터는 1개의 컴퓨터에 하나의 프로그램이 동작하는 형태의 구조를 가지고있었다. 실행중인 프로그램이 컴퓨터의 모든 자원을 독점하는 이 구조는 불합리하였고, 이를 개선한 다중 프로그래밍 환경에 운영이 가능한 폰 노이만의 하버드 아키텍처(Harvard architecture) 를 채용함으로서 메모리에 여러 프로그램을 적재하는 방식의 컴퓨터 운영방식이 도래하였다.

이에 따라 병행 되는 프로그램들은 컴퓨터의 CPU의 사용권한을 점유하는데 있어 상호 약속이 필요하게 되었다. 컴퓨터가 메모리에서 ALU / CU 와 같은 심층부에 접근 할때, 메모리 자원의 동시 점유 는 컴퓨터의 크리티컬한 동작을 유발시 킬 수 있기 때문에 이를 시기적절한 타이밍과 메모리 적재 여부를 조절하기 위해 ‘프로세스(Process)’ 라는 개념이 도입되었다.

프로세스는 하기와 같이 정의 된다.

  • 실행중인 프로그램
  • 비동기적 행위
  • 실행 중인 프로시저
  • 실행 중인 프로시저의 추적
  • 운영체제에 들어있는 프로세스 제어 블록
  • 프로세서에 할당하여 실행 할 수 있는 개체가 가능한 대상

그중에서 가장 이해하기 쉬운 용어는 ‘실행중인 프로그램’ 이다.

흔히 프로그램이라 함은 ‘정적’인 상태를 의미한다. 컴파일한 코드와 초기화 전역변수, 문자열과 문자열 상수 등 정적 데이터를 포함한 포괄적인 용어로 실제 운영되는 프로그램은 우리가 ‘프로세스’ 라고 부르는 것이 옳다.

아무쪼록 이 프로세스라는 개념을 도입한 것은 바로, 메모리 라는 녀석 때문이다. 자료구조라는 학문에서는 얼마나 빠른 시간에 메모리에 적재된 데이터를 CRUD 하는 가에 초점이 맞춰져있다고 한다면, 운영체제 학문에서는 메모리를 기준으로 프로세스가 어떻게 적절하게 치고 빠지는 가? 메모리 자원은 얼마나 소비하나? 하는 방법에 대해서 서술 하고있다. 이를 위해서는 일단 메모리 내의 프로세스가 어떤 구조로 어떻게 활용되고 있는지를 확인 할 필요가 있다.

Relation

메모리는 크게 스택(Stack),힙(Heap),데이터(Data),코드(Code)로 구성되어있다.
각 개념은 아래 와 같다.

영역 설명
Stack 데이터를 일시적으로 저장하는 영역, 힙과 인접한 방향으로 데이터를 올려감
Heap 동적으로 메모리를 할당하고 해제할 수있음, 할당된 메모리영역은 위쪽으로 커져감
Data 프로그램의 가상 주소공간, 주로 전역변수나 정적변수를 저장하거나 할당하고 실행하기전에 초기화 함
Code 실행 영역을 포함하는 메모리이거나 목적파일에 있는 프로그램 영역

프로세스는 수행하는 역할에 따라 시스템(커널) 프로세스와 사용자 프로세스로 구분하고, 병행 수행 방법에 따라 독립 프로세스와 협력 프로세스로 구분해서 동작한다.

구분 종류 설명
역할 시스템(커널) 프로세스 모든 시스템 메모리와 프로세서의 명령에 엑세스 할 수 있는 프로세스. 프로세스 실행 순서를 제어하거나 다른 사용자 및 커널 영역을 침범하지 못하게 감시하고, 사용자 프로세스를 생성하는 기능을 함.
역할 사용자 프로세스 사용자 코드를 수행하는 프로세스
병행 수행 방법 독립 프로세스 다른 프로세스에 영향을 주지 않거나 다른 프로세스의 영향을 받지 않으면서 수행하는 병행 프로세스
병행 수행 방법 협력 프로세스 다른 프로세스에 영향을 주거나 다른 프로세스에서 영향을 받는 병행프로세스

이렇게 OS안에서는 많은 종류의 프로세서가 동시에 실행되고 있으며, 이 프로세서들은 앞서 언급된 내용에 의거 메모리 자원 점유권 을 두고 치열하게 공방을 펼치고있다.

그리고 이러한 프로세스들의 통제권은 지금 프로그램을 설계할 당신 에 설계에 의해 질서 정연하게 움직일 것이다. 이를 위해선 OS 내에서도 나름의 규칙이 있어야 할 것이다. 이를 위해 우리는 프로그램의 총책인 당신에게 프로세스들의 제어권을 줄것이다.

우리는 이러한 제어권을 가진 장부의 프로세스를 PCB(Process Control Block) 이라고 부르며, 이 안에는 특정 프로세스의 정보를 저장해 관리한다. 각 프로세스들은 각자의 상태를 저장한다. 나는 ‘준비’,’대기’,’실행’ 등의 Status를 가지고 있으며, 각 상태들은 전환되는 시점에 따라 ‘dispatch’,’timeout’,’block’,’wakeup’ 등의 용어로 상태전환을 나름의 용어로 불러주고 있다.

이러한 프로세스 컨트롤 블럭에는 프로세스를 구분하는 각기 다른 정보를 내포하고있다.

1.프로세스 식별자
2.프로세스 상태
3.프로그램 카운터
4.레지스터 저장 영역
5.프로세서 스케줄링 정보
6.계정 정보
7.입출력 상태 정보
8.메모리 관리 정보
....