본문 바로가기
computer science/운영체제

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

by 박연호의 개발 블로그 2019. 2. 28.




위의 사진은 현재 저의 노트북(mac)에서 실행되고 있는 프로세스들 입니다.

블로그 글을 작성하면서 카카오톡에서 알람도 오고 동시에 Day-O라는 프로그램은 모니터 우측상단에 오늘이 몇일 인지를 보여주고 있네요. 또 현재 프로세스들을 스크린샷하기 위해 활성 상태보기 라는 앱을 실행 시켰는데, 이도 같이 보여지고 있습니다.  


정말 수많은 프로세스들이 현재 저의 노트북에서 실행되고 있습니다. 그렇다면, 이런 프로세스들이 도대체 무엇이고 어떻게 생겼는지 한번 알아 보겠습니다.




Process, 너는 무엇이니 ?

먼저 프로세스의 정의를 알기 전에, 프로그램에 대해 알아봅시다.

프로그램은 하드 디스크에 저장되어 있는 실행코드를 의미 합니다. 우리가 카카오톡을 설치하면 하드 디스크에 저장이 됩니다. 하지만 우리가 사용하지 않으면(실행하지 않으면) 이는 그냥 디스크에 존재하기만 하는것이죠. 하지만 우리가 카카오톡을 실행되면 이는 곧 프로세스가 되는것이죠.


프로세스란 디스크에 존재하는 프로그램이 메모리 상에서 실행되는 실행중인 프로그램을 의미합니다. 


그렇다면 프로세스는 어떻게 생겼을까 ?

먼저 프로세스에 대한 정보는 PCB(Process Control Block)에 저장되며, 프로세스가 생성될 때 같이 생성됩니다.  

여기서 PCB는  각각의 프로세스의 스케줄링하는데 필요한 정보들을 포함하는 운영체제커널의 자료구조 입니다. 

(아래의 설명은 위키피디아의 PCB의 정의에 따라 설명한 것입니다.)


Process Identification(PID)

운영체제에서 각각의 프로세스를 구별하기 위한 프로세스 식별번호입니다. 


프로그램 상태

프로세스의 상태를 나타내는데 생성,준비, 실행, 종료, 대기 상태가 있습니다. 

CPU는 프로세스를 빠른 속도로 교체 하면서 여러 프로세스를 실행하게 되는데, 이때 각각의 프로세스의 상태를 의미합니다.


프로그램 카운터

프로세스에서 실행될 다음 명령의 주소값을 가지고 있습니다. 

예를 들어 청소부라는 프로세스에서 현재 하고 있는 일이 설거지라면 다음 해야할 일(프로그램 카운터)는 분리수거가 됩니다(물론 분리수거를 하는 명령어가 들어있는 주소값이 되겠지만요)


CPU 레지스터

프로스세가 사용중인 레지스터를 의미합니다. 

accumulator, index register, stack pointer, general purpose registers등이 있습니다.


프로세스 권한

시스템자원에 대한 권한을 의미합니다. 


프로세스 권한

시스템자원에 대한 권한을 의미합니다. 


프로세스 구조에 대한 정보

자식 프로세스는 부모프로세스로 부터 복제되어 생성되는데 이때 자식프로세스에 대한 정보를 가지고 있습니다.


프로세스 구조에 대한 정보

자식 프로세스는 부모프로세스로 부터 복제되어 생성되는데 이떄 자식프로세스에 대한 정보를 가지고 있습니다.


프로세스간에 통신을 위한 정보

각각의 독립적인 프로세스간에 통신을 하는데 사용되는 다양한 플래그, 신호, 메세지 값들을 의미합니다.

 

I/O 상태정보

프로세스에 할당된 I/O 장치 리스트들을 의미한다.


Accounting Information

프로세스를 사용하는데에 있어 시간 제한 CPU사용 시간 등에 대한 정보를 의미합니다.


메모리 관리정보

운영체제에서 사용하는 메모리에 따라 페이지 테이블, 메모리 제한, 세그먼트 테이블의 정보를 의미합니다.



프로세스의 메모리 구조 ?

프로세스의 메모리구조는 크게 Text, Data, BSS, Heap, Stack 으로 구성됩니다.



Text

작성된 코드가 저장되는 영역입니다.


Data

프로그램이 실행될 떄 생성되고 프로그램이 종료되면서 시스템에 반환되며 전역변수, 정정변수, 배열, 구조체 등이 저장됩니다. 이때 초기화 된 데이터는 Data영역에 저장되고 초기화되지 않은 데이터는 BSS(Black Stated Symbol)에 저장됩니다. 함수 내부에서 선언된 Static변수는 프로그램이 실행될 때 공간만 할당되고 그 함수가 실행될 떄 초기화 됩니다.


BSS(Block Stated Symbol)

초기화 되지 되지 않은 데이터가 저장되는 공간입니다. 반대로 초기화된 데이터는 Data영역에 잡히게 됩니다.


Heap

메모리를 동적으로 생성할 경우 Heap메모리에 잡히게 됩니다. c언어의 경우 malloc함수를 사용하여 Heap에 동적으로 메모리를 생성할 수 있습니다.

힙은 낮은 주소 -> 높은 주소로 크기가 증가합니다. 


Stack

지역변수 할당과 함수 호출 시 전달되는 인자값, 리턴 어드레스를 저장하기 위한 공간입니다.

스택은 높은 주소 -> 낮은 주소로 크기가 증가합니다.


여기서 Text, Data, BSS영역의 크기는 컴파일 시점에 결정되고 Heap, Stack을 런타임 시점에 결정됩니다.

스택과 힙 사이에는 빈 공간이 있는데, 힙과 스택의 크기는 컴파일 시에는 알 수없기 때문에 빈공간으로 해두었습니다. 이후 스택과 힙의 크기그 변하게 되면 서로 마주보는 방향으로 크기가 증가하게 됩니다.