포스트

운영체제 3장 - 프로세스 연산과 프로세스간 통신

3.3 프로세스 연산


프로세스 생성(Creation)

  • 프로세스는 create-process 시스템 호출을 사용하여 새로운 프로세스를 생성함
    • 부모-자식 프로세스 관계
  • 프로세스들은 프로세스 식별자(process identifier, pid)로 구분함
    • 부모 프로세스와 자식 프로세스간의 자원 공유 방법
      • 자식 프로세스가 OS에서 직접 자원을 얻음
      • 자식 프로세스가 부모 프로세스의 자원을 일부 사용
  • 실행(Execution)
    • 부모와 자식이 병행(concurrent) 수행
    • 혹은 부모가 모든 또는 일부 자식이 끝나길 기다림
  • 주소공간(address space)
    • 자식은 부모의 복사본 - UNIX, Linux
      • UNIX 의 fork()는 새로운 프로세스 생성, 부모 프로세스의 주소공간의 복제본으로 구성됨. exec()는 프로세스의 메모리 공간을 새 프로그램으로 대치하여 새로운 프로그램을 실행
    • 자식은 새로 적재되는 프로그램을 가짐 - windows
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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); 
	} 
}

프로세스의 종료

  • 정상 종료
    • 프로세스가 마지막 문장의 실행이 끝나면, exit()시스템 호출을 하여, 운영체제에게 자신의 삭제를 요청함
    • 자식 프로세스는 부모에게 상태값을 반환할 수 있음
      • 부모는 wait() 시스템 호출을 하여 이 값을 기다림
    • 운영체제는 프로세스가 사용한 자원을 반납함(deallocate)
  • 좀비 프로세스
    • 종료되었지만, 부모가 wait()을 아직 호출하지 않아 남아있는 프로세스
  • 비정상 종료
    • 부모는 abort() 를 호출하여 강제종료 시킬 수 있음
      • 자식이 자신에게 할당된 자원을 초과하여 사용할 때
      • 자식에게 할당된 작업이 더이상 필요하지 않을 때
      • 부모가 종료하는데, 운영체제가 자식이 계속하여 실행하는 것을 허용하지 않을 때
    • 부모 프로세스 종료 후에 자식의 계속적인 실행을 허용하는 경우
      • 자식 프로세스는 고아 프로세스가 되며, init 프로세스를 새로운 부모로 지정함
      • 모든 프로세스는 종료 후 처리를 위해 부모 프로세스가 있어야함

3.4 프로세스간 통신(Interprocess Communication)


  • 병행(concurrent) 프로세스의 종류
    • 독립(Independent) 프로세스 : 다른 프로세스 실행에 영향을 받지 않음
    • 협력(Coopertaing) 프로세스 : 다른 프로세스의 실행에 영향을 주거나 받음
      • 정보 공유, 계산 가속화, 모듈성, 편의성 등을 위해 협력함
      • 크롬 브라우저는 3 프로세스를 사용. 문제 발생시 다른 렌더러에 영향을 주지 않음

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

3_4

  • 메시지 전달(Message Passing) 방식
    • 통신을 하고 동작을 동기화 하는 기능을 제공함.
    • 메시지 전달 IPC 함수 이용. send() recieve()
    • 고정 사이즈 방식과, 변동 사이즈 방식
    • 적은 양의 데이터 전달에 유용
    • 충돌이 없음
    • 구현이 용이
    • 코어 수가 증가할 때 더 나은 성능
  • 공유 메모리(Shared Memory) 방식
    • 공유 영역에 있는 버퍼 사용
    • 시스템 호출을 사용하여 공유 메모리 영역을 지정함
    • 최대 속도
    • 편의성. 보통 메모리처럼 접근 가능
    • 코어 수 증가 시, 캐시 일관성 문제로 성능 저하
    • 생산자-소비자 문제
      • 버퍼의 크기가 유한하므로, 생산자는 버퍼가 비길 기다려야함
  • 운영체제는 물리적 구현은 관심 없고, 논리적 구현에만 관심을 가짐
  • 연결 방식 : direct / indirect
    • direct communication : 서로에게 이름을 명시함
      • 프로세스의 이름을 변경하면, 모든 다른 프로세스가 정의에 대한 재검사가 필요함
      • indirect communication : 메일박스를 경유하여 메시지를 송수신함
  • 동기화 여부 : synchronous / asynchronous
    • 동기식 통신 : 동작이 상대편 동작에 영향을 받음. Blocking
    • 비동기식 통신 : 동작이 상대편 동작에 영향을 받지 않음. Non-Blocking
  • 버퍼링
    • 자동 버퍼링(Automatic Bufferuing) : 운영체제가 버퍼 관리
    • 명시적 버퍼링(Explicit Buffering) : 사용자가 버퍼 관리

3.5 IPC 시스템 사례 - UNIX의 공유 메모리 함수


  • Shared Memory IPC
  • POSIX shared memory IPC
  • Mach의 message passing
  • Windows의 IPC - Local Procedure Calls

3.6 클라리언트-서버 시스템에서의 통신


  • 소켓(Sockets)
    • 응용프로그램간에 통신이 연결되는 종단점(endpoint)
    • IP 주소와 포트번호에 의해 식별됨
      • IP주소는 해당 시스템을, 포트 번호는 프로세스와 연결됨
  • 원격 프로시저 호출(Remote Procedure Calls)
    • 일반적으로 프로세스는 자신의 주소 공간안에 존재하는 함수만 호출하여 실행 가능
    • 그러나, RPC를 이용하면 원격지의 프로세스에 접근하여 프로시저 또는 함수를 호출하여 사용 가능함
      • Stubs : 서버의 프로시저에 대한 원격 호출을 대행해주는 프로시저
  • 파이프(pipes)
    • 두개의 프로시저가 서로 통신이 가능하도록 전달자 역할 수행
    • 단방향 또는 양방향
    • 일반 파이프
      • 생성한 프로세스만 접근 가능
      • 생산자-소비자 형태로 두 프로세스간의 통신을 허용
      • 부모 프로세스가 파이프 생성, 자식 프로세스를 생성하여 통신
    • 지명 파이프(named pipe)
      • 지명 파이프를 사용하는 프로세스들은 부모-자식 관계가 필요하지 않음
      • 양방향 통신 가능
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.