CS/운영체제

[운영체제] KOCW 반효경 교수님 강의 - 9. Process Management 2

pythaac 2022. 3. 30. 03:27
  • 프로세스 생성
    • 부모가 자식을 복제 생성
    • 문맥을 복제 (메모리, PC 등)
    • 그러나 쓰레드에서 본 것과 같이, 똑같은 내용을 2copy 만드는 것은 메모리 낭비
    • Copy on Write
      • 이로 인해, 자식 프로세스가 생성되면 부모 프로세스와 메모리를 공유하게됨
      • 자식이 명령어를 수행하면서 내용이 바뀔 때마다 copy
      • 즉, write를 할 때마다 copy
      • 최대한 공유하며 잘게 쪼게진 단위로만 copy
    • fork, exec
int main()
{
    int pid;
    pid = fork();
    if (pid == 0)        printf("\n Hello, I am child!\n");
    else if (pid > 0)    printf("\n Hello, I am parent!\n");
}
  • fork() 시스템 콜
    • 자식 프로세스는 fork() 이후 부터 실행
      - 자식 프로세스 생성은 문맥 전체를 복사(Program Counter)
    • 부모는 pid > 0
    • 자식은 pid == 0
int main()
{
    int pid;
    pid = fork();
    if (pid == 0){
        printf("\n Hello, I am child! Now I'll run date \n");
        execlp("/bin/date", "/bin/date", (char *)0);
    }   
    else if (pid > 0)    printf("\n Hello, I am parent!\n");
}
  • exec() 시스템 콜
    • /bin/date의 시작부분부터 실행
    • 자식을 만들어야 실행할 수 있는 것은 아님
  • wait() 시스템 콜
    • 부모는 자식이 종료될 때까지 blocked
    • 자식이 종료되면 ready

  • exit() 시스템 콜
    • 자발적 종료
      • 마지막 명령 수행 후 (main의 마지막) -> 컴파일러가 삽입
      • 중간에 exit() 명령을 만나는 경우
    • 비자발적 종료
      • 부모 프로세스가 자식을 강제종료
      • kill을 치는 경우
      • 부모가 종료하는 경우
        - 부모 프로세스가 종료하기 전에 자식들을 먼저 다 죽이고 죽음

  • 프로세스간 협력
    • 독립적 프로세스
      - 보통 프로세스들은 다른 프로세스에게 영향을 미치지 못함
    • 협력 프로세스
      - 협력 메커니즘(IPC)으로 다른 프로세스 수행에 영향을 미침
    • IPC(Interprocess Communication)
      • 1. message passing
        - 커널을 통해 메시지를 전달
      • 2. shared memory
        - 주소공간을 두 프로세스가 공유
        - 일부 영역을 mapping할 때, 두 프로세스가 같은 영역에 mapping
        - 1) 처음에 두 프로세스가 커널에게 shared memory를 사용하겠다고 알림
        - 2) 그 이후로는 커널없이 두 프로세스가 공유된 메모리로 데이터를 주고 받음
      • * Thread
        - IPC로 보긴 어려우나, 프로세스 내의 쓰레드들은 주소 공간을 공유하므로 협력이 가능

  • Message Passing
    • 프로세스 사이에서 공유 변수를 사용하지 않고 통신하는 시스템
    • 모두 커널을 통해 메시지를 전달
    • 1. Direct Communcation
      - 통신하려는 프로세스의 이름 명시
    • 2. Indirect Communication
      - mailbox에 메시지를 저장

  • CPU 스케줄링
    • 프로그램의 보편적인 path
      - 1) CPU 사용 (instruction 실행)
      - 2) I/O
      - 두 가지가 번걸아가며 진행
    • I/O bound job
      - CPU를 짧게 쓰고 I/O가 끼어드는 job
      - 빈도가 매우 높음
    • CPU bound job
      - CPU만 오래 쓰는 job
      - 빈도가 낮음
    • CPU 스케줄링이 필요한 이유
      - 여러 종류의 job이 섞여있음
      - I/O bound job은 주로 사람과 interaction이 있는 job
      - 따라서, response time을 줄이기 위해 I/O bound job에게 CPU가 우선적으로 많이 가는 것이 중요

  • CPU Scheduler & Dispatcher
    • CPU Scheduler와 Dispatcher는 운영체제의 커널 코드
    • CPU Scheduler
      - 어떤 프로세스에게 CPU를 할당할지 결정
    • Dispatcher
      - CPU scheduler가 선택한 프로세스에게 CPU를 넘겨주는 역할
  • CPU 스케줄링이 필요한 경우
    • 1. Running -> Blocked : I/O와 같이 오래 걸리는 작업을 하러 간 경우 (자진해서 CPU 반납)
    • 2. Running -> Ready : 시간 만료 (CPU를 빼앗는 경우)
    • 3. Blocked -> Ready : I/O 완료 (우선순위가 높은 프로세스라면 바로 실행)
    • 4. Terminate
    • 1번과 4번 : 자진 반납 (non-preemptive)
    • 2번과 3번 : 강제로 빼앗김 (preemptive)