티스토리 뷰

CS/운영체제 공부

프로세스

on1ystar 2019. 3. 22. 00:15
728x90
반응형

본 내용은 학교 강의를 통해 개인적으로 공부한 내용입니다. 책은 쉽게 배우는 운영체제(한빛아카데미)를 참고했습니다. 조언은 언제든지 감사합니다 !


프로세스가 무엇일까 ?



프로세스란 운영체제 입장에서 하나의 작업 단위다. 그럼 프로그램은 무엇일까?


프로그램과 프로세스의 차이

프로그램은 하드디스크 같은 보조기억장치에 저장된 절차(코드+데이터)다. 아직 실행되지 않은 정적인 상태이다.

폰 노이만 구조의 컴퓨터에서 프로그램을 실행하기 위해서는 메모리상에 올라와 있어야 한다. 프로그램을 메인메모리 위에 올려 실행한 것프로세스다. 즉 실행중인 프로그램이 프로세스다.



평소에 많이 열어본 적이 있는 작업 관리자를 보면 현재 실행중인 프로세스 목록들이 표시된다. 당장 우리 눈에 보이는 프로세스는 위의 5개인 것 같지만 실제로는 많은 프로세스들이 실행되고 있다.

하지만 위에서 말했듯이 프로세스는 하나의 작업 단위이며 CPU는 하나의 프로세스만 처리할 수 있다. 그럼에도 가능한 이유는 시분할 방식으로 처리하기 때문이다.


시분할 방식(time-sharing)

cpu가 처리하는 시간을 잘게 쪼개서 여러 프로세스에 배분하는 방식이다. 이 방식은 cpu가 처리하는 속도에 비해 입출력 시간이 현저히 느리기 때문에 등장했다고 볼 수 있다.

어떤 프로세스가 실행되고 있다고 해보자. 이 실행되고 있는 프로세스가 입출력같은 임무를 처리할 동안 cpu는 놀게된다. 이 노는 시간이 cpu의 시간으로는 매우 긴 시간이 되므로 많은 자원을 낭비하고 있는 셈이다. 따라서 이 시간동안 잠시 실행하고 있던 프로세스를 제쳐두고 다른 프로세스를 메모리에 올려 실행해 cpu가 놀지 못하게 만드는 것이다.

때문에 프로세스가 메모리에 한 번 올라가더라도 여러 상태를 가질 수 있고, 메모리에 잠시 내려오기도 한다.



프로세스가 제어 블록(PCB)



프로세스 제어 블록은 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료구조다. 프로그램이 메모리에 올라와 이 PCB를 얻었을 때 비로소 프로세스가 된다.

모든 프로세스는 고유의 PCB를 가지며, 프로세스 생성 시 만들어져서 프로세스가 실행을 완료하면 폐기된다.


PCB 구조

PCB 구성 (http://www.codequiz.in/os-process-management/)


 포인터

 프로세스 제어 블록을 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 사용 

 프로세스 상태 

 프로세스가 현재 어떤 상태에 있는 지를 나타냄 

 프로세스 구분자

 운영체제 내에 있는 여러 프로세스를 구별하기 위한 구분자 저장(PID) 

 프로그램 카운터

 다음에 실행될 명령어의 위치를 가리키는 PC 값 

 프로세스 우선순위

 CPU 스케줄러가 준비 상태에 있는 프로세스 중 실행 상태로 옮겨야 할 프로세스를 선택할 때 프로세스 우선순위를 기준으로 삼는다

 레지스터 정보

 이전에 실행할 때 사용한 레지스터의 값을 보관해야 다음에 실행할 수 있기 때문에 프로세스가 실행되는 중에 사용하던 레지스터의 값을 저장 

 메모리 관련 정보

 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등이 저장됨

 할당된 자원 정보

 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보

 부모 프로세스 구분자와 자식 프로세스 구분자

 PPID(Parent PID)와 CPID(Child PID) 정보 저장

 최초로 생성된 프로세스르 제외하고는 부모 프로세스와 자식 프로세스가 있는 트리구조를 가짐


문맥 교환(Context switching)

CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업이다. 이때 두 PCB의 내용이 변경된다.

문맥 교환은 기본적으로 프로세스 자신에게 주어진 CPU 시간을 다 사용하면 발생한다. 이를 타임아웃이라 하며 타임아웃된 프로세스는 PCB에 현재까지의 작업 결과를 저장하고 준비상태로 이동한다.

인터럽트가 걸렸을 때도 문맥 교환이 일어난다.


인터럽트 : CPU의 정상적인 실행을 방해했다는 의미


대부분 context switching이 일어날 때 오버헤드가 발생한다.


프로세스 상태



시분할 시스템에서는 위에서 설명했듯이 CPU가 하나의 프로세스를 계속 처리하는 것이 아니라 할당된 시간동안 처리하고 넘긴다. 이 때문에 프로세스는 몇 가지 상태를 가지게 된다.

프로세스 라이프 사이클

위의 그림은 프로세스의 라이프 사이클로 5가지의 상태를 보이고 있다.


생성 상태(new) : 프로세스가 메인 메모리에 올라와 실행 준비를 완료한 상태이다. 이때 PCB가 생성되고 할당된다.


준비 상태(ready) : 생성된 프로세스가 CPU에서 실행이 되기 전, 자기 차례를 기다리는 상태이다. PCB는 준비 큐(ready queue)에서 기다리며 CPU 스케줄러에 의해 관리된다. 이 CPU 스케줄러가 dispatch()를 실행하면 해당 PID를 가지고 있는 프로세스가 실행 상태로 옮겨간다.


실행 상태(running) : 프로세스가 드디어 CPU를 할당받아 실행되는 상태다. 시분할 방식의 경우 자신에게 할당된 타임 슬라이스 동안만 이 상태에 머물 수 있다. 실행 상태에서 다음 상태로 갈 수 있는 경우는 3가지다.

1. 타임 슬라이스 시간이 다 지나 timeout()되어 처리하던 작업을 멈춘 뒤 PCB에 저장하고 다시 준비 상태로 돌아간다.

2. 작업이 완료되면 exit()이 실행되어 종료 상태로 넘어간다.

3. 입출력이 요청되는 인터럽트가 발생하면 CPU는 처리를 멈추고 입출력 관리자에게 넘기는 block()을 실행한다. 그럼 프로세스는 입출력을 처리하기 위해 대기 상태로 내려가고 CPU는 바로 다음 프로세스를 처리하기 위한 dispatch()를 실행한다. 


완료 상태(terminated) :  프로세스가 종료되는 상태로 메모리상의 자신의 코드나 사용했던 데이터를 삭제하고 PCB를 폐기한다. 만약 비정상적으로 종료되는 강제 종료(abort)를 만나게 되면 코어 덤프에 종료 직전의 메모리 상태를 저장한다.(디버깅을 위해)


대기 상태(waiting,  blocking) : 프로세스에 입출력 인터럽트가 발생했을 시 입출력이 완료될 때 까지 이 대기 상태에 머물게 된다. 프로세스는 입출령 장치별로 마련된 큐에서 기다린다.

입출력이 완료되면 다시 인터럽트가 발생하고 wakeup()이 실행돼 PCB가 준비 상태로 다시 올라간다.


이 5가지 상태에서 특별하게 2가지의 상태를 추가할 수 있다.


휴식 상태(pause) : 프로세스가 작업을 일시적으로 쉬고 있는 상태로 사용하던 데이터가 메모리에 그대로 있고 PCB도 유지된다. 유닉스 프로그램에서 ctrl + z를 누르면 프로세스가 정지된다.(종료된 것이 아님)


작업 관리자의 세부 정보 탭에서 일시 중단됨인 프로세스를 몇 개 볼 수 있다. (참고로 여기서 PID도 확인할 수 있다)


보류 상태(suspend) : 보류 상태는 휴식 상태와 달리 메모리에서 잠시 쫒겨난 상태이다. 이유로는 대부분이 컴퓨터의 성능을 떨어뜨리거나 실행을 미루어도 큰 지장이 없는 프로세스다. 몇 가지 정리를 해보자면

- 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때

- 프로그램에 오류가 있어서 실행을 미루어야 할 때

- 바이러스와 같이 악의적인 공격을 하는 프로세스라고 판단될 때

- 매우 긴 주기로 반복되는 프로세스라 메모리 밖으로 쫒아내도 큰 문제가 없을 때

- 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때

메모리 밖으로 쫒겨난 프로세스들은 임시로 스왑 영역(swap area)이라는 곳에 보관된다.


728x90
반응형

'CS > 운영체제 공부' 카테고리의 다른 글

CPU 스케줄링  (1) 2019.03.30
스레드  (0) 2019.03.26
프로세스 메모리 구조, 시스템 호출  (0) 2019.03.24
Kernel (커널)  (0) 2019.03.10
운영체제의 정의와 역할  (0) 2019.03.10
댓글