프로그래밍[Univ]/운영체제

[OS] Process Creation and process communication

Cloud Travel 2012. 4. 13. 19:04

* Process Creation

 - 일반적으로 프로젝트를 분류하고, 관리하기 위해서는 process identifier(PID)가 사용된다.

 - Resource sharing에 대한 선택지 

  > 부모와 자식은 resource를 모두 공유한다.

  > 자식은 부모의 resource를 일부 공유한다.

  > 부모와 자식은 resource공유를 하지 않는다.

 - Execution

  > 부모와 자식은 동시에 실행한다.

  > 부모는 자식이 죽을 때까지 wait상태로 대기한다.

 - process creation은 자신을 복제한 후 기능을 추가하는 것이다.


* Process Creation in UNIX

 - fork : 새로운 프로세스를 만드는 system call

 - exec : 복제가 완료된 후에 메모리 내용을 변경하여 다른 수행을 한다.

 int main(){

...

pid = fork();                                    // 새로운 프로세스를 생성하면 return 값으로 정수가 넘어온다.

    // 부모라면 자식의 pid, 자식이라면 0, fork 실패시에는 음수

if (pid <0){                                     // 실패시

fprintf(stderr,"fork failed"); 

return 1;

}else if(pid == 0){                            // 자식일 경우

execlp("/bin/ls","ls",NULL);       // 프로세스의 내용을 변경한후 실행을 한다.

}else{                                            // 부모일 경우

wait(NULL);                              // 자식 노드가 끝나길 기다린다.

printf("child complete");

}
return 0;

}

 - pid = fork(); 시에 자식 process id를 parent에게 return. 0을 자식 process에게 return 하는 것이다.

 - fork가 되면 프로세스 하나가 복제되는 것이다. 설정을 하지 않는 이상 어떠한 resource도 공유하지 않는다.

Quiz) 생성된 프로세스의 개수는 몇개인가? 

int main(){

fork();    // 1

fork();    // 2

fork();    // 3

}

Answer : 7 // 자식 process는 fork된 위치부터 지속적으로 실행한다.


* Process Termination 

 ⓐ 자식이 스스로 죽음

  - 결과 데이터를 자식이 부모로 전달을 함

  - 자식의 resource를 초기화함

 ⓑ 부모가 자식을 죽일때

  - child가 메모리를 너무 많이 가져간다.

  - 자식 프로세스가 할일이 없을 때

  - 부모가 죽을 때, 몇몇 OS는 자식도 같이 죽인다. 이를 cascading termination이라고 한다.


* Inter-process Communication

 - 자식과 부모는 서로 협동을 하거나(cooperating) 아니면 서로 다른 일을 한다.(independent)

 - cooperating을 하는 이유

  > 정보를 공유

  > 속도를 향상

  > 모듈화

  > 편리성

 - cooperating을 하기 위해서는 inter-process communication(IPC)가 필요하다

  ⓐ 메모리 공유법

  ⓑ 메세지 전달법

  

  


* Shared Memory System

 - 위의 그림에서 나왔듯이 요청한 프로세스의 주소공간으로 메모리가 할당된다.

 - 평소 P2는 P1의 메모리에 접근이 불가능하지만 kernel에 의해서 접근 권한이 부여된다.

 - 동시에 똑같은 메모리에 접근 하는 일에 대한 처리를 해야함.

 - 메모리 관리 기법

  > 2개의 circular array queue(buffer)를 사용

  > 각각의 큐에 대해서 하나의 Process는 only read, 반대 프로세스는 only write이다.

  > buffer의 in과 out의 위치가 같으면 buffer는 빈 것이다.

  > buffer의 (in+1)%buffer size == out 이면 buffer는 가득 찬 것이다.

  > buffer에 저장할수 있는 최대 메모리 크기는 buffer size -1이다.


* Massage Passing System

 - 단지, 두개의 프로세스의 연결을 만들고, 메세지를 보내고 받는 message system call만을 한다.

  ⓐ send (message) : message를 보냄

  ⓑ receive (message) : message를 받음

 - 이를 구현하는데에는 2가지 방법이 존재한다.

  ⓐ direct communication : 받는 프로세스를 명시해준다.

    ex) send(P,message) : P로 메세지를 전달한다.

    //단점 : 메세지를 보내고 받을 때마다 하나의 대상에만 이를 보내거나 받을 수 있음. 

                한번에 여러 프로세스로 메세지 전달이 안됨

  ⓑ indirect communication : mailbox를 사용하여 메세지를 전달한다.

    ex) send(A,message) : A mailbox로 message를 보냄.

     // direct에서 나타난 단점을 해소 할 수 있다. 여러 프로세스가 하나의 메세지 공유가 가능.

 - Message passing 방법에서 Pipe를 통해서 message를 통신하는 방법이 존재한다.


* Pipes

 - 한 방향인가 양방향인가(unidirectional or bidirectional)?

 - 양 방향이면 half인가 full-duplex인가?

  > half : 한 쪽이 이야기하는 동안 반대편은 이야기를 하지 못한다. ex) 무전기의 통신

  > full-duplex : 지속적으로 주고 받는 것이 가능하다.

 - 두 프로세스 사이에 관계가 있어야 하는가? ( ex) parent - child )

 - 네트워크를 이용해 다른 컴퓨터의 프로세스에 메세지를 보내는 것이 가능한가?

 ⓐ Ordinary Pipes

  - unidirectional 방식의 가장 간단한 Pipe이다.

  - 단방향 짜리 Pipe를 생성해서 통신한다.(write pipe(write end), only read pipe(read end))

  - 부모와 자식관계를 갖는 프로세스끼리만 통신이 가능하다.

  > Pipe 과정

   1) Pipe를 생성하면 문서에 번호를 부여한다. (rw의 파이프 선을 만듬, r과 w에 각각의 번호를 부여)

   2) fork될때 자식에게 부모의 정보가 복제되므로, 자식이 rw파이프선의 번호를 알기 위해서는 

      pipe를 생성한후 fork해야한다.

   3) 각 프로세스는 fork후 사용하지 않는 pipe를 닫고, pipe를 사용한후 모든 pipe를 닫아준다.

  - 단점

   > 프로세스가 끝나면 pipe도 같이 사라진다.

   > 부모 자식간에서만 가능하다.

 ⓑ Named Pipes

  - 양방향 통신이 가능하다.

  - 부모 관계의 관계가 필요하지 않는다.

  - 여러게의 프로세스가 파이프를 공유할 수 있다.

  - 프로세스가 죽어도 파이프는 유지된다.

  - 윈도우와 유닉스모두에서 작동을 한다.

  in Unix)

   - Named Pipes = FIFO

   - mkfifo()를 이용해서 파이프를 생성한다.

   - 파이프는 실제 파일로 구체화 되기 때문에 파이프를 사용이 끝나면 지워야한다.

   - half-duplex만 지원한다. 또한 오직 하나의 시스템에서만 공유된다.

 in Windows)

   - full-duplex를 지원해준다.

   - 내부 system 뿐만아니라 외부 System으로도 지원을 해준다.