본문 바로가기

운영체제

[운영체제] 프로세스(Process)란 무엇일까?

728x90
반응형

본 글의 일부분은 서적 'Operating Systems: Three Easy Pieces by Remzi H.Arpaci-Dusseau, Andrea C.Arpaci-Dusseau' 내의 이미지와 내용을 포함하고 있습니다 :)

 

 

 

 

프로세스의 정의

 

프로세스는 '실행중인 프로그램'을 의미합니다.

프로그램은 디스크에 저장 공간만 있으면 되지만, 프로세스는 실행되기 위해 별도의 메모리 공간(실행 코드, 전역변수, 스택, 힙 ... )이 필요합니다.

 

따라서 프로세스는 기본적으로 code(Text), Data, Stack, Heap을 저장하기 위한 Memory(address space)와

Program counter (PC), Stack pointer을 저장하기 위한 Register가 필요합니다.

 

 

 

 

프로세스의 생성

 

프로세스는 다음의 단계를 거쳐 생성됩니다.

 

1.

디스크에서 프로그램의 코드를 가져와 프로세스의 address space에 넣어주는 단계입니다. 프로그램은 항상 디스크에서 실행 가능한 형식으로 저장되어있습니다.

이 때, OS는 내가 프로그램을 실행하기 위해서 클릭 할 때에 관련된 실행 파일 전체를 가져오는 것이 아니고, 필요할 때 하나씩만 들고오는 lazy 한 loading 방식을 갖고 있습니다.

 

2.

지역변수와 함수 인자, return address를 저장하기 위한 run-time stack이 할당됩니다. 또한, 스택을 main()의 argc와 argv의 인자로 초기화시켜주는 작업을 하게 됩니다.

 

3.

프로그램의 heap이 생성됩니다. 동적으로 필요한 공간을 할당하기 위해 사용되며, malloc()을 이용해서 heap 공간에 필요한 만큼 할당받고, free()를 이용하여 해제할 수 있습니다.

 

더보기

동적으로 공간을 할당한다는 것은 실행 도중에 할당됨을 의미합니다.

반대로 정적으로 공간을 할당한다는 것은 컴파일 도중에 할당된다는 것을 의미합니다.

 

4.

OS가 초기화 작업을 하는 단계입니다. Standard input, ouput, error (기본적으로 항상 존재) 라는 파일 descriptor을 갖고 있도록 I/O를 setup합니다.

 

5.

main()이라는 진입점에서 프로그램을 시작함과 동시에 새로 생성된 프로세스에게 CPU 권한을 넘겨주게 됩니다.

 

code와 data는 디스크에서 메모리로 복사해와서 사용합니다.

 

 

위의 5단계를 거침으로써 프로세스가 새로 생성되며, 자신만의 생명을 갖게 됩니다.

 

 

 

 

프로세스의 State

 

프로세스는 기본적으로 아래와 같이 3가지 상태를 갖고 있습니다.

 

 

- Running

CPU를 할당받아 코드를 실행 중인 상태입니다. 무한하게 사용하는 것이 아니라, time slice 동안만 CPU를 사용할 수 있고, 그 이후에는 다른 프로세스를 위해서 CPU를 반납해야 합니다.

 

- Ready

코드를 실행시키려 하지만, 아직 OS의 선택을 받지 못해서 대기 중인 상태입니다.

 

- Blocked (waiting, sleep)

I/O(file을 읽거나 쓰거나 등 ...)와 같은 연산을 하는 중이라 현재 CPU가 필요 없는 상태입니다.

 

 

 

프로세스의 아래와 같은 흐름으로 상태가 변하게 됩니다.

 

 

 

 

 

PCB(Process Control Block)

 

OS는 자료 구조를 이용하여 수행 중인 레지스터 값을 저장(Register context)하거나, ready, blocked, current running 중인 프로세스의 정보들을 저장한 process list 등, 프로세스와 관련된 정보들을 저장합니다.

뿐만 아니라, 각 프로세스에 대한 정보를 저장하는 자료구조가 있는데, 그것이 바로 PCB(Process Control Block)입니다.

 

PCB에는 CPU register 값이나, pid, ppid 와 같은 프로세스를 설명하기 위한 정보들이 저장되어 있습니다.

즉, 프로세스가 일하다가 CPU의 권한을 빼았겼을 때에, 후에 다시 CPU의 권한을 받았을 때에 이어서 일을 처리하기 위해서 필요한 정보를 저장하는 곳이 PCB라고 할 수 있습니다.

PCB의 예시로는 Linux의 task_sturct를 들 수 있습니다.

 

 

 

 

Context Switch

 

Context Switch는 굉장히 중요하게 다뤄지고 있는 개념인데요,

이는 CPU가 다른 프로세스로 switch 하고자 할 때에, 현재 수행중인 프로세스의 정보는 다른 곳에 저장하고, 이제 수행하기 시작할 프로세스의 정보는 가져오는 것을 의미합니다.

 

그러나 이러한 Context switch 시간동안에 System이 유용한 일을 하지 않기 때문에 overhead라고 말할 수 있습니다.

즉, 프로세스 코드를 실행하는 데에 걸리는 시간이 아니라, 그저 운영체제가 중간에 끼어들어 데이터를 교환하는 데에 걸리는 시간이기 때문이죠.

 

이러한 context switch를 하는 데에 걸리는 시간은, 하드웨어(register set)에 따라서 달라지게 됩니다.

 

 

728x90
반응형