Process Management

이연중·2021년 11월 4일
0

OS

목록 보기
4/9

프로세스 생성


  • Copy-on-write(COW) 기법: 자식 프로세스가 부모 프로세스를 공유만 하고 있다고, 수정 사항이 생기면 해당 부분만 copy하는 기법(복제 생성이 아닌 방식)

  • 부모 프로세스가 자식 프로세스 생성(복제 생성)

  • 프로세스의 트리(계층 구조) 형성

  • 프로세스가 실행되기 위해서는 자원을 필요로 함

    • 운영체제로부터 받음
    • 부모와 자원을 공유하는 경우도 있음
  • 자원의 공유

    • 부모 자식 간 모든 자원을 공유하는 모델
    • 일부 공유하는 모델
    • 공유하지 않는 모델(일반적)
  • 수행

    • 부모와 자식이 공존하며 수행되는 모델
    • 자식이 종료될 때까지 부모가 기다리는 모델
  • 주소 공간

    • 자식은 부모의 공간을 복사(복제 생성되기 때문. 부모의 프로세스 문맥을 복사)
    • 자식은 해당 공간에 새로운 프로그램 로드
  • 유닉스 예

    • fork() 시스템 콜이 새로운 프로세스 생성(복제 생성)
    • exec() 시스템 콜을 통해 새로운 프로그램 메모리에 로드

프로세스 종료


  • 프로세스가 마지막 명령을 수행한 후 운영체제에 이를 알림(exit. 자발적 프로세스 종료 시스템 콜)
    • 자식이 부모 프로세스에 output data를 보냄(wait 시스템 콜을 통해)
    • 프로세스의 각종 자원들이 운영체제에 반납
  • 부모 프로세스가 자식 프로세스의 수행을 종료시킴(abort. 강제 종료 시스템 콜)
    • 자식이 할당해준 자원의 한계치를 넘어서는 경우
    • 자식에게 할당된 태스크가 더 이상 필요하지 않은 경우
    • 부모가 종료(exit)하는 경우
      • 운영체제는 부모 프로세스가 종료하는 경우 자식 프로세스를 종료시킴
      • 종료는 단계적으로 이루어짐(손자 프로세스 종료 -> 자식 프로세스 -> 부모 프로세스 종료 순으로)

fork() 시스템 콜


  • 프로세스는 fork() 시스템 콜을 통해 만들어짐

    int main(){
        int pid;
        printf("\n 부모 프로세스만 출력할 수 있는 부분");
        pid= fork(); //fork 시점 이후부터 자식 프로세스가 실행됨(부모 프로세스의 PC를 자식이 알고 있기					  때문에(문맥을 복사했기 때문))
        			 //fork()의 리턴으로 pid가 오는데, 부모 프로세스의 pid는 양수이고, 자식 프로세스					는 0(구분가능)
        if(pid==0)
            printf("\n Hello, I'm Child Process");
        else if(pid>0)
            printf("\n Hello I'm Parent Process");
        ...
    }

exec() 시스템 콜


  • 프로세스는 exec() 시스템 콜을 통해 다른 프로그램을 실행할 수 있음

    int main(){
        int pid;
        pid= fork();
        if(pid==0){
            printf("Hello I'm Child");
            execlp("/bin/date", "/bin/date",(char*)0);//이 함수가 exec() 시스템 콜을 함
            										  //자식 프로세스는 date라는 프로그램을 덮													 어씌우게 됨(새로운 프로그램 실행).														 자식 프로세스는 해당 프로그램이 종료되면 												 수행을 다함. 다시 이곳으로 돌아올 수는 없음
        }
        else if(pid>0) printf("Hello I'm parent");
        ...
    }

wait() 시스템 콜


  • 자식 프로세스가 종료될 때까지 부모 프로세스는 sleep(block) 상태로 만듦

  • 자식 프로세스가 종료되면 부모 프로세스를 깨움(ready 상태)

    int main(){
        int childPID;
        
        childPID= fork();
        
        if(childPID==0){
            ...
        }else{
            wait()
        }
        ...
    }
  • ex) 리눅스의 명령 프롬프트에서 특정 프로그램의 이름을 입력하면, 명령 프롬프트라는 부모 프로세스가 특정 프로그램이라는 자식 프로세스를 생성하고 해당 프로그램이 종료될때까지 wait 했다가 다시 명령줄을 입력할 수 있게 함(자식 프로세스 종료전까지는 명령줄 입력 x)


exit() 시스템 콜


  • 프로세스 종료 시 사용하는 시스템 콜
  • 자발적 종료
    • 마지막 명령 수행 후 exit() 시스템 콜 명시적으로 입력
    • 또는, 함수의 리턴 위치에 컴파일러가 넣어줌
  • 비자발적 종료
    • 부모 프로세스가 자식 프로세스 강제 종료시킴
      • 자식 프로세스가 할당된 자원 한계치 초과
      • 자식에게 할당된 태스크가 불필요해진 경우
    • 키보드로 kill, break 등 명령을 입력한 경우
    • 부모가 종료되는 경우
      • 자식 프로세스들을 먼저 종료 후 부모 프로세스 종료(순차적으로. 트리의 밑에서 위로)

프로세스 간 협력


  • 독립적 프로세스

    • 프로세스는 각자의 주소 공간을 가지고 수행되므로, 원칙적으로는 하나의 프로세스가 다른 프로세스의 수행에 영향을 끼치지 않음
  • 협력 프로세스

    • 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
  • 프로세스 간 협력 메커니즘(IPC: Interprocess Communication)

    • 메세지 전달 방법
      • Message Passing: 커널을 통해 메세지 전달
        • Direct Communication: 통신하려는 프로세스의 이름을 명시적으로 표시
        • Indirect Communication: mailbox(or port)를(커널에 mailbox가 있음) 통해 메세지 간접 전달
    • 주소 공간 공유 방법(커널에 공유하는 영역에 대해 알리는 시스템 콜을 먼저 해야함)
      • Shared Memory: 서로 다른 프로세스 간 일부 주소 공간을 공유

참고

https://core.ewha.ac.kr/publicview/C0101020140307151724641842?vmode=f

profile
Always's Archives

0개의 댓글