[3] 프로세스
[ 3-1 : 프로세스의 이해 ]
[ 프로세스 ]
실행중인 프로그램.
OS에서는 작업의 단위.
[ Process State Diagram ]
프로세스가 실행될 때, 5개의 state가 존재.
프로세스를 관리하기 위한 state.
New : Process가 만들어짐(메모리에 적재)
Ready : CPU를 점유할 준비가 됨.
Running : CPU를 점유해서 Instruction을 CPU에 로드해서 실행하는 상태.
Waiting : time sharing으로 중간에 다른 프로세스가 CPU를 점유했을 때 또는 I/O중일 때
Terminated : 실행 종료. (return 0;)
Interrupt(running -> ready) : CPU를 너무 오래 점유했을 때, ready 상태로 이동.
I/O or event wait : I/O를 하는 동안에는 할 일이 없으니, waiting 상태로 이동.
I/O or event completion : I/O를 완료하였으니 다시 CPU를 점유하기 위해 ready 상태로 이동.
Scheduler dispatch : OS가 다시 해당 프로세스에게 CPU를 점유하게 해주면, running 상태로 이동.
[ PCB : Process Control Block ]
각 프로세스가 가지는 정보를 PCB라는 구조체로 관리.
Process State : new / running / waiting / ready 상태 중 어느 것인지
Program Counter(Instrucition Pointer)
CPU Registers
CPU-Scheduling information
Memory Management information (new, malloc...)
accounting information
I/O Status
프로세스는 Single thread of execution을 갖는 프로그램.
single thread of control은 한 번에 하나의 task만 실행가능.
여기서 thread는 단순히 흐름을 말한다.
운영체제의 가장 핵심적인 기능은 멀티프로세싱.
컴퓨터가 동시에 여러 프로그램들을 실행하는 것.
그런데, 프로세스내에서도 하나의 쓰레드로도 부족해지기 시작했다.
Modern 운영체제는 하나의 프로세스내에서 multiple threads를 할 수 있게 확장된 프로세스를 가짐.
thread는 lightweight process.
일반적으로 멀티프로세스보다, 멀티쓰레드의 장점이 더 많다.
Concurrent와 Parallel은 다른 의미.
Multiprogramming의 목적은 CPU Utilization을 최대로 끌어 올리는 것.
Time sharing의 목적은 CPU 코어가 프로세스들을 매우 빠르게 스위치하며 유저가 실행죽인 각 프로그램과 상호작용할 수 있게 만드는 것.
이를 위해, Scheduling 필요.
Wait Queue → Ready Queue → Running
(PCB의 링크드 리스트로 구현)
Queueing Diagram
- Process state diagram과 같이 보면 좋다.
Context Switching
프로세스의 Context는 PCB로 나타냄.
Interrupt가 발생하면, running process의 현재 Context를 저장하고, 다시 resume될 때 Context를 복구하는 것.
CPU 코어를 다른 프로세스에 Switch해주는 것.
→ 현재 프로세스의 state(PCB)를 저장하고, 다른 프로세스의 state(PCB)를 restore.
프로세스는 프로세스를 생성할 수 있다.
생성하는 프로세스 : parent process
생성된 프로세스 : child procss
execution에 대한 2가지 가능성
parent는 child와 함께 concurrently하게 실행.
parent가 child를 만들고, child가 terminated될 때까지기다리는 것.
address-space의 2가지 가능성
child process는 parent process의 복제(duplicate). (절역)
child process는 새롭게 로딩된 program을 가짐.(새로운 address)
return 0; 또는 syscall 중 exit()를 하면 모든 리소스들을 할당해제 (deallocate)
Zombie process : child는 terminated 되었으나, parent는 wait()를 호출하지 않음. (종료됐으나 삭제되지 않음.)
Orphan process : parent가 wait()를 하지않고 종료. (wait() 호출전에 parent가 먼저 종료)
→ child가 원래 먼저 종료되어야함. 그러고나서 parent의 wait()가 호출되어야 하는것이 정상.
[ 3-3 : 프로세스간 통신 ]
concurrently하게 실행중인 프로세스들은, "independent processes" 또는, "cooperating processes" 이다.
[ A process is independent ]
공유하는 데이터가 없을 떄.
[ A process is cooperating ]
서로 영향을 주고 받을 수 있음.
그래서, 다른 프로세스들과 데이터를 공유하는 프로세스들을 cooperating process라고 함.
IPC : Inter-Process Communication
Inter-Process Communication
IPC의 기본 모델 2가지
- Shared Memory
- Message Passing
(a) : Message Passing, (b) : Shared Memory
[1] Shared-memory
producer와 comsumer processes들이 공유하는 메모리의 영역.
프로세스들이 메모리 영역을 공유하게 되면, shared memory를 접근하고 조작하는 코드는 어플리케이션 프로그래머가 명시적으로 작성해야 함.
→ 난이도가 어려워짐.
[2] Message-Passing
O/S가 cooperating processes들에게 message-passing을 통해 서로 communicate할 수 있게 수단을 제공.
* 서로 생산하면서 소비하는, Prosumer와 Prosumer 수백명이 통신할 때는, 이 방식이 힘들 수 있어 shared-memory가 필요할 수도 있음.
Communication Links
P과 Q 두 프로세스가 서로 통신하려고 할 때, 서로 메세지를 send하고 receive해야 함.
이 방법은 여러 방식으로 구현될 수 있음.
- Direct or Indirect communication
- Synchronous and Asynchronous communication
- automatic or explicit buffering
[1] Direct communication
수신자 또는 송신자를 명시적으로 정해야 함.
정확이 2개의 프로세스가 통신하므로 1개의 link만 존재.
[2] Indirect communication
mailboxes, or ports로 부터 메세지를 받음. (요즘은 포트)
수신자를 직접적으로 지정하지 않고, mailbox에 메세지를 보냄.
수신할 때에도, malibox로 부터 받음.
양쪽 프로세스가 shared mailbox(port)가 있을 때만, 링크가 만들어질 수 있음.
link는 2개 "이상"의 process들이 연관되어 있음.
또는 link가 여러개 존재 가능.
OS는 프로세스가 다음과 같은 것들을 할 수 있도록 메커니즘 제공.
Create a new mailbox.
Send and Receive messages through the mailbox.
Delete a mailbox.
Difference design options for implementation
blocking or non-blocking : synchronous or asynchronous.
blocking은 syncrhonous, non-blocking은 asynchronous.
Blocking send : the sender is blocked until the message is received.
Non-blocking send : the sender is sends the message and continue.
Blocking receive : the receiver blocks until a message is available.
Non-blocking receive : the receiver retrieves either a valid message or a null message.
Blocking(Synchronous) : 만약 전부 보내고 다음 코드에 진입 했다면, 수신하는 프로세스도 전부 받았다는 뜻.
동기화가 된 상태가 보장된다는 장점이 있음. 대신 속도가 느린 단점.
Non-blocking(Asynchronous) :
수신자가 전부 받았는지 보장할 수 없음. 대신 속도가 빠르다.
장단점이 존재함.
[ 3-4 : 프로세스간 통신의 실제 ]
IPC System의 예제
Shared Memory : POSIX Shared Memory
Message Passing : Pipes
UNIX의 전통적인 IPC 메커니즘
POSIX shared memory
: memory-mapped file을 사용, (메모리에 파일을 올린 것?)
Pipes
파이프를 구현하는데 4개의 이슈가 있음.
1) (unidirectional)단방향 or (bidirectional)양방향 중 어떤 방식의 communication을 허용하게할 것인지?
2) half-duplex or full-duplex ?
왔다 갔다? 동시에 가능한지 -> pipe를 2개 만들면 된다는데
3) 통신하는 process 사이에, parent-child같은 relationship이 존재해야 하는지?
pipe는 편의상 가져야 한다고 함.
4) network를 통해서 communicate가 가능한가?
불가능, 이걸 가능하게 하는것이 Socket.
pipe의 2가지 타입
- Ordinary pipes
parent가 pipe가 만들면 반드시 child랑만 통신 가능
unidirectional : one-way로 지원.
two-way ? 2개의 pipe를 사용하면 된다.
parent와 child가 통신하기 때문에, fort() 이용.
- Named pipes
parent-child relationship이 없더라도 사용가능
[ Communication in Client-Server Systems ]
지금까지는 하나의 컴퓨터에서 이뤄지는 통신이었음.
[ Sockets ]
Endpoints for communication.
두개의 컴퓨터를 Ip address로 특정하고, 연결된 pipe를 특정하는 것은 port.
이 두개를 하나로 묶으면 socket이 되는 것.
→ Ip address와 port 번호로 바인딩된 것을 socket이라고 함.
그런데, 두 컴퓨터의 환경이 다르다보니 (Little Endian, Big Endian) 문제가 커짐.
→ RPC가 나을수도 있다
운영체제에서 제공하는 포트 수가 10000개인데, 10001개의 요청이 온다면 서버가 터지는 것.
[ RPC : Remote Procedure Calls ]
네트워크 시스템에서 프로세스들 간의 procedure call을 추상화 하는 것.
remote service의 가장 흔한 형태 중 하나.
네트워크 커넥션이 있는 시스템 사이에서 사용하기 위해 precedure-call 메커니즘을 추상화하는 방식.
클라이언트는 마치 로컬에서 프로시저를 호출하듯이 원격 호스트에서 프로시저를 호출한다.
클라이언트 사이드에서 "stub"이라는 것을 제공함으로써, communication을 가능하게하는 detail을 숨기는 것.
→ 하지만 쉽지가 않음, Little Endian같은 바이트 오더 문제와, 직렬화가 있어야 하기 때문
클라이언트 사이드의 Stub은 서버를 정확히 찾아내고, 매개변수를 marshal합니다.
직렬화의 상위개념... 을 의미
IPC가 컴퓨터내에서 2개 이상의 프로세스가 통신하는 것이라면, RPC는 네트워크끼리 통신하는 것.
여러 프로세스로 처리하기에는 너무 무거우니, 프로세스내에서 여러 쓰레드를 사용해보자.