[운영체제] Process Management

·2022년 1월 19일
1

OS

목록 보기
4/5
post-thumbnail

Process 생성

Copy-on-write (COW) : 내용이 바뀔 때 복사해서 만듦

  • 부모 프로세스(Parent process)가 자식 프로세스(Children process) 생성
    • OS 시스템콜로 생성함
    • 프로세스의 트리(계층 구조) 형성
    • 프로세스는 자원을 필요로 함
      • 운영체제로 부터 받음
      • 부모와 공유
    • 자원의 공유
      • 부모와 자식이 모든 자원 공유 모델
      • 일부 공유 모델
      • 전혀 공유하지 않는 모델
    • 수행 (Execution)
      • 부모와 자식은 공존하며 수행되는 모델
      • 자식이 종료(terminate)될 때까지 부모가 기다리는(wait, blocked) 모델
    • 주소 공간 (Address space)
      • 자식은 부모의 공간을 복사함 (binary and OS data) 프로세스 문맥.
      • 자식은 그 공간에 새로운 프로그램을 올림
      • 유닉스 예)
        • fork() 시스템 콜이 새로운 프로세스를 생성
          • 부모를 그대로 복사 (OS data except PID + binary)
          • 주소 공간 할당
        • fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림

Process 종료 (Process Termination)

  1. 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit)
    a. 자식이 부모에게 output data를 보냄 (via wait)
    b. 프로세스의 각종 자원들이 OS에게 반납
    c. 자발적인 종료
  2. 부모 프로세스가 자식 수행 종료시킴 (abort)
    a. 비자발적 종료
    b. 자식이 할당 자원의 한계치 넘어섬
    c. 자식에게 할당된 테스크가 더 이상 불필요 (더이상 시킬일 없을경우)
    d. 부모가 종료(exit)하는 경우
    • OS는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않음
    • 단계적인 종료 (자손 < 자식 < 부모 순으로 종료시킴)

fork() 시스템 콜

    int main()
    {
    	int pid;
    	// 부모 프로세스만 출력됨
    	printf("\n Hello, only parent!\n");
    	pid = fork(); // return value가 다름
    	if (pid == 0)
    		printf("\n Hello, I am children!\n");
    	else if (pid > 0)
    		printf("\n Hello, I am parent!\n");
    }

💥 자식 프로세스는 부모 프로세스 문맥(program counter)을 복제하기 때문에 main()함수 부터 시작하지 않고 fork() 뒤 다음시점부터 실행함

exec() 시스템 콜

완전히 새로운 프로그램으로 덮어씌우는 콜

  int main()
  {
  	int pid;
  	pid = fork(); // return value가 다름
  	if (pid == 0)
  		printf("\n Hello, I am children!\n");
  		execlp("/bin/date","/bin/date",(char*) 0);
  	else if (pid > 0)
  		printf("\n Hello, I am parent!\n");
  }

💥 자식 프로세스는 bin/date라는 함수를 실행 후 종료. 돌아올 수 없음. 새로운 프로그램으로 덮어썼기 때문

 int main()
 {
 	printf("1");
      	// 함수, argument 콤마로 구분, (char*) 0
     	execlp("echo","echo",(char*) 0);
     	printf("2"); // 출력 2는 실행이 안됨
 }

wait() 시스템 콜

자식이 종료까지 부모가 기다리는 모델

  1. 프로세스 A wait() 시스템콜 호출
  2. 커널은 child가 종료될 때 까지 부모프로세스 A를 sleep 시킴 (block상태)
  3. Child process가 종료되면 커널은 프로세스 A를 깨움 (ready 상태)
main(){
	int childPID;
	S;
	childPID = fork();

	if(childPID == 0)
		//code for child process
	else {
		wait();
	}
	S;
}

exit() 시스템 콜

프로세스의 종료

  • 자발적 종료
    a. 마지막 statement 수행 후 exit() 시스템 콜을 통해
    b. 프로그램에 명시적으로 넣어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌
  • 비자발적 종료
    1. 부모 프로세스가 자식 프로세스 강제 종료
      • 자식 프로세스가 한계치를 넘어서는 자원 요청
      • 자식에게 할당된 테스크 더 이상 불필요
    2. 키보드로 kill, break 등 입력한 경우
    3. 부모가 종료하는 경우
      • 부모 프로세스 종료 전 자식들 먼저 종료됨

프로세스 간 협력

  1. 독립적 프로세스
    • 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
  2. 협력 프로세스
    • 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
    • 프로세스 간 협력 메커니즘 (IPC: Interprocess Communication)
    1. 메시지 전달 방법
      • message passing : 커널 통해 메시지 전달
    2. 주소 공간 공유
      • shared memory
        1. 서로 다른 프로세스 간 일부 주소 공간을 공유하게 하는 메커니즘
        2. 커널에게 사용한다고 말해야 함
        3. 서로 신뢰할 수 있는 프로세스
        ❗ thread : thread는 사실상 하나의 프로세스이므로 프로세스간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간 주소 공간을 공유하므로 협력 가능
  • Message Passing Message system
    • 프로세스 사이 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
    1. Direct Communication

      • 통신하려는 프로세스의 이름 명시적으로 표시

    2. Indirect Communication

      • mailbox (또는 port)를 통해 메시지 간접 전달

출처

http://www.kocw.net/home/search/kemView.do?kemId=1046323

0개의 댓글