
정의 : 실행중인 프로그램
실행중 → 프로그램 카운터(pc)가 다음 instruction과 resource에 대한 정보를 갖고 있다.
프로세스 과정 그림

DiskMain MemoryCPU
< 고정된 크기 >
Text : 프로그램 코드. read-onlyData : 전역 변수< 고정된 크기 X >
Stack : 지역 변수, parameter, return address of functionHeap : 추가적으로 공간을 할당할 때. 동적 할당. malloc. free

New : 프로세스가 만들어져서 시스템에 들어왔고, 실행되려면 프로세서를 받아야 한다. 아직 프로세서 못 받음Ready : 프로세서가 없어서 기다리고 있는 상태. 프로세스가 프로세서 할당 받기 기다리는 상태Running : Schedular가 선택되어서, 프로세서가 돌아가는 상태waiting : 파일을 디스크에서 읽어올 때, I/O 등등 기다릴 때terminated : 프로세서가 최종적으로 exit

엄청 많은 프로세스 → 스케쥴링 역할도 중요
어떤 CPU 코어에 어떤 프로세스를 실행시킬지 결정해준다.
최대한 CPU를 활용해서 낭비되는 시간이 없도록 하는 것이 주요 목표
큐(Queue)를 활용한 스케쥴링
프로세스 할당은 큐 순서 말고, 알고리즘이 알아서
wait queue는 상황에 맞게 여러개 있을 수 있다.
wait queue에서 나오면 ready queue로 간다.
Ready queue : 1개

Wait queues : 여러개

Queuing Diagram


어떤 것을 백업?
OS가 PCB를 잘 관리하기 위해 정보를 추가로 저장 → 상태 전환이 더 빠르게

cf. 심화) Time dependent on hardware support


생성하는 방식 : Parent 프로세스 → child 프로세스
생성, 관리 방법은 오에스 마다 다르다 → 다양한 옵션이 있다.

fork() : 새 프로세스 생성하는 system callexec() : fork 이후 프로세스 메모리 공간을 새 프로그램으로 바꿔주는** system callwait() : parent 프로세스가 child 프로세스의 종료를 기다리기 위해 사용하는 system call
exit() : 프로세스가 마지막 명령을 수행한 후 OS에게 종료를 알려주는 System call
abort() : 프로세스를 강제 종료해주는 system call
cascading termination (연쇄 종료)
zombie & orphan process
wait() system call → 프로세스 상태 정보와 종료된 프로세스의 pid를 반환pid = wait(&status); → 부모 프로세스는 wait system call을 이용하여 child 프로세스의 종료를 기다린다.프로세스 간의 커뮤니케이션, cooperating → 다른 프로세스의 영향을 받을 수 있다.
협력할 수 있도록 만든 이유?
Information sharing : 두 개의 프로세스가 하나의 variable을 공유 
Computation Speedup : 여러 프로세스 → task를 병렬적으로 처리 
Modularity : 테스크를 분리 → 관리가 쉽다Convenience : 분리해서 관리 → 편리함프로세스 간의 통신(IPC) 방식 크게 두 가지→ 두 방식의 차이점, 비교! 가 중요

Shared memory : 원래 자신의 프로세스 공간 자체는 보호받아야하는데, 공유하기 위해서, 다른 프로세스가 접근할 수 있도록Message Passing : 커널이 메세지 큐 관리 → 보내고 싶은 프로세스가 메시지 큐에 메세지를 집어 넣으면 → 메세지를 읽어와서 추가적으로 공유 (커널 안에 메일 박스가 존재한다. 프로세스가 편지를 남겨두고, 받는 애가 읽는다)


shm_fd = shm_open(name, O_CREAT, O_RDWR, 0666);ftruncate(shm_fd, 4096);char *buf = mmap();shared memory는 서로 메모리를 어디에 쓸 줄 알았지만, 이거는 공유 변수에 의지X.
직접적으로 send(message), receive(message)
메세지 크기는 고정될 수도 있고, 바뀔 수도 있음
커널이 관리해주는 communication link 가 있어야 메세지를 주고받을 수 있다.
Physical(물리적) 구현
Logical(논리적) 구현
direct : 보내는 사람을 지정해놓는것 → send(Q, message); (message target의 유무 차이)indirect : 일단 박스에 메세지를 넣어놓고, 필요한 사람이 가져다 쓰는 것 → send(message);asynchronous : 메세지를 보내기만 한다. 받았다는 것 확인 안 하고 다른 작업 수행synchronous : 동기 방식. 내가 그 메세지를 보낸 것을 받았다는 것을 확인해야 하는 것.buffering : 메세지를 여러개 보낼 때, 버퍼에 메세지를 보관하거나, …