프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다.
프로세스는 프로그램, 입력, 출력, 상태를 갖는다.
동일한 프로그램을 2번 실행시키면 2개의 프로세스가 생성된다. 이들은 프로그램은 갖지만 입력, 출력, 상태는 실행할 때, 조건에 따라 달라질 수 있다.
프로세스 모델:
*program counter: 다음 cpu가 수행해야 할 명령어의 주소를 저장하는곳.
(a) 다중 프로그래밍
메모리에 여러개의 프로그램을 적재한다 -> 다중프로그래밍
cpu는 한개의 프로그램씩 순차적으로 수행한다.
한개의 프로세스씩 순차적으로 실행하기 때문에 프로그램 카운터는 한개로 충분하다.
(b) 병렬처리
4개의 프로그램을 독립적으로 병렬처리를 한다. 독립적인 순차프로세스를 진행한다.
동시에(병렬)로 4개의 프로그램을 처리해야 하기 때문에 프로그램 카운터는 4개가 필요하다. 이는 물리적으로 하나지만 한개의 프로그램 카운터를 논리적으로 4개로 나누어 쓴다는 의미이다.
(c) 시분할(time sharing)
이는 위에 설명한 b의 설명이다. 병렬로 실행한다는 것은 a와는 달리 한개의 cpu를 여러개처럼 사용한다는 뜻이다. 이는 프로세스에 cpu점유권을 스케쥴링 하여 a처리 -> b처리 -> c처리 -> d처리 -> a처리 이런 방식으로 시간을 나누어 순차적으로 프로세스들을 돌아가며 처리한다.
한순간에 1개의 프로세스만을 수행하지만, 여러개의 프로세스를 빠르게 번갈아가며 처리하면 사용자는 4개의 cpu가 4개의 프로세스를 처리한다고 인식한다.
프로세스 생성
프로세스를 생성하는 사건:
1. 시스템 초기화(Booting)
2. 실행 중인 프로세스가 프로세스를 생성하는(system call)을 하는 경우
3. 사용자가 새로운 프로세스를 생성
4. 배치 작업의 개시(일괄처리)
기술적으로는 모두 프로세스 생성 system call(유닉스의 경우 fork)을 이용한다. (최초의 프로세스 제외)
각 프로세스는 독립적인 주소 공간을 갖는다. -> 주소 공간을 공유하지 않는다.
프로세스 종료
1. 정상종료(nomal exit) 자발적
2. 오류종료(error exit); 자발적 <- 논리적 오류가 발생했을 때 오류 처리를 해 놓은경우
3. 치명적 오류(fatal error) 비자발적
- 프로그램 상에서가 아니라 잘못된 메모리 참조처럼 비 정상적인 메모리를 참조 해 버릴경우 하드웨어는 강제로 프로그램 제어권을 운영체제로 넘긴다.
4. 다른 프로세스에 의한 종료(유닉스 kill명령어) 비자발적
프로세스 상태
Running(runnable): 프로세스를 실제로 사용중인 상태
Ready(time): CPU를 언제든 사용 가능하지만, 현재 다른 프로세스에 의해 점유되어 있기 때문에 기다리는 상태
Blocked(sleep): 외부 이벤트를 기다리는 상태 CPU를 사용하지 않는 상태.
1번 화살표: printf처럼 연산을 끝내고 결과를 출력한 후 더 이상 처리할 일이 없을 때
2번 화살표: 스케쥴러에 의해 할당된 CPU 사용시간을 모두 사용한 경우 Running에서 Ready상태로 넘어가게 된다.
3번 화살표: 2번 화살표 이후 다시 CPU 사용시간이 다가온 경우
4번 화살표: scanf처럼 사용자 입력을 받길 기다리는 경우
프로세스 상태에 관한 예제:
예제 1.
int main(){
do{} while(1);
}
해당 프로세스를 백그라운드로 실행한 경우.
프로세스의 상태: Runnable(Running)상태
예제 2.
#include<unistd.h>
int main(){
sleep(3600);
}
프로세스의 상태: Sleep(Blocked)상태
예제 3.
#include<stdio.h>
int main(){
int a;
scanf("%d", &a);
}
프로세스의 상태: T 상태
예제 3.
#include<unistd.h>
int main(){
int i;
do{
sleep(1);
for(i = 0; i < 100000000; i++);
}while(1);
}
프로세스의 상태: runnable, Sleep상태 둘 다 나온다.
Runnable의 상태는 sleep(1) 이외의 코드가 처리중일 때 나오게 되며, sleep이 진행 중일 때(1초) 간 Sleep상태가 나오게 된다.
해당 프로그램(프로세스)는 runnable와 sleep상태를 번갈아가면서 수행하게 된다.