운영체제에서 프로세스는 하나의 작업 단위이다. 프로그램은 실행됨에 따라 메모리에 올라가며 PCB(프로세스 컨트롤 블록)을 할당받아 비로소 프로세스가 된다.
프로세스 = 프로그램 + PCB
프로그램 = 프로세스 - PCB
PCB는 운영체제 영역에 올라가며 프로그램은 사용자 영역으로 들어간다.
이것보다 다양한 정보가 들어가 있으나 대표적인 정보들을 서술한다.
프로세스 구분자(PID): 프로세스를 구분하기 위한 ID
프로그램 카운터: 다음에 실행될 명령의 위치 값
프로세스 우선순위: 해당 프로세스가 가지는 우선순위
각종 레지스터 정보: 프로세스가 실행될 때 사용하던 레지스터, 자신이 계산하던 중간값 등이 저장
메모리 관리 정보: 프로세스가 메모리의 어디있는지 주소, 메모리를 보호를 위해 사용하는 경계 레지스터 값 등이 저장
할당된 자원 정보: 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보
계정 정보: 계정 번호, CPU할당시간, 사용시간등의 정보
부모프로세스 자식프로세스 구분자: PPID(부모프로세스아이디) CPID(자식프로세스아이디)정보가 저장된다.
코드 영역: 프로그램의 본문이 기술된 곳. 읽기전용으로 처리된다 자기 자신을 수정하는 프로그램이 존재하지 않기 때문
데이터 영역: 코드가 실행되면서 사용되는 변수나 각종 데이터를 모아 놓는 곳.
스택 영역: 운영체제가 프로세스를 실행하 위해 부수적으로 필요한 데이터를 모아 놓는 곳. ex 함수 호출 스택
힙 영역: 사용자가 가변적으로 사용하는 메모리 영역
생성상태(create status - new): 프로세스가 메모리에 올라와 실행 준비를 완료한 상태
준비상태(ready status): 프로세스가 CPU를 얻을 때까지 기다리는 상태
실행상태(running status): CPU를 얻어 실제 작업을 수행하는 상태
대기상태(watting status): 실행 상태에서 프로세스가 입출력을 요구하면 입출력 완료까지 기다리는 상태
완료상태(terminate status - exit): 실행 상태의 프로세스가 주어진 시간동안 작업을 마친 상태
Dispatch: 운영체제가 cpu를 할당해주는 과정
time out or Process completed by I/O : 인터럽트를 통해 발생
fork() : 실행중인 프로세스를 그대로 복사하는 함수 이때 실행되던 프로세스가 부모 프로세스 새로생긴 프로세스가 자식 프로세스가 된다.
exec() : 이미 만들어진 프로세스의 구조를 재활용해 fork와 달리 부분적으로 활용한다.
프로세스는 부모 자식 프로세스가 있었기에 계층 구조를 가진다.
이런 계층 구조는 장점이 있다.
고아 프로세스: 자식 프로세스가 종료되기전 부모 프로세스가 먼저 종료된 자식 프로세스
좀비 프로세스: 자식 프로세스가 종료되었는데도 부모가 뒤처리를 하지 않는 경우
C언어의 exit()나 return()문이 프로세스가 작업을 마쳤다고 부모 프로세스에게 알리는 것이다.