[KOCW 반효경 운영체제] 4. Process Management
Computer Science/Operating System

[KOCW 반효경 운영체제] 4. Process Management

728x90

http://www.kocw.net/home/cview.do?cid=3646706b4347ef09

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net


프로세스 생성 (Process Creation)

  • 운영체제가 최초의 프로세스를 생성하면, 이미 존재하는 프로세스가 다른 프로세스를 복제 생성한다. 이때 기존 프로세스를 부모 프로세스(Parent process)라 하고, 새로 생긴 프로세스를 자식 프로세스(children process)라고 부른다.
  • 프로세스의 트리(계층 구조) 형성
  • 프로세스는 자원을 필요로 함
    • 운영체제로부터 받는다.
    • 부모와 공유한다
  • 자원의 공유
    • 부모와 자식이 모든 자원을 공유하는 모델
    • 일부를 공유하는 모델
    • 전혀 공유하지 않는 모델 (원칙적으로는 자원을 공유하지 않고 서로 자원을 차지하기 위해 경쟁한다. 좀 더 효율적인 운영체제에서는 일단 카피하지 않고 부모의 주소 공간을 공유하고 있는다. 이런 상태로 실행되다가 부모와 내용이 달라지게 되면 부모와 공유하던 메모리 공간의 일부를 카피해서 가지게 된다. → Copy-on-write(COW))
  • 수행 (Execution)
    • 부모와 자식은 공존하며 수행되는 모델 (이때는 부모와 자식이 CPU를 획득하기 위해 경쟁하는 관계가 됨)
    • 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델
  • 주소 공간 (Address space)
    • 자식은 부모의 공간을 복사함 (프로세스 ID를 제외한 운영체제 커널 내의 정보와 주소 공간의 정보, binary and OS data)
    • 자식은 그 공간에 새로운 프로그램을 올림
  • 유닉스의 예
    • fork() 시스템 콜이 새로운 프로세스를 생성
      • 부모를 그대로 복사 (OS data except PID + binary)
      • 주소 공간 할당
    • fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림(덮어 씌운다)

프로세스 종료 (Process Termination)

  • 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit) → 자발적 종료
    • 자식 프로세스가 부모 프로세스보다 먼저 종료된다.
    • 자식이 부모에게 output data를 보냄 (via wait).
    • 프로세스의 각종 자원들이 운영체제에게 반납됨
  • 부모 프로세스가 자식의 수행을 종료시킴 (abort) → 비자발적 종료
    • 자식이 할당 자원의 한계치를 넘어섬
    • 자식에게 할당된 태스크가 더 이상 필요하지 않음
    • 부모가 종료(exit)하는 경우
      • 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다.
      • 단계적인 종료

fork() 시스템 콜

  • A process is created by the fork() system call.
    • creates a new address space that is a duplicate of the caller.
  • 운영체제는 자식 프로세스의 생성을 위해 fork() 시스템 콜을 제공한다.
  • 프로세스가 해당 시스템 콜을 호출하면 CPU의 제어권이 커널로 넘어가고, 커널은 fork()를 호출한 프로세스를 복제하여 자식 프로세스를 생성한다.
  • fork()를 수행하면 부모 프로세스의 주소 공간을 비롯해 프로그램 카운터 등 레지스터 상태, PCB 및 커널 스택 등 모든 문맥을 그대로 복제해 자식 프로세스의 문맥을 형성한다.
int main()
{ int pid;
	pid = fork();
	if (pid == 0) /* this is child */
		printf("\n Hello, I am child!\n");
	else if (pid > 0) /* this is parent */
		printf("\n Hello, I am parent!\n");
}
  • 자식 process는 생성된 후, main 함수의 시작부터 실행되는 것이 아니라 부모 process의 문맥을 이어받았기 때문에 fork() 함수가 실행된 이후부터 실행된다.
  • 부모 process와 자식 process의 fork() 함수 실행 리턴 값이 다르다.
    • 부모 process : pid > 0 (정확히는 자식 프로세스의 pid를 리턴 받는다.)
    • 자식 process : pid = 0
    • 부모 프로세스와 자식 프로세스의 fork() 결과값이 다르기 때문에, 두 프로세스에게 다른 일을 실행시킬 수 있다.
  • fork()의 결과값이 다른 것을 이용해서 서로 다른 일을 시킬 수 있지만, 결국 같은 주소 공간을 가지는 같은 프로그램이다. 다른 프로그램을 실행시키려면 exec() 시스템 콜을 호출하면 된다.

exec() 시스템 콜

  • A process can execute a different program by the exec() system call.
    • replaces the memory image if the caller with a new program.
  • 어떤 프로그램을 새로운 프로세스로 태어나게 하는 역할을 한다.
  • fork() 시스템 콜만으로는 같은 코드에 대해 조건을 분기하는 정도로 밖에 사용할 수 없다.
  • 자식 프로세스에게 부모 프로세스와는 독자적인 프로그램을 수행할 수 있는 메커니즘이 바로 exec() 시스템 콜이다.
  • 이 시스템 콜은 프로세스의 주소 공간에 새로운 프로그램을 덮어 씌운 후, 새로운 프로그램의 첫 부분부터 다시 실행하도록 한다.
  • 따라서 새로운 프로그램을 수행하기 위해서는 fork() 시스템 콜로 복제 프로세스를 생성한 뒤, exec() 시스템 콜로 해당 프로세스의 주소 공간을 새롭게 수행하려는 프로세스의 주소 공간으로 덮어 씌우면 된다.
int main()
{ int pid;
	pid = fork();
	if (pid == 0) /* this is child */
	{ printf("\n Hello, I am child! Now I'll run date \n");
		execlp("/bin/date", "/bin/date", (char*) 0);
	}
	else if (pid > 0) /* this is parent */
		printf("\n Hello, I an parent!\n");
}

wait() 시스템 콜

  • 프로세스 A가 wait() 시스템 콜을 호출하면
    • 커널은 child가 종료될 때까지 프로세스 A를 sleep시킨다. (block 상태)
    • child process가 종료되면 커널은 프로세스 A를 깨운다. (ready 상태)

exit() 시스템 콜

  • 프로세스의 종료
    • 자발적 종료
      • 마지막 statement 수행 후 exit() 시스템 콜을 통해
      • 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌

abort() 시스템 콜

  • 프로세스의 종료
    • 비자발적 종료
      • 부모 프로세스가 자식 프로세스를 강제 종료시킴
        • 자식 프로세스가 한계치를 넘어서는 자원 요청
        • 자식에게 할당된 태스크가 더 이상 필요하지 않음
      • 키보드로 kill, break 등을 친 경우
      • 부모가 종료하는 경우
        • 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨

프로세스와 관련한 시스템 콜

  • fork() : create a child (copy)
  • exec() : overlay new image
  • wait() : sleep until child is done
  • exit() : frees all the resources, notify parent

프로세스 간 협력

  • 독립적 프로세스(Independent process)
    • 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
  • 협력 프로세스 (Cooperating process)
    • 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
  • 프로세스 간 협력 메커니즘(IPC: Interprocess Communication)
    • IPC는 프로세스들 간의 통신과 동기화를 이루기 위한 메커니즘을 의미한다.
    • 메시지 전달 방식(커널을 통해 메시지 전달)과 공유 메모리 방식(일부 주소 공간을 공유)이 있다.

  • 메시지를 전달하는 방법
    • 프로세스 간에 공유 데이터를 일체 사용하지 않고 메시지를 주고 받으면서 통신하는 방식
    • message passing: 커널을 통해 send와 receive 연산을 제공 받아 메시지를 보낸다.
  • 주소 공간을 공유하는 방법
    • shared memory: 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
    • thread: thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능

Message Passing

  • Message system
    • 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
  • Direct Communication (직접 통신)
    • 통신하려는 프로세스의 이름을 명시적으로 표시
    • 각 쌍의 프로세스에게는 오직 하나의 링크만 존재한다.

  • Indirect Communication (간접 통신)
    • mailbox (또는 port)를 통해 메시지를 간접 전달
    • 각 메일 박스에는 고유의 ID가 있으며 메일 박스를 공유하는 프로세스만 통신할 수 있다.
    • 하나의 링크가 여러 프로세스에게 할당될 수 있다.

Shared Memory

  • 공유 메모리 방식은 프로세스들이 주소 공간의 일부를 공유한다.
  • 서로의 데이터에 일관성 문제가 유발될 수 있다.
  • 프로세스 간 동기화 문제를 스스로 책임져야 한다.

 

참고 - https://steady-coding.tistory.com/527

728x90