본문 바로가기

운영체제

프로세스에 관하여 알아보자

* 본 내용은 운영체제를 공부하며 추후 복습하기 위해 포스팅하는 게시물입니다.

 

프로세스란??

- 메모리를 할당받아 실행되고 있는 프로그램을 의미

- 프로그램의 모든 영역이 메모리에 올라가지 않음(Page 단위로 분할하여 필요한 부분만 메모리에 할당)

 

프로세스는 메모리를 할당받을 때 프로그램 내 주소를 논리적 주소로 변환한다. 즉 프로그램의 논리저 시작주소는 0이며CPU가 프로세스를 수행하기 위한 메모리 접근 시 이러한 논리적 주소를 레지스터와 하드웨어를 이용하여 메모리의 물리적 주소로 변환하여 접근한다.(가상 메모리 챕터에서 자세히 다룰 예정)

 

프로그램을 실행하면 다음과 같은 상태들을 나타낸다.

 

 

 

New : 프로세스를 생성중인 상태

Ready : Ready Queue에 존재하여 CPU를 할당받기를 기다리고 있는 상태(CPU만 할당받으면 프로세스 수행)

Run : 프로세스에게 CPU의 제어권이 할당받은 상태

Wait : 프로세스를 수행하는 중 I/O 관련 기능을 수행하기 위해 CPU의 제어권을 반환하고 I/O 관련 기능을 수행하고 있는 상태

Exit : 프로세스 수행이 완료된 상태

 

* 프로세스는 무한정 CPU를 사용할 수 없으며 할당된 시간을 소모했을 시 Timer(하드웨어)에 의해 인터럽트가 발생하여 CPU의 제어권을 반납해야한다.

 

여러 개의 프로그램을 동시에 메모리에 올릴 수 있기 때문에 메모리가 부족한 상황이 발생하기도 하며 가상메모리 기법으로 디스크의 영역 일부를 메모리처럼 사용한다.(Swap In/Out)

 

다음 그림은 Swap In/Out이 포함된 프로세스 상태도이다.

 

 

위에서 설명했다시피 프로세스는 무한정 CPU의 제어권을 가질 수 없기 때문에 CPU의 제어권을 반납한다.

반납된 프로세스의 상태는 Ready로 변경되며 CPU의 제어권을 얻기 위해 Ready Queue에서 대기한다.

Ready Queue에서 대기중인 프로세스가 디스패처에 의해 CPU의 제어권을 할당받는다면 이전 CPU의 제어권을 할당받았을 때 마지막으로 실행했었던 부분부터 다시 실행해야한다. 그러기위해서는 프로세스의 상태정보를 저장해야하며 상태정보를 저장하는 자료구조를 PCB(Process Control Block)라고 한다. 

 

 

PCB(Process Control Block)란?

- 프로세스 당 하나의 PCB를 가지고 있음- PCB는 프로세스 우선순위, 프로세스 아이디, 프로세스 상태, PC, RegisterSet, file 등으로 구성- 운영체제 Data 영역에 존재하는 자료구조

 

1) ProgramCounter : 다음 명령어를 실행하기 위한 메모리 주소를 의미2) 프로세스 우선순위 : CPU 스케줄링을 할 때 알고리즘에 따라 우선순위 값을 참고하여 스케줄링한다.3) 프로세스 아이디 : 프로세스를 식별하는 값을 의미4) 프로세스 상태 : 프로세스가 실행하고 있는지, 대기하고 있는지 프로세스의 현재 상태를 의미

 

PCB에 프로세스를 실행하기 위한 상태정보를 저장하고 PCB에 저장된 상태정보를 불러와 프로세스를 실행하는 과정을 Context Switch(문맥교환)라고 한다.

* Context Switch가 잦으면 성능이 저하되는 원인이 됨

 

더보기

Tip 기술면접에서 프로세스와 스레드의 차이를 물어보는 경우가 종종 있는데 이에 관한 설명을 지금해보자

 

스레드(Thread) 란?

- CPU를 수행하기 위한 실행단위를 의미

- 프로세스에는 하나 이상의 스레드가 존재

- 프로세스 내부에 존재하는 여러 스레드는 Code, Data, OS Resource 영역을 공유하며 Stack, PC, RegisterSet 각각 존재한다

- 프로세스의 Context Switch보다 스레드의 Context Switch가 오버헤드가 적다.(비용이 적게 듬)

 

프로세스 생성 등 프로세스와 관련된 시스템 콜

1) fork : 부모 프로세스가 자식 프로세스를 생성

 - fork() 시스템 콜을 통해 자식 프로세스를 생성하며 자식 프로세스의 process id는 0을 의미한다. 

 - 자식프로세스는 fork()함수 이후부터 실행된다.

 - 자식프로세스는 부모프로세스가 메모리를 공유하다 쓰기작업이 필요한 부분만 메모리를 할당받아 쓰기작업을 실행한다.

 

void main() {

	printf("main 실행");
    int pid = fork();
    
    //자식
    if(pid == 0) {
    	printf("자식 프로세스 실행");
    }
    //부모
    else {
    	printf("부모 프로세스 실행");
	}
}

2) exec : 생성된 프로세스에 새로운 프로그램을 덮어씌움

3) exit : 프로세스 종료

 

프로세스간 메시지 교환(IPC)

프로세스간 메세지를 교환하는 방법에는 2가지가 존재한다.

1) 메시지 패싱 : 전달받을 프로세스를 명시적으로 표시하는 방법과 메일박스를 사용하여 전달하는 방법이 있다.

 -> 명시적 : 전달받을 프로세스를 직접적으료 명시하여 메시지를 전달한다.

 -> 명시적 X : 메시지를 메일박스에 보내는 방법으로 여러 프로세스에게 메시지를 전달할 수 있다.

2) 공유메모리 : 프로세스 간 공유하는 메모리에 메시지를 쓰는 방법으로 공유 메모리에 존재하는 메세지를 가져옴으로써 메시지를 교환할 수 있다. 

 

출저

 

IT위키

 

itwiki.kr

  • 공룡책 Operation System Cencept 9판