영벨롭 개발 일지

[운영체제][OS]프로세스 Process란? 본문

CS/운영체제

[운영체제][OS]프로세스 Process란?

영벨롭 2022. 3. 4. 17:38

 이전 글에서 운영체제에 대해 간단히 살펴보았는데요!

 

 언급한 개념 중, Virtualization이 있었습니다. 

 

 OS가 physical resource들(CPU, memory, disk, ...)을 가상화하여 각 program마다 자신만의 resource를 갖고 있다는 illusion을 제공합니다!

 

 

  • 어떻게 CPU가 여러개라는 착각을 제공할까?

 

 OS는 CPU virtualizing(가상화)를 통해 여러 개의 가상 CPU가 존재하는 것과 같은 착각을 제공하는데요.

 

 이때, OS는 TIme Sharing을 통해 CPU virtualizing을 합니다. 

 

 Time Sharing이란 CPU 관점에서 time quantum마다 하나의 프로세스가 CPU를 점유해서 사용하는 것입니다. 말 그 대로 시간을 분할하여 마치 자신의 CPU를 갖고 있는 것처럼 실행합니다. 

 

 즉, 하나의 프로세스가 실행 중일땐 다른 프로세스들은 실행을 멈추고 기다리는 것입니다. 

 

프로세스: p1, p2

time t1 t2 t3 t4 ...        
running 
process
p1 p2 p1 p2 ...        

 

 이때의 단점은 무엇일까요?

 

 바로 성능 감소의 가능성이 있다는 것인데요. 반복적으로 running process를 변경하게 되면 time context overhead가 발생하게 됩니다. 

 

 time quantum이 길어질수록 context switching 횟수는 줄어들지만 응답시간은 길어집니다.

 반대로 time quantum이 짧아질수록 context switching 횟수는 증가하겠지만 응답시간은 짧아지지겠죠?

 

 

 

 

 

  • Process란?

 

 그렇다면 위에서 말하는 프로세스(process)란 대체 무엇일까요?

 

 프로세스(process)란 running program 즉, 컴퓨터에서 실행되고 있는 프로그램을 의미합니다. 

 

 그럼 대체 프로세스와 프로그램이 차이가 무엇이냐?

 

 .exe 라는 실행 파일 많이 보셨죠? 이것이 바로 프로그램(program)입니다! 파일 시스템에 존재하는 실행 파일입니다. 

 

 프로세스(process)는 이 프로그램을 실행 시켜주는 실행 주체, 즉 인스턴스라고 할 수 있습니다. 

 

 

 [프로세스는 구성 요소]

 

1. Memory(address space) : instructions, data section, ...

 

2. Registers : PC(Program Counter), Stack pointer, ...

 

 

 

  • 프로세스 생성, Process Creation

 

 프로세스는 어떻게 생성될까요? 차례대로 살펴봅시다. 

 

 이때 기억해야할 것은 이 모든 것은 OS가 해준다는 거에요! 

 

1. Loading : disk에 있는 program code를 memory(process의 address space)로 올리기

 

 Program은 초기에 실행가능한 형태로 disk에 위치해 있습니다. 

 

 Modern OS는 program 실행동안 code 또는 data 영역에서 필요할 때만 골라 로딩합니다. 이것을 lazily하게 프로세스를 로딩한다고 말합니다.

 

 

2.  메모리 공간 할당 : program의 run-time stack & heap

 

  우선 stack과 heap의 역할을 살펴볼까요?

 

 stacklocal variables, function parameters, return address를 위해 사용합니다. 

 heap동적으로 할당된 data를 위해 사용됩니다. 

 

 프로세스가 Loading되고 나면 run-time stack을 할당하여  main() 함수의 argument인 argc와 argv로 stack을 초기화합니다. 

 

 이후, malloc()이나 free()가 호출되면 프로그램이 heap 영역에 공간을 요청하는 것입니다. 

 

 

3. 다른 초기화 작업 수행

 

 대표적인 초기화 작업에는 I/O(Input/Output) setup이 있습니다. 

 

 각 프로세스는 기본적으로 STDIN, STDOUT, STDERROR 세가지 file descriptor들을 가집니다. 

(file descriptor에 대한 이야기는 나중에 살펴보아요 ㅎㅎ)

 

 

4. Program 시작!

 

 OS는 CPU 통제권을 새로 생성된 process에게 넘기고, entry point라고 불리는 main() 함수에서 프로그램 실행을 시작합니다. 

 

 

 

 

  • 프로세스 상태, Process States

 

 프로세스는 특정 시간에 세 가지 상태 중 한 가지 상태를 갖습니다. 

 

 Running, Ready, Blocked인데요 하나씩 살펴보겠습니다. 

 

 

1. Running

 

 말 그대로 프로세스가 프로세서(CPU)에서 실행되고 있는 상태입니다. 

 

 특정 시간에 하나의 process만 running 상태에 있을 수 있습니다. 

 

 

2. Ready

 

 time sharing에서 언급했듯이 특정 시간엔 하나의 process만 실행될 수 있는데요. 그럼 다른 process들은 어떻게 해야될까요? 

 

 현재 process가 끝날 때까지 기다려야겠죠! Running 상태와 달리 ready 상태에는 여러 프로세스가 있을 수 있습니다. 여러 개의 프로세스 중, 다음 실행할 프로세스는 scheduling을 통해 결정됩니다. 

 

 실행되기를 기다리는 process의 상태를 ready상태라고 합니다. 

 

 

3. Blocked

 

 Blocked 상태는 process가 특정 operation을 수행하고 있는 상태인데요.

 

 대표적으로 I/O operation을 수행하고 있습니다. 

 

 프로세스가 I/O request를 disk에 보내면, disk는 매우 느리기 때문에 그 프로세스는 blocked 상태가 됩니다. 

 

 이렇게 blocked 상태의 프로세스는 해당 operation을 마치게 되면 ready 상태로 돌아가게 됩니다. 

 

 

 

 

  • Data Structures

 

1. PCB (Process Control Block)

 

 PCB는 쉽게 말해 프로세스마다 가지고 있는 자료 구조입니다. 각 프로스세에 대한 정보를 포함하고 있는 C 스타일의 구조인데요.

 

 프로세스 메모리의 주소, 크기, 프로세스 상태 등등... 많은 정보가 요구되겠죠?

 

 프로세스의 상태를 정의하는 register들의 집합을 Register context라고 합니다. 

 

 

2. Process list

 

 각 상태에 어떤 프로세스들이 있는지도 기록해야겠죠?

 

 - Ready processes

 - Blocked processes

 - Current running processes

반응형