●Process
▷실행중인 프로그램
▶Abstraction (추상화)

▶Logical Control Flow
▷각 프로그램이 각자의 CPU를 가지고 있는 것 처럼 행동함.
▷Context Switching에 의해 구현
▶Private Address Space
▷각 프로그램이 독립된 메모리 공간을 가지는 것 처럼 행동함
▷Virtual Memory에 의해 구현
▶Reality

▶Traditional
▷하나의 Processor가 여러개의 프로세스를 번갈아가며 동시에 실행
▷레지스터를 Saved registers에 저장하고, 다음 Process를 실행
▶Modern
▷Multicore Processors (여러 CPU가 하나의 Chip에 있음, 여러 Process 동시 실행 가능)
▶Context Switching
▷각 프로세스는 각자의 control flow를 가진다.
▷만약 프로세스들의 flow가 겹치면, 이는 Concurrently하게 진행된다.
▷그렇지 않으면 Sequential하게 진행된다.

▶Kernal
▷프로세스는 메모리 상주 시스템 OS인 kernal에 의해 관리됨.
▷Context switch를 일으킴.

▶Process Groups
▷하나의 부모 (foreground process)에 대해 여러 개의 자식(background process)가 존재
▷getpgrp() : 현재 프로세스의 Group
▷setpgid() : 프로세스의 Group을 바꾼다.

○Process Control
▶Process ID 얻기
▷pid_t getpid(void) : 현재 process의 PID 반환
▷pid_t getppid(void) : 부모 process의 PID 반환
▶프로세스 종료
▷행동이 terminate인 signal을 받음.
▷main routine에서 return
▶void exit(int status)
▷exit status를 status로 설정하고, 종료시킴
▷0이면 종료 성공, 아니면 에러
▷단 한번만 호출되며, 리턴되지 않음.
▶프로세스 생성 (Child process)
▶int fork(void)
▷Child 프로세스를 생성함.
▷Child에는 0을, Parent에는 Child의 PID를 return함.
▷Child는 Parent와 거의 유사함. (Parent의 Virtual Address Space, Open File Descriptor를 복사함 (하지만 메모리를 공유하지는 않음))
▷Child는 Parent와 Concurrent하게 진행됨.
▷한번 호출되면, 2번 return됨 (Parent, Child)
▶Process Graph
▷Vertex : Statement의 실행
▷Edge a->b : a다음에 b가 일어남
▷Edge에 현재 변수를 기록 가능
▷printf Vertex는 출력을 기록 가능
▷Inedge가 없는 vertex에서 시작 (Start vertex)
▷topological sort : 모든 Vertices의 순서가 왼쪽에서 오른쪽으로 감. -> feasible (발생가능)

▶Reaping/Waiting Child process
▷Zombie 상태의 Child process를 제거
▷zombie : 종료되었지만, 시스템 리소스를 차지하는 상황
▷Parent가 kernal에 exit status information을 전달하면, Kernal에서 이를 제거
▷Parent가 먼저 종료되면, init 프로세스가 대신 제거
▶Synchronizing Child
▶int wait(int *child_status)
▷Child 프로세스가 종료할 때 까지 Parent 프로세스가 대기한다.
▷Child process PID return
▶child_status!=NULL 이라면 MACRO를 통해 status 확인 가능
▷WIFEXITED : 정상적인 종료라면 true
▷WEXITSTATUS : 정상적으로 종료된 child의 status

▶int waitpid(pid_t pid, int& status, int options)
▷특정 Child에 대해 wait 가능
▷옵션 설정 가능
▶int execve(char *filename, char *argv[], char *envp[])
▷동시에 다른 프로그램 시행 가능
▷파일 : obj, 스크립트, 실행 파일...
▷env : 환경 변수
▷Parent에서 복사한 Code, Data, Stack을 Overwrite한다. (PID는 유지)
▷return
