Process
프로세스의 개념
- 프로세스란 실행 중인 프로그램을 의미한다.
- 하나의 프로그램이 여러 개의 프로세스가 될 수 있다.
- 프로세스는 process identifier(pid)로 구분되어진다.
- 자원 공유 옵션들
- 부모와 자식은 모든 자원을 공유한다.
- 부모의 자원들의 부분집합을 공유한다.
- 부모와 자식이 어떠한 자원도 공유하지 않는다.
- 실행 옵션들
- 부모와 자식이 병렬적으로 각각 실행된다.
- 부모가 자식이 종료되길 기다린다.
프로세스의 구조

- Text Section
- Program counter
- Stack
- 임시의 데이터를 저장한다. 함수 파라미터, 리턴 주소, 로컬 변수들
- Data Section
- Heap
- 실행되는 동안 동적으로 할당된 메모리를 저장한다.
프로세스의 상태

- new : 프로그램이 시작된다.
- running : 명령어들은 실행된다.
- waiting : 특정 이벤트가 발생하길 기다린다.
- ready : 프로세스가 프로세서에게 할당되도록 기다린다.
- terminated : 프로세스의 실행이 끝났다.
PCB(Process Control Block)
- Process state : 프로세스 상태
- Program Counter : 다음 실행 명령어의 위치
- CPU registers : 프로세스의 register 정보
- CPU scheduling information : 우선순위, 스케쥴링 큐 포인터
- Memory-managerment-information : 프로세스에게 할당된 메모리
- Accounting information : 프로세스가 시작된 이후 경과한 시간, 시간 제한
- I/O status information : 프로세스에 할당되어 있는 I/O 장치들, 열려있는 파일들 목록

Process Scheduling
- CPU 사용량을 극대화하고 프로세스 switch를 재빠르게 행하기 위해서 쓰이는 전략
- Process scheduler는 가용 가능한 프로세스들 중에서 다음 프로세스를 선택한다.
- 스케쥴링 큐의 종류
- Job queue : 시스템에 존재하는 모든 프로세스들을 저장
- Ready queue : 준비되어 있고 실행되길 기다리는 메인 메모리에 존재하는 모든 프로세스들을 저장한다.
- Device queues : I/O devices를 기다리는 프로세스들을 저장한다.
- Process들은 각각의 queue로 왔다갔다 한다.
Context Switch
- CPU가 다른 프로세스로 전환할 때 시스템은 반드시 context switch를 이용해 이전 프로세스의 상태를 저장해야하고 새로운 프로세스의 저장된 정보를 가져와야 한다.
- 프로세스의 context는 PCB에 저장되어 있다.
- context-switch 시간은 오버헤드이다. 스위칭되는 동안에는 시스템은 어떠한 일도 하지 않는다.
- 스위칭 시간은 하드웨어의 사양에 따라 달라진다.
Process 연산들
Process Creation
- 부모 프로세스가 프로세스 트리를 형성하면서 자식 프로세스를 생성한다.
fork()
: 부모가 자신을 복제하여 새로운 프로세스를 만든다.
exec()
: 새로운 프로그램을 실행한다.
- 즉, 부모 프로세스가 자식 프로세스를 생성할 때
fork()
system call을 이용하여 새로운 프로세스를 생성하고 exec()
system call로 새로운 프로세스를 실행시킨다.
Process Termination
exit()
: 프로세스가 마지막 명령을 수행하고 os에 마지막 명령을 삭제할 지 물어보는 시스템 콜이다.
wait()
: 자식의 상태 데이터를 부모에 넘겨주는 system call
- 프로세스의 자원들이 os에서 비할당된다.
- 다음과 같은 상황에서 부모가
abort()
system call을 사용하여 자식을 종료시킬 수 있다.
- 자식이 할당된 자원을 초과하였을 때
- 자식에게 할당된 일이 더이상 필요하지 않을 때
- 부모가 종료되었을 때 os가 자식이 존재하는 것을 허용하지 않을 때
- 부모가 종료되면 모든 자식 프로세스들은 종료되어야 한다.
- cascading termination : 모든 자손 프로세스들이 연속적으로 종료된다.
- 부모 프로세스는
wait()
system call을 이용하여 자식이 종료될 때까지 기다릴 수 있다. wait()
system call은 종료된 프로세스의 상태 정보와 pid를 반환한다.
- 기다리는 부모가 존재하지 않는 자식 프로세스를 좀비 프로세스(zombie process) 라고 한다.
- 부모가
wait()
system call을 호출하지 않고 종료되면 고아 프로세스(orphan process) 라고 한다.
프로세스 간 통신
- 프로세스들은 독립적이거나 상호연관적일 수 있다.
- 상호연관적인 프로세스들은 정보 공유, 연산 속도 증가, 모듈성, 편리함을 이유로 다른 프로세스들에 영향을 미치거나 영향을 받을 수 있다.
- 상호연관적인 프로세스들은 서로간의 통신을 위해 interprocess communication(IPC)가 필요하다.
- IPC의 종류

생산자-소비자 문제
- 생산자는 정보를 생산하고 소비자는 정보를 소비한다.
- unbounded-buffer는 버퍼의 사이즈의 제한을 두지 않는다.
- bounded-buffer는 버퍼의 사이즈의 제한을 둔다.
Pipes
- 프로세스들 간의 통신의 전달체(매개체)로서의 역할을 한다.
Ordinary Pipes
- 프로세스를 만들어 낸 곳 이외에서는 접근이 불가능하다. 보통 부모 프로세스가 pipe를 만들고 자식 프로세스와 통신할 때 사용한다.
- ordinary pipes는 표준 생산자-소비자 형식의 통신을 허용한다.
- 생산자는 pipe의 write-end 부분에 write한다.
- 소비자는 pipe의 read-end 부분에서 read한다.
- 그러므로 ordinary pipes는 단방향 통신이다.
- 프로세스간의 통신에 부모-자식 관계가 필요하다.
Named Pipes
- parent-child 관계가 아니더라도 접근이 가능하다.
- 양방향 통신이다.
- 여러 개의 프로세스들이 통신을 위해 named pipes를 사용할 수 있다.
- UNIX와 Windows에서 모두 사용 가능하다.
Threads
쓰레드 사용 이유
- Responsiveness - 특정 프로세스가 차단되었을 때 계속해서 실행을 할 수 있다.
- Resources Sharing - shared memory나 message passing 보다 훨씬 더 쉽게 프로세스 내의 자원을 공유할 수 있다.
- Economy - threads switching을 사용하여 context switching 보다 적은 비용으로 프로세스를 생성할 수 있다.
- Scalability - 멀티 프로세서 구조를 사용할 수 있다.
Multicore or Multiprocessor programming
- Multicore or Multiprocessor programming 다음과 같은 문제를 해결해야 한다.
- Dividing activities
- Balance
- Data splitting
- Data dependency
- Testing and debugging
- Parallelism : 시스템이 여러 개의 작업을 동시에 수행할 수 있는 성질
- Data Parallelism : multicore간의 동일 데이터, 동일한 연산을 threads를 통해 분배한다.
- Task Parallelism : 코어들 간의 각각의 독특한 연산을 수행한다.
- Concurrency : 프로세스를 만드는 작업을 여러개를 할 수 있는 성질


User threads and Kernel Threads
User threads
- user level의 threads library들에 의해 관리되어지는 쓰레드
Kernel threads
Multithreading Models
Many-to-One
- 여러개의 user-level thread가 하나의 kernel thread로 mapping 된다.
- 하나의 thread blocking 현상이 전체 thread의 blocking 현상이 될 수 있다.
- Many-to-One 멀티 스레드 시스템은 한 번에 하나의 스레드만 kernel에 접근할 수 있기 때문에 멀티코어 시스템에서 병렬적으로 실행되지 않는다.
- ex) Solaris Green Threads, GNU Portable Threads
One-to-One
- 하나의 user-level thread가 하나의 kernel thread에 매핑된다.
- kernel의 부담을 줄이기 위해 프로세스당 스레드 생성 개수가 제한된다.
- ex) Windows, Linux, Solaris 9 and later
Many-to-Many
- 여러개의 user-level thread가 여러 개의 kernel thread에 매핑된다.
- ex) Solaris prior to version 9
Thread Libraries
- Thread library는 프로그래머에게 thread를 생성하고 관리할 수 있는 API를 제공해준다.
Pthread
- 스레드를 생성하고 동기화할 수 있는 POSIX 표준 API이다.
- 명세이지 구현이 아니다.
- Pthread는 thread library의 동작을 명세한다.