Process = 실행되고 있는 프로그램, OS의 처리 단위가 다 process
multiprogram 때문에 process를 만들어서 사용
process끼리 communication = IPC (Interprocess Communication)
: OS에서 현재 수행중인 일의 단위로 프로그램과는 다르다 - 노트북에 설치된 모든 프로그램이 다 실행되고 있는게 아니기 때문
같은 chrome 프로그램에서 실행해도 다 다른 process일 수 있다.
multiprocessor VS multiprocess
multiprocessor는 칩이 여러 개 있는 거고 multiprocess는 여러 process를 동시 수행하는 것
process는 메모리 안에 있다.
code를 compile하면 exe 파일이 만들어지는데 SSD 안에 있는 실행파일을 실행하면 main memory에 code와 함께 수행하기 위한 공간이 만들어진다.
이러한 작업 공간까지 포함한 것을 process라고 부른다.
program code로 프로그램 코드가 복사된다.
전역변수가 들어가는 공간으로 크기가 변하지 않는다.
code의 function에 관련된 것
dynamic memory로 memory allocation으로 할당 받는 메모리
📌 stack과 heap은 가변적이라 끝에서부터 시작해 남는 공간을 둘 중 필요한 것이 쓴다.
코드에서 실행중인 위치를 나타내는 것으로 code에서 어디를 실행하는지 확인할 수 있는 pointer
: OS가 process를 관리하기 위해 별도의 정보를 가진 집합
process memory는 그저 저장 공간으로 여러 process를 관리하기 위해서는 process에 대한 정보가 필요하다.
👉🏻 이러한 정보로 어떤 process가 있고 특정 process가 어디에 있는지 파악하기 위함
PCB는 kernel memory에 있고 작업중인 process에 대한 모든 정보를 알고 있다.
👉🏻 만약 N개의 process가 있으면 N개의 PCB가 필요하다.
📌 PCB 안에는 process가 어디에 위치해 있는지, process가 사용하는 I/O device와 file이 포함되어 있다.
📌 PCB는 코드로 struct를 구성한다.
multiprocess는 CPU를 번갈아 process에게 주어 동시에 실행되는 것처럼 보이는 것으로 process가 다른 것을 할 때 원래 하던 것 그대로 옆에 두고 다른 것을 가져온다.
👉🏻 CPU에서 작업하던걸 해당 process의 PCB register에 복사하고 실행되던 code 위치도 program counter에 복사한다
👉🏻 다시 실행하면 저장한 것을 CPU에 다시 복사한다
process의 상태로 동적으로 바뀐다.
👉🏻 효율적으로 process를 관리하고 CPU를 할당하기 위해서
새로운 process로 PCB가 만들어지고 아직 memory 할당은 못 받은 상태
CPU를 할당 받을 자격이 있는 process
실제 CPU를 사용하고 있는 process
ready에 들어가지 못하고 있는 프로세스로 예를 들어 device를 사용하고 있는 경우
끝난 process로 PCB를 지우고 memory도 지움
PCB에 state만 바뀐다.
📌 오직 하나의 process만 CPU를 할당하기 때문에 나머지는 ready나 waiting 상태에 있음
📌 OS가 process의 상태를 관리하고 이 state는 PCB에 저장되어 있음
: state를 다루는 것 + CPU를 할당하는 것
📌 우리는 느끼기에 동시에 (concurrently) 여러개의 process를 실행할 수 있음
📌 동시에 한개의 CPU core에 평행하게 (in parallel) 한 개의 process만 실행 가능
하나의 single core에 만약 하나의 process가 계속해서 CPU를 할당 중이면 다른 process는 아무것도 할 수가 없이 CPU를 기다리고 있다 - ready나 waiting 상태
CPU가 한 번에 처리할 수 있는 건 하나로 빠르게 움직여야 한다.
👉🏻 하나의 process에서 다른 process로 CPU가 할당되는 것 : context switch
context switch
process A에서 process B로 CPU를 할당할 때 PCB A의 register로 현재 하고 있는 상태 옮기고 PCB B register에 있는 대로 CPU에 옮긴다. 이런 과정을 OS에 있는 context switch가 한다.
언제 context switch를 하고 어떤 process로 switch할지 결정하는게 "process scheduling"
CPU를 놀지 않게끔 CPU를 다른 process로 옮김
시간을 나눠서 process가 CPU를 번갈아서 사용
ready는 queue에 기다리고 있다 👉🏻 CPU를 기다리는 process 집합
CPU 할당 받은 process가 나가면 CPU를 다른 ready 상태 process에 할당한다 : dispatch
ready queue의 크기만큼 한번에 ready 상태인 것이 여러개일 수 있음 - OS가 크기를 정함
device를 사용하고자 하는데 할당받을 때까지 기다림
queue는 linked list로 구현되어 있어 PCB의 주소값이 연결되어 있음
📌 ready queue에 있는 process를 scheduler에 의해 dispatch된 process는 CPU를 할당받음
누구한테 CPU를 할당할지 결정하는 코드
CPU가 process를 다른 process로 바꿔야 할 때
process와 관련되어 있는 PCB register에 있는 값으로 계산한다
code이기 때문에 CPU를 할당해야 하는데 time limit이 있고 Context Switch를 자주하면 시간이 많이 걸려서 빠르게 바꾼다고 좋은 것은 아님
👉🏻 Process 1 → context switch → Process 2
모든 process는 다른 process로부터 만듦 - 자기 process를 그대로 복사해서 만들어 메모리를 그대로 복사한다
👉🏻 관리적인 측면에서 매우 용이하다
만든 process : parent process
만들어진 process : child process
첫번째 process만 새롭게 부팅할 때 만들어짐
📌 process는 proccess identifier로 구분하고 관리한다
fork()라는 system call로 생성하며 이는 OS가 제공하는 함수로 kernel이 이행한다.
parent process와 child process는 fork()의 return value만 다르다
📌 parent는 자기가 새로 만든 process pid를 리턴하고 child는 0을 리턴받음
execlp
복사된 메모리의 code가 초기화 뒤 code가 실행됨
👉🏻 exec()은 새로운 program으로 교체하는 것
부모가 죽으면 자식도 죽어서 부모가 자식이 끝날 때까지 기다린다
exit()
프로그램이 끝남
kill()
부모가 자식 process를 끝낼 수 있다 cascading + termination
📌 새로운 process 만들었으면 연관이 없고 남이 된다
: process간 통신
multiprocess는 잘못해서 다른 process 공간에 쓸 수 있기 때문에 위험 요소가 생긴다
👉🏻 이를 해결하기 위해 하나의 process가 다른 process에 접근하는 것을 금지시키는 protection이 생겼지만 이 때문에 process끼리 데이터를 줄 수 없게 되었다
IPC : process간 통신 기능을 제공하고 관리는 OS가 한다
새로운 메모리 공간을 제공해 여기에 process가 읽고 쓸 수 있게 한다.
user memory에 있으며 process가 파괴되어도 이 메모리 공간은 계속 유지되기에 원래 process에 영향을 받지 않는다.
memory는 항상 값으로 차 있으므로 지워지지 않는다.
이러한 속성 때문에 아무것도 안써도 consumer는 계속 데이터를 가져갈 수 있고 producer는 안 읽었는지 모르고 계속 덮어쓸 수 있다.
Synchronized
문제를 해결할 수 있는 방법으로 buffer로 in, out을 만들어 쓰면 in을 늘리고 읽으면 out을 늘려 데이터를 일반적으로 유지한다
📌 또 다른 문제점으로는 cache coherence problem이 있다
kernel 공간에 message queue를 만들어 이 공간에 데이터를 제공하고 원하는 사람이 여기서 가져간다.
데이터를 보낼 process는 OS에 send를 요청하고 받을 process는 OS에 recieve를 요청한다.
📌 communication link를 만들어 send/recieve 한다
blocking
끝날 때까지 기다리는 것으로 synchronous
non-blocking
끝나는 것을 확인하지 않는 것으로 asynchronous