4 분 소요

3. 프로세스 연산

프로세스 생성

  • 프로세스는 create-process 시스템 호출을 사용하여 new 프로세스를 생성
    • 부모 프로세스 - 자식 프로세스
  • 생성된 프로세스들의 계속적인 프로세스 생성의 결과로 프로세스 트리(process tree)를 형성
  • 프로세스들은 프로세스 식별자(process identifier, pid)로 구분

부모프로세스와 자식프로세스 간의 여러 가지 자원 공유 방법

  • 자식 프로세스가 OS에서 자원을 직접 얻음
    • 부모와 자식 프로세스간에 자원을 공유하지 않음
  • 자식 프로세스가 부모 프로세스 자원의 부분집합을 사용
    • 자식 프로세스는 부모 프로세스의 모든 자원 또는 일부 자원 공유
    • 부모 프로세스는 자식 프로세스들에게 자신의 자원을 분할 제공

Linux 시스템의 프로세스 트리

image

실행(Execution)

  • 부모와 자식이 병행(concurrent) 수행 or 부모가 모든 또는 일부 자식이 끝나기를 기다림(wait)

주소 공간(Address space)

  • 자식은 부모의 복사본(duplicate) or 새로 적재되는 프로그램을 가짐

Examples

  • UNIX: fork 와 exec system call 사용
    • fork() : new process 생성. 부모 프로세스의 주소공간의 복제본으로 구성됨
    • exec() : 프로세스 메모리 공간을 새 프로그램으로 대치하여 새로운 프로그램을 실행
  • Win32 API:
    • CreateProcess() : 프로그램을 적재하여 자식프로세스를 생성하여 실행. 인수가 복잡함(10개 이상)

UNIX에서의 프로세스 생성

image

프로세스를 생성하는 C 프로그램 (UNIX/Linux)

#include <stdio.h>
int main(void)
{
  int pid;
  pid = fork(); /* fork another process */
  if (pid < 0) {
    fprintf(stderr, "Fork failed"); 
    exit(-1); 
  } else if (pid == 0) { /* child process */
    execlp("/bin/ls", "ls", NULL); /* execute a new program */
  } else { /* parent process */
      wait(NULL); /* wait for the child to complete */
      printf("Child complete");
      exit(0);
    }
}

UNIX에서의 fork/exec/wait 동작

image

프로세스 종료 (정상적)

프로세스의 정상 종료

  • 프로세스가 마지막 문장의 실행이 끝나면 exit() 시스템 호출을 하여 운영체제에게 자신을 삭제를 요청함
  • 자식 프로세스는 부모에게 상태 값(대개 정수)을 반환할 수 있다.
    • 부모는 wait() 시스템 호출을 하여 이 값을 기다림
  • 운영체제는 프로세스가 사용한 자원을 반납(deallocate)함

좀비(Zombie) 프로세스

  • 종료되었지만 부모가 wait()를 아직 호출하지 않아서 남아있는 프로세스
  • terminated/zombie 상태로 짧은 시간 동안 이 상태에 머무름

프로세스의 종료 (비정상적)

프로세스의 비정상 종료

다음 경우에 부모가 자식을 종료할 수 있음

  • child가 자신에게 할당된 자원을 초과하여 사용할 때
  • child에게 할당된 태스크(작업)가 더 이상 필요 없을 때
  • 부모 종료 시, 운영체제가 자식이 계속하여 실행하는 것을 허용하지 않을 때 → 연쇄적 종료(cascading termination)

부모 프로세스 종료 후에 자식의 계속적인 실행을 허용하는 경우

  • 모든 프로세스는 종료 후 처리를 위하여 부모 프로세스가 있어야 함
  • 부모가 먼저 종료된 자식 프로세스는 고아(orphan) 프로세스가 되며 init 프로세스(Linux는 systemd 프로세스)를 새로운 부모 프로세스로 지정함

4. 프로세스간 통신(Interprocess Comminication)

병행(concurrent) 프로세스의 종류

  • 독립(Independent) 프로세스:
    • 다른 프로세스의 실행에 영향을 주거나 받지 않음
  • 협력(Cooperating) 프로세스:
    • 다른 프로세스의 실행에 영향을 주거나 받음

프로세스 협력을 허용하는 이유

  • 정보 공유 (예) 공유 파일
  • 계산 가속화(Computation Speedup)
    • 작업을 서브 작업으로 나누어, 병렬 실행
  • 모듈성(Modularity) – 기능 모듈화
  • 편의성(Convenience)
    • 개별 사용자가 한 번에 여러 작업을 수행함

프로세스간 통신(IPC) 모델

두 가지 IPC 모델 : 메시지 전달, 공유 메모리

image

공유 메모리 시스템 IPC

Shared Memory Systems – 공유 영역에 있는 버퍼 사용

시스템 호출을 사용하여 공유 메모리 영역 지정

  • UNIX: shmget(), shmat() 공유 메모리가 지정되면 보통의 메모리와 같이 접근됨

생산자-소비자 문제(Producer-Consumer)

  • 협력 프로세서들의 간단하고 전형적인 예
  • producer 프로세스는 정보를 생산하고, consumer 프로세스는 정보를 소비함

생산자-소비자 문제의 공유 메모리 구현 방법 – 두 유형의 버퍼

  • 무한(unbounded) 버퍼 : 버퍼 크기의 제한이 없음(이상적)
  • 유한(bounded) 버퍼 : 고정된 버퍼 크기
    • 버퍼가 full이면 producer는 기다려야 함

image

메시지 전달 시스템 IPC

메시지 전달

같은 주소 공간을 공유하지 않고, 통신으로 동작을 동기화하는 기능을 제공함(네트워크로 연결된 분산환경에 특히 유용)

메시지 전달 IPC 함수 – 최소 두 가지 제공

  • send(message)
  • receive(message)

메시지 크기와 IPC 구현

메시지 크기 OS구현 응용프로그래밍
Fixed size 간단함 더 복잡함
Variable size 더 복잡함 간단함

한 번에 전송/수신할 수 있는 메시지 길이는 제한됨. 길이가 길면 제한된 길이로 분할하여 여러 번 전송하거나, 여러 번 수신하여 합해야 함

  • fixed size IPC : 프로그래머가 이 작업을 수행
  • variable size IPC : IPC 함수에서 이 작업을 수행

통신 프로세스 P와 Q가 서로 통신을 하려면 그들 간에 통신 연결이 설정되어야 함

communication link의 구현

  • 물리적 구현 : 공유 메모리, 하드웨어 버스, 네트워크
  • 논리적 구현 : 운영체제의 관심 사항

communication link와 send/receive의 논리적 구현 방법

  • direct / indirect communication → 명명(naming) 방법
    • 상대편을 참조하는(가리키는) 방법
  • synchronous / asynchronous communication
    • send와 receive의 동작 동기화 여부
  • 자동(automatic) / 명시적(explicit) buffering

Naming - Direct Communication

Direct Communication – 서로의 이름을 명시 (대칭 주소 지정)

  • send (P, message) – process P에게 message 전송
  • receive(Q, message) –process Q로부터 message 수신

image

비대칭(asymmetric) 주소 지정

  • send(P, message)
  • receive(id, message) – 임의의 process로부터 message 수신 id = sending process의 이름

image

communication link의 특성

  • 링크가 자동적으로 설정
  • 링크는 두 프로세스들 사이에서만 연관됨
  • 두 프로세스들 사이에 정확히 1개의 링크만 존재

문제점

프로세스의 이름을 변경하면, 다른 프로세스에서 필요한 부분을 조사하여 이름 변경을 반영해야 함 → 해결책: 간접 통신

Naming - Indirect Communication

mailbox (또는 port)를 경유하여 message를 송신하거나 수신함

  • 각 메일박스는 고유의 ID를 가짐
  • 프로세스들은 메일박스를 공유할 때에, 메일박스를 통하여 통신

메일박스를 사용한 send/receive

  • send(A, message): mailbox A로 message 송신
  • receive(A, message): mailbox A에서 message 수신

communication link의 특성

  • 프로세스들이 공유(common)메일박스를 가질 때에만 통신 링크가 설정됨
  • 링크는 두 개 이상의 프로세스와 연관가능
  • 두 프로세스들 간에 다수의 링크를 공유 가능

메일박스 생성 및 소유

  • 운영체제는 메일박스 생성/송수신/삭제 기능
  • 메일박스는 생성한 프로세스의 소유임
  • 운영체제도 자체의 메일박스 소유 가능

image

동기화(Synchronization)

동기식(synchronous) 통신 - Blocking 송수신

동작이 상대편 동작에 영향을 받음

  • Blocking send - 송신 프로세스는 수신 프로세스나 메일박스가 메시지를 받을 때까지 block 되어 있음
  • Blocking receive - 수신 프로세스는 수신 메시지가 있을 때까지 block 되어 있음

비동기식 통신 - Non-blocking 송수신

동작이 상대편 동작에 영향을 받지 않음

  • Non-blocking send - 송신 프로세스는 메시지를 보내고 바로 return. 작업을 계속 수행함(수신 여부와 관계없이)
  • Non-blocking receive - 수신 프로세스는 유효한 메시지를 받거나 널을 받고 바로 return. 작업을 계속 수행함

동기식 통신이 프로그래머가 사용하기 더 쉽다

버퍼링(Buffering)

메시지 큐

프로세스간에 교환되는 메시지는 링크에 연관된 message queue(버퍼)에 저장되어 전송됨

buffer queue의 구현 방법

  1. 유한용량(Bounded capacity) - 유한한 길이의 버퍼(길이 n)
  • 큐가 full이면 sender는 기다려야 함
  1. 무한용량(Unbounded capacity) - 무한한 길이의 버퍼(이상적)
  • Sender는 결코 기다리지 않음
  1. 무용량(Zero capacity) - 링크에 버퍼가 없음
  • Sender는 receiver가 준비되어 직접 수신할 때까지 기다려야 함

→ 랑데부(rendezvous)라고 함

태그: ,

카테고리:

업데이트:

댓글남기기