Process에 대한 개념을 파악하고, process scheduling방식, 그리고 동작에 대해서 알아보자!
Process가 communication하는 방식에 대해서 알아보고 IPC, Client-server System까지의 내용으로 마무리하겠다.
a program in execution; Process 란 프로그램이 처리되는 job or task의 실행단위를 process라고 한다.
저번장에서도 알 수 있었듯이 program은 수동적이라면 process는 직접 동작하기에 능동적이라고 보면 된다.
job과 task를 거의 구분하지는 않지만 job의 경우에는 Batch 작업처럼 사용자와의 소통이 없어도 되는 작업시에 사용되고 Time-shared system(multi-process방식)어서 task라고 사용한다.
Process의 구성요소
PC, data section, stack 등이 존재한다.
processs는 작업이 실행되면서 data를 memory에 저장한다.
1. stack에 loval variable(parameter 처리방식 - 이전장에서 언급했다)을 저장하고 Systemcall 등에서 필요한 parameter를 저장하고 그 주소값이 System call의 code에 넘어가서 값들을 읽어오는 과정에서 사용된다.
2. heap : 동적으로 할당되는 메모리이고 더 필요하다면 위의 stack과 heap사이의 공간으로 확장한다.
3. data : global(전역변수)를 포함한다.
4. text : 실제 동작하는 로직이 담긴 code를 포함한다.
process는 실행되면서 상태를 가지게 되고 5단계로 나눠질 수 있다.
가지는 상태별로 각각에 맞는 queue에 저장되는데 queue에서 어떤 process를 다른 상태로 넘길지에 대해서 결정할 때 process Schduling이 진행된다.
해당과정에 대해서 알아보자!
5가지 Process 상태가 존재한다. 각 상태에서 queue에 존재할 수 있게 되고 queue에 의해서 스케줄링이 된 process들은 다음 상태가 된다. 그렇다면 schduling이 어떻게 이루어지는지 알아보자!
parent는 child를 생성할 수 있다.
이때 resource를 parent와 child간에 공유할 수도 있으며 일부만 공유할 수도 있고 혹은 아예 단절되어 있을 수도 있다.
execution 역시 concurrently하게(동시에 작업) 할 수 있으며 child가 마무리 될 때까지 기다린다.
만약 Independent process라면 서로 연관되어 있지 않아서 효율성이 떨어질 것이다.
따라서 서로 연관되어 협력적으로 처리되는 Cooperating process를 사용해야한다.
예를 들어서 parent와 child 사이의 자원을 공유하고 서로 협력적으로 처리되는 경우를 들 수 있다.
Cooperating Process의 장점
모듈화 : 처리해야하는 일을 여러개의 process가 나눠서 협력적으로 처리하면 더 효율적이다.
정보 공유 : 리소스를 공유하기 때문에 여러개의 process에서 발생할 수 있는 일관성 문제를 줄이고 일관성을 유지하기 쉽다는 장점이 존재한다.
빠른 스피드 : 나눠서 분할정복 처리가 가능하기 때문에 빠른속도로 처리가 가능하다.
편리성 : 변경이 쉽고 병렬처리가 가능해서 편리하다.
Producer와 Consumer의 구조의 대표적인 문제점
서로 협력하며 communication 하는 경우에 producer(server)와 consumer(client)가 있을 수 있다. 그러나 producer가 쓰는데 Consumer가 가져가지 않는다거나 Producer가 쓰지 않았는데 Consumer 가져가는 경우의 문제가 있을 수 있다.
producer -> buffer -> clinet의 구조를 가진다.
producer : Insert() method를 사용, consumer : Remove() method를 사용
IPC란 InterProcess Communication로 process 사이에서 일어나는 communication을 처리하고 순서를 맞춰주는 메커니즘이다.
간접 연결되는 경우에는 MailBox를 통해서만 msg를 주고받을 수 있다.
다만, 하나의 Mailbox에서 3개 이상의 process가 존재할 때 하나의 Mailbox에 send가 들어오고 거의 동시에 다른 프로세스에 Receive 요청이 들어온 경우 send된 msg가 어디로 가야할지에 대한 문제가 발생가능하다.
이때는 애초에 process를 2개만 하나의 mail box에 연결하도록 한다거나 receive 요청은 하나의 프로세스만 할 수 있게 해주거나 MailBox만 명시하는 것이 아니라 receiver process를 같이 명시해서 send를 전달한다.
communication에서의 동기를 맞추는 것은 send와 receive가 둘다 준비 된 상태일 때 함께 send, receive하는 것을 의미한다.
그렇다면 중간에 보관자가 필요없어서 별다른 메모리 공간을 사용하지 않고도 그 때마다 서로 주고 받으면 된다.
그러나, 준비가 되지 않았다면 계속 기다려야하고 blocking이 된다.
기다리지 않고 중간에 buffer를 둬서 vuffer로 부터 읽고 쓰기를 원하는 때에 하도록 한다.
Non-blocking 방식이기에 빠르게 작업이 가능하지만 buffer의 용량 문제가 발생가능하다.
client는 원하는 처리 메서드에 대한 정보를 STUB로 marshalling해서 server에 넘기고 server는 unmarshalling(server의 stub를 skeleton이라고 함)해서 데이터를 가지고 코드에 접근하여 결과를 client에게 보내준다.
지금까지 OS가 제공하는 process 기능 및 동작에 대해서 알아보았다.
process별 실행단위를 cpu가 실행할 수 있는 더 작은 unit인 thread로 나눌 수 있는데 다음 챕터에서는 thread와 OS에 대해서 알아보자!