1. 프로세스란?
메모리에 올라가서 돌아가고 있는 프로그램
Representing of process needed
- Current instruction : program counter (다음 명령어의 주소를 갖고 있는 명령어 포인터)
(명령의 위치 파악)
- Register state
- memory contents : Stack, Heap, global variables
- Parent info
(위의 것들을 전부 다 알면 process 복원이 가능함)
프로그램은 passive(수동적)이고, 프로세스는 활동적(active)하다.
2. Process Memory Layout
-
모든 프로세스는 가상의 메모리 레이아웃을 가지고 있다고 가정함
-실제 메모리는 OS가 관리 -> 실제로 쓰는 것만 메모리에 OS가 전달해 줌
-
Reserved by kernel(1GB) / Stack, heap, data, text (3GB) 로 이루어져 있다.
-
Reserved by kernel : Syscall이 필요할 경우 이 kernel space를 이용하여 OS Kernel에 작업을 요청하게 된다.
-
Stack area : 지역변수 저장, 함수 호출되면 크기가 밑으로 커짐(내려옴)
-
Heap area: 동적 메모리할당 관련을 저장. 위로 커짐(올라감)
-
data segment: global variables를 초기화
-
Text segment: source code와 같은 명령어가 적혀있음.
Stack과 Heap이 반대인 이유: 메모리가 확장되면서 다른 영역과 충돌 가능하기 때문, 최대한 반대로 자라게 하여 자유롭게 이용가능하게 하려고
- 여러 개의 memory layout이 있으면, OS가 위치선정을 해줌
3. process State
- New : 새로 생기는 것
- Ready : ready queue에서 processor에 의해 배정될 때까지 기다림
- Running : 실행
- Waiting : 어떤 event가 발생하여 프로세스가 기다리는 것 (다른 곳 가서 데이터 읽어올 때 등)
- Terminated : 실행 종료
- Ready -> Running : scheduled / Running -> Ready : preempted
- ex) ready -> running -> waiting -> ready -> running -> ready ...
4. PCB : process control block
5. Threads
- 프로세스 안에 여러 개의 스레드
- cpu의 코어 - 여러 개의 병렬성
- thread 하나로 쪼갤 수는 없음.
- thread는 자기 자신의 속한 process의 메모리 사용 가능
6. process switch
- process P0가 running하다가 저장되고 process P1이 running 하는 것
- 말 그대로 switch
7. process scheduling
-
Multiprogramming : CPU utilization을 극대화
-
Time Sharing : process interactive하게 -> 병렬적으로 되는 것처럼 느껴짐(빠르게 바꿔치기)
-
process scheduling : processor에 올릴 다음 process를 고름
-
Scheduling Queues
- Job queue
- Ready queue
- Device queue (각각 queue가 있음)
8. Scheduler
- 알고리즘을 통해 적절하게 process들을 조절
- long term scheduler = job scheduler
- short term scheduler = CPU scheduler
- Scheduling criteria
- CPU Utilization 최대화
- average waiting time 최소화
- 사람이 느끼기에 반응이 빠르게 느껴지도록 (response time 최소화)
- fairness
9. Operations on Processes
- Resource on process creation
- child는 추가적인 resource를 얻음
- child는 parent process의 resource의 일부를 받아 overloading 되는 것을 막는다.
- On creating a new child process
-
Execution type
- 부모와 자식이 concurrently 하게 돌아감
- 부모가 자식이 종료될 때까지 기다림
-
Program type
- 부모와 똑같은 자식 program
- 자식이 새로운 program
10. process creation in Unix/Linux
-
fork() system call
- 새 process를 만듦
- 정확히 카피본
- parent와 child는 fork() 이후 concurrently하게 run
- return values는 parent와 child 다름
-
exec() system call
-
wait() system call
11. Process Termination
-
Process가 exit()을 호출
- 부모의 상태를 return
- 자원이 released 된다
-
부모가 자식 process를 종료시킬 수 있다.
- 자식 프로세스가 cpu나 메모리를 과도하게 사용할 때
- 자식 프로세스의 task가 필요없을 때
- 부모 프로세스가 종료되면 OS는 자식 프로세스를 남겨두지 않는다.
-
exit() 는 코드롬 명시할 수 있고, 암묵적으로 할 수 있다.
-
wait()
- 부모 프로세스가 사용하는 것으로, 자식 프로세스가 끝날 때까지 기다림
-
Zombie
- 프로세스가 종료되었는데, 부모가 wait()을 호출하지 않았을 때
-
what if parent never calls wait()?
- init : 주기적으로 wait() 안되어있는 것들을 청소해줌.
12. pipes
- ordinary pipe
- 부모 프로세스와 자식 프로세스 간의 파이프
- 단방향 커뮤니케이션 가능
- Named Pipes
- 양방향 커뮤니케이션
- 부모 자식 사이가 아니어도 가능 -> fork 필요 없음
- 프로세스들이 끝나도 존재 가능
- mkfifo() system call로 사용 가능
- 프로세스들이 같은 물리적 머신 위에 있어야 함.
13. Remote Procedure calls
- function call를 네트워크를 통해 함
- 하는 이유 : 계산량이 너무 많거나, 보안 데이터가 있으면 RPC에서 계산하여 결과만 줌