프로세스
프로세스의 개념
프로그램
- 저장장치에 저장되어 있는 정적인 상태
- 어떤 데이터를 사용하여 어떤 작업을 할지 그 절차를 적어놓은 것
- 실행될 수 있는 파일
- 요리의 레시피에 비유
프로세스
- 프로그램으로 작성된 절차를 실제 실행을 위해 메모리에 올라온 동적인 상태를 의미
- 수행중인 프로그램
- 요리로 비유
프로세스의 종류
역할
시스템(커널) 프로세스
- 모든 시스템 메모리와 프로세서의 명령에 액세스 할 수 있는 프로세스
- 프로세스 실행 순서를 제어하거나 다른 사용자 및 커널 영역을 침범하지 못하게 감시하고, 사용자 프로세스를 생성하는 기능
사용자 프로세스
- 사용자 코드를 수행하는 프로세스
병행 수행 방법
독립 프로세스
- 다른 프로세스에 영향을 주지 않거나 다른 프로세스의 영향을 받지 않으면서 수행하는 병행 프로세스
협력 프로세스
- 다른 프로세스에 영향을 주거나 다른 프로세스에서 영향을 받는 병행 프로세스
프로세스의 상태
프로세스의 상태 변화는 운영체제가 프로세서 스케줄러 이용하여 관리
작업 스케줄러는 스풀러가 디스크에 저장한 작업 중 실행할 작업 선정하고 준비 리스트에삽입하여 다중 프로그래밍의 정도 결정
프로세스 스케줄러는 선정한 작업의 상태를 변화시키며 프로세스의 생성에서 종료까지 과정 수행
생성 상태(create status)
프로그램이 메모리에 올라오고 운영체제로부터 프로세스 제어 블록을 할당받은 상태
생성된 프로세스는 바로 실행되는 것이 아니라 준비 상태에서 자기 순서를 기다리며, 프로세스 제어 블록도 같이 준비 상태로 옮겨짐
준비 상태(ready status)
- 실행 대기 중인 모든 프로세스가 자기 순서를 기다리는 상태
- 프로세스 제어 블록은 준비 큐에서 기다리며 CPU 스케줄러에 의해 관리
- CPU 스케줄러는 준비 상태에서 큐를 몇 개 운영할지, 큐에 있는 어떤 프로세스의 프로세스 제어 블록을 실행 상태로 보낼지 결정
- CPU 스케줄러가 어떤 프로세스 제어 블록을 선택하는 작업은 dispatch(PID) 명령으로 처리
- CPU 스케줄러가 dispatch(PID)를 실행하면 해당 프로세스가 준비 상태에서 실행 상태로 바뀌어 작업이 이루어짐
실행 상태(running status)
- 프로세스가 CPU를 할당받아 실행되는 상태
- 실행 상태에 있는 프로세스는 자신에게 주어진 시간, 즉 타임 슬라이스 동안만 작업할 수 있음
- 그 시간을 다 사용하면 timeout(PID)가 실행되어 실행 상태에서 준비 상태로 옮김
- 실행 상태 동안 작업이 완료되면 exit(PID)가 실행되어 프로세스가 정상 종료
- 실행 상태에 있는 프로세스가 입출력을 요청하면 CPU는 입출력 관리자에게 입출력을 요청하고 block(PID)를 실행
- block(PID)는 입출력이 완료될 때까지 작업을 진행할 수 없기 때문에 해당 프로세스를 대기 상태로 옮기고 CPU 스케줄러는 새로운 프로세스를 실행 상태로 가져옴
대기 상태(blocking status)
- 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태
- 대기 상태의 프로세스는 입출력장치별로 마련된 큐에서 기다리다가 완료되면 인터럽트가 발생하고, 대기 상태에 있는 여러 프로세스 중 해당 인터럽트로 깨어날 프로세스를 찾는데 이것이 wakeup(PID)
- wakeup(PID)로 해당 프로세스의 프로세스 제어 블록이 준비 상태로 이동
완료 상태(terminate status)
- 프로세스가 종료되는 상태
- 코드와 사용했던 데이터를 메모리에서 삭제하고 프로세스 제어 블록을 폐기
- 정상적인 종료는 간단히 exit( )로 처리
- 오류나 다른 프로세스에 의해 비정상적으로 종료되는 강제 종료를 만나면 디버깅하기 위해 종료 직전의 메모리 상태를 저장장치로 옮기는데 이를 코어 덤프(core dump)라고 함
대부분의 프로세스는 생성, 준비, 실행, 대기, 완료 상태로 운영되며 이 다섯가지 상태를 활성 상태(active stauts)라고 한다.
상태 | 설명 | 작업 |
---|---|---|
생성 | 프로그램을 메모리에 가져와 실행 준비가 완료된 상태 | 메모리 할당, 프로세스 제어 블록 생성 |
준비 | 실행을 기다리는 모든 프로세스가 자기 차례를 기다리는 상태 실행될 프로세스를 CPU 스케줄러가 선택한다. |
dispatch(PID): 준비 → 실행 |
실행 | 선택된 프로세스가 타임 슬라이스를 얻어 CPU를 사용하는 상태 프로세스 사이의 문맥 교환이 일어난다. |
timeout(PID): 실행 → 준비 exit(PID): 실행 → 완료 block(PID): 실행 → 대기 |
대기 | 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될때까지 기다리는 상태 입출력이 완료되면 준비상태로 간다. |
wakeup(PID): 대기 → 준비 |
완료 | 프로세스가 종료된 상태 사용하던 모든 데이터가 정리됨 정상종료인 exit와 비정상 종료인 abort를 포함 |
메모리 삭제, 프로세스 제어 블록 삭제 |
휴식 상태(pause status)
- 프로세스가 작업을 일시적으로 쉬고 있는 상태
- 유닉스에서 프로그램을 실행하는 동중에 [Ctrl]+[Z] 키를 누르면 볼 수 있음
- 종료 상태가 아니기 때문에 원할 때 다시 시작할 수 있는 상태
보류 상태(suspend status)
- 프로세스가 메모리에서 잠시 쫓겨난 상태
- 프로세스는 다음과 같은 경우에 보류 상태가 됨
- 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때
- 프로그램에 오류가 있어서 실행을 미루어야 할 때
- 바이러스와 같이 악의적인 공격을 하는 프로세스라고 판단될 때
- 매우 긴 주기로 반복되는 프로세스라 메모리 밖으로 쫓아내도 큰 문제가 없을 때
- 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때
프로세스 제어 블록(PCB: Process Control Block)
- PCB는 프로세스는 여러 상태를 오가며 실행되는데 프로세스를 식별하고 여러 정보들을 이용하여 프로세스가 정상적으로 실행될 수 있도록 한다.
- PCB는 OS에 의해 생성되고 관리된다.
- 운영체제가 프로세스 제어 시 필요한 프로세스 상태 정보 저장
- 어떤 프로그램이 프로세스가 되었다는 것은 디스크에서 메모리로 적제되고 운영체제로 부터 PCB가 생성되었음을 의미한다.
- 프로세스가 생성되면 메모리에 프로세스 제어 블록 생성, 프로세스가 실행 종료하면 해당 프로세스 제어 블록도 삭제
PCB가 갖는 여러가지 정보
프로세스 식별자
각 프로세스의 고유 식별자
운영체제 내에 있는 여러 프로세스를 구현하기 위한 구분자
프로세스 상태
- 프로세스가 현재 어떤 상태에 있는지를 나타내는 정보
- 생성, 준비, 실행, 대기, 중단 등 상태 표시
프로그램 카운터
- 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값으로 다음 명령의 주소를 표시
레지스터 저장 영역
- 프로세스가 실행되는 중에 사용하던 레지스터의 값
- 누산기, 인덱스 레지스터, 스텍 포인터, 범용 레지스터, 조건 코드 등의 정보
- 컴퓨터 구조에 따라 수나 형태가 다르다
- 인터럽트가 발생하면 프로그램 카운터와 함께 저장하여 재 실행할 때 원래대로 복귀할 수 있게 한다.
프로세서 스케줄링 정보
- 프로세스의 우선순위, 스케줄링 큐의 포인터, 기타 스케줄 매개변수
계정 정보
- 계정 번호, CPU 할당 시간, CPU 사용 시간 등
메모리 관리 정보
- 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등
할당된 자원 정보
- 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보
부모 프로세스 구분자와 자식 프로세스 구분자
- 부모 프로세스를 가리키는 PPID와 자식 프로세스를 가리키는 CPID 정보
문맥 교환(Context switching)
- 실행 중인 프로세스의 제어를 다른 프로세스에 넘겨 실행 상태가 되도록 하는 것
- 프로세스 문맥 교환이 일어나면 프로세서의 레지스터에 있던 내용 저장
문맥 교환이 일어나는 경우
- 한 프로세스가 자신에게 주어진 시간을 다 사용한 경우
- 인터럽트가 발생할 경우
프로세스의 구조
- 프로세스는 코드 영역, 데이터 영역, 스텍 영역으로 구성된다.
코드 영역
- 프로그램의 본문이 기술된 곳
- 프로그래머가 작성한 코드가 탑재되며 탑재된 코드는 읽기 전용으로 처리됨
데이터 영역
- 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳
- 데이터는 변하는 값이기 때문에 이곳의 내용은 기본적으로 읽기와 쓰기가 가능
스택 영역
- 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳
- 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아올 위치를 이 영역에 저장
- 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게는 보이지 않음
프로세스의 연산
프로세스의 생성과 복사
fork() 시스템 호출의 개념
- 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
- 실행 중인 프로세스와 똑같은 프로세스가 하나 더 만들어짐.
fork() 시스템 호출은 실행 중인 프로세스를 복사하는 함수이다. 이때 실행하던 프로세스는 부모 프로세스 새로 생긴 프로세스는 자식 프로세스로서 부모-자식 관계가 된다.
fork() 시스템 호출의 동작 과정
- fork( ) 시스템 호출을 하면 프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어짐
- 단, 프로세스 제어 블록의 내용 중 다음이 변경됨
- 프로세스 구분자
- 메모리 관련 정보
- 부모 프로세스 구분자와 자식 프로세스 구분자
fork( ) 시스템 호출의 장점
- 프로세스의 생성 속도가 빠름
- 추가 작업 없이 자원을 상속할 수 있음
- 시스템 관리를 효율적으로 할 수 있음
exec( ) 시스템 호출의 개념
기존의 프로세스를 새로운 프로세스로 전환(재사용)하는 함수
- fork( ): 새로운 프로세스를 복사하는 시스템 호출
- exec( ): 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출
exec() 시스템 호출을 사용하는 목적은 프로세스의 구조체를 재활용 하기 위함.
Reference
『IT CookBook, 운영체제(개정3판)』, 구현회 집필, 한빛아카데미
『IT CookBook, 쉽게 배우는 운영체제』, 조성호 집필, 한빛아카데미
『운영체제 : 내부구조 및 설계원리 (6판)』, WILLIAM STALLINGS 저, PEARSON HALL
'OS' 카테고리의 다른 글
05. 상호배제와 동기화 [2/2] (0) | 2019.12.15 |
---|---|
05. 상호배제와 동기화 [1/2] (0) | 2019.12.15 |
04. 병행 프로세스 (0) | 2019.12.15 |
03. 스레드(Thread) (1) | 2019.12.15 |
01. 운영체제의 개요 (0) | 2019.12.13 |