○ 프로세스 - 실행중인 프로그램. Program = passive, Process = active
○메모리 영역
Stack : 일시적 데이터(함수 parameter, return addresses, 지역 변수) 영역. [코드를 토대로 컴파일 중 크기가 확정됨] |
Heap : run time 중 동적 할당된 변수 영역 |
BSS : 초기화 되지 않은 global, static 변수 영역 |
Data : 초기화 된 global, static 변수 |
Text (= Code) : 프로그램에 코드가 들어가는 영역 |
○ Diagram of Process State, Process Life Cycle
New : process created
Running : Instructions are being executed (CPU 사용 중)
Waiting : 어떤 이벤트 발생하여 프로세스 대기 중 (CPU 사용 불가. I/O, event 등)
Ready : 이벤트 해결 후 프로세스 실행 대기 중 (CPU 사용 중 X, 하지만 넘겨주면 Running 가능)
Terminated : 프로세스 종료
○ PCB (Process Control Block)
Process 정보 구조체. Process State, Process ID, Program Counter, Register 등등 여러 정보 관리.
참고 : https://en.wikipedia.org/wiki/Process_control_block
○ Context Switch
한 프로세스에서 다른 프로세스로 CPU switch하는 과정
○ Process Creation
프로세스의 생성 과정 : 프로세스가 부모(Parent)가 되어 자신을 복제한다. 복제된 자신을 자식(Child)프로세스라고 하고, 별도의 메모리 공간을 가지고 Child는 자신의 PID가 0으로 확인된다.
[ PID == 0 : child process | PID > 0 : parent process | PID < 0 : err]
자연스럽게 트리의 형태를 띄게 됨.
* process를 만드는 fork()와 스레드를 만드는 pthread_create()모두 내부적으로는 System Call Clone()을 사용한다.
fork() -> 별도의 메모리 공간, 다른 PID
pthread_create() -> 공유 메모리 공간, 같은 PID
clone() -> 공유 메모리 공간, 다른 PID
대략적인 생각으로는 Clone 후 내부 flag, 값등을 바꿔서 process, thread로 나뉘며, Linux에서는 그렇기에 현재 프로세스와 스레드 구분이 없이 모두 Task로 취급.
○ exec() : 프로세스를 메모리 내 다른 프로그램으로 덮어 씌우는 System Call.
주로 fork() 이후, 복제한 Child Process에 exec()계열 system call로 다른 프로그램으로 덮어 씌어 탈바꿈 한다.
exec에 추가로 붙는 옵션들의 뜻:
l : 인수가 문자열이다. >> execl(const char *path, const char *arg1, *arg2, ...*argn)
v : 인수가 문자열 배열이다 >> execv(const char *path, char *const argv[])
p : path가 PATH 절대 경로내 file이다. >> execvp(const char *file, char * const argv[])
○Process Termination
어떤 OS는 부모가 종료됐을 때, child가 존재하는 것을 허락하지 않는 경우가 있다. 이 때 부모 아래 모든 프로세스(자식, 손자 ,...) 를 같이 종료하는걸 cascading termination이라한다. 우리가 쓰는 윈도우, linux, mac 등은 허락한다.
Zombie Process : 부모가 waiting 하지 않는 프로세스. (did not invoke waiting) 모든걸 반납하고 프로세스 테이블에 이름만 남아있으며, OS가 좀비를 입양하는 방법도 있다.
Orphan Process : 부모가 종료된 프로세스.
○ Interprocesss communication (IPC)
프로세스는 independent(독립적) 이거나 cooperating(협력적)일거다.
프로세스가 서로 협력한다면, 각 프로세스에 서로 영향을 끼칠 수 있어야한다, 즉 통신이 되어야 한다.
프로세스간 통신(IPC)에 2가지 모델
1. Shared memory : Process A, B가 공유된 메모리 공간을 가지고 사용. 게시판 느낌
2. Message Passing : Process A, B가 메시지를 보내는 형태. 우편 느낌
○ Message Passing에 Synchronization
Blocking : synchronous. 메시지가 정상적으로 송신/수신 될때까지 Block됨. 어떤 상태던 기다리면 blocking
Non-blocking : asynchronous. buffer로 메시지를 담고 대기.
Q. buffer가 꽉찼는데 메시지가 들어온다면? A. 버리면 blocking, 안버리면 non-blocking..??
○ Pipes
두 프로세스 통신을 위한 통로.
1. Ordinary Pipe : 부모-자식 관계를 가지는 파이프. pipe를 가지고 한쪽은 write-end, 다른 쪽은 read-end로 통신.
윈도우에서는 anonymous pipes라고 칭함
2. Named Pipes : 부모-자식 관계가 아닌 파이프. Communication is bidirectional.
'강의 > OS' 카테고리의 다른 글
OS - Thread (0) | 2023.06.29 |
---|---|
OS - Processes (0) | 2023.06.27 |
OS - Structure (0) | 2023.06.26 |
CPU스케줄링(5장) - 시험 요약 (0) | 2023.04.20 |
스레드 (4장)-시험 요약 (1) | 2023.04.20 |