[운영체제] CH03-2. 프로세스 스케줄링과 프로세스 연산

PikminProtectionAssociation·2024년 11월 8일

행성 탈출기

목록 보기
10/21
post-thumbnail

Process Scheduling

  • 멀티프로그래밍의 목적은 CPU 이용을 극대화하기 위해서 CPU가 멈추지 않고 항상 어떤 프로세스든 실행하도록 하는데 있음
  • Process Scheduler : 실행 가능한 여러 개의 프로세스들 중 하나의 프로세스를 선택하는 작업 수행

  • Scheduling Queue : scheduler의 선택 대상이 되는 프로세스들을 모아놓는 큐
    • kernel 내에는 많은 scheduling queue가 있으며, scheduling queue마다 해당 queue에 대해 동작하는 scheduler가 있음
    • Ready Queue : 메인 메모리에 있으며 즉시 실행 가능한 프로세스들의 큐 (ready 상태의 프로세스들)
    • Device Queue : 장치마다 하나씩 존재하며 해당 device에 대해 입출력을 개시하고 완료를 기다리는 프로세스가 속하는 큐 (waiting 상태의 프로세스들)
    • Job Queue : 시스템에 있는 모든 프로세스들이 포함되어 있는 큐 (전체 프로세스 목록)

Schedulers

  • scheduling queue로부터 특정 프로세스를 선택하는 동작을 하는 kernel의 module
  • Short-term scheduler (CPU scheduler)
    • 다음 번에 실행할 프로세스를 선택해서 이 프로세스에 CPU를 할당하는 역할
    • ready queue에 대해 동작
    • 매우 빈번하게 실행되며, time sharing system에서는 수 millisecond마다 동작
  • Long-term scheduler (job scheduler)
    • 어느 프로세스를 ready queue로 가져올지 정함 (new -> ready)
    • 프로세스가 ready 상태가 되면 해당 프로세스가 현재 실행 중인 프로세스로 count 됨
    • 즉 Long-term scheduler는 멀티프로그래밍 상황에서 degree of multiprogramming을 조절하는 역할
    • 수초 또는 수분마다 동작
  • 성향에 따른 프로세스 구분
    • I/O bound process : CPU를 사용하는 계산보다는 입출력 위주로 동작하는 프로세스로, CPU burst가 굉장히 짧음
      • CPU burst : 프로세스가 CPU를 사용하는 구간
    • CPU-bound process : 입출력보다는 계산을 위주로 하는 프로세스로, CPU burst가 김
  • 전체 프로세스 중 I/O-bound가 너무 많으면 ready queue가 비어서 CPU scheduler가 할 일이 없어지고, CPU-bound가 너무 많으면 각종 입출력 장치들의 I/O queue가 비어서 입출력 장치가 할 일이 없어짐
    적절한 비율을 유지하는 것이 Long-term scheduler의 몫

  • Medium-term scheduler
    • 일부 프로세스를 swap device라고 부르는 디스크 영역으로 내쫓는 역할
    • degree of multiprogramming을 증가시키는 속도를 조절하기 위해 swapping을 수행
      • Long-term scheduler는 degree of multiprogramming을 감소시키지는 않음 (프로세스가 종료하면서 자연스럽게 감소할 뿐)
    • swapping : 메인 메모리에 빈 공간을 확보하기 위해 kernel이 일부 프로세스의 메모리 이미지를 swap device라고 하는 디스크 공간으로 내보냈다가 프로세스 수가 줄어들면 다시 메인 메모리로 불러들이는 동작

Context Switch

  • 이전 프로세스의 상태를 지정하고 다음 프로세스의 상태를 복원하는 과정
  • 프로세스의 Context : 사용 중인 CPU 레지스터 값
    • 프로세스의 메인 메모리 상의 내용들을 통칭하는 용어
    • PCB에 기록되어 있음
  • context switch에 걸리는 시간이 그 자체로 시스템의 오버헤드
  • 가급적 짧고 신속하게 하는 것이 좋으며, 전체적인 context switch 횟수도 multiprogramming의 효율을 고려해서 너무 빈번하게 하지 않는 것이 좋음






Operations on Process

  • kernel이 프로세스에 대해 제공하는 연산
  • 대표적으로는 프로세스 생성, 종료, 대기 연산이 있음
  • 주로 시스템콜 형태로 사용자에게 제공됨

Process Creation

  • kernel이 제공하는 연산을 통해 새로운 프로세스를 생성할 수 있음
  • 기존 프로세스를 parent 프로세스, 새로 생성된 프로세스를 child 프로세스라고 함
  • child가 또 다른 child를 생성함으로써 프로세스가 tree가 형성됨
  • 각 프로세스는 pid로 식별
  • parent 프로세스와 child 프로세스의 관계
    • Resource sharing options
      • 자원 모두를 공유하는 모델도 있고 일부를 공유하거나 아예 공유하지 않는 모델도 있음
      • 많은 OS에서 부모 프로세스가 가진 자원을 자식 프로세스에게 물려줌
    • Execution options
      • 부모 프로세스와 자식 프로세스는 동시에 실행할 수도 있고, 부모 프로세스가 자식 프로세스의 종료를 기다릴 수도 있음
    • Address options
      • 부모 프로세스의 주소 공간을 그대로 복제하여 자식 프로세스의 주소 공간으로 삼음
      • 자식 프로세스는 생성 직후 부모 프로세스와 동일한 메모리 상의 이미지를 가짐

  • UNIX

    • fork() : 새로운 프로세스 생성
      • fork를 호출한 프로세스를 그대로 복제하여 새로운 프로세스를 생성
    • exec() : 자식 프로세스는 전형적으로 생성 직후 exec 시스템콜을 호출
      • exec를 호출한 프로세스의 주소 공간을 시스템콜에서 지정한 실행 파일의 내용으로 교체
      • 자식 프로세스는 exec를 호출함으로써 부모와는 다른 자신의 프로그램을 실행하게 됨
  • C Program Forking Separate Process

    #include <sys/types.h>
    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
      pid_t pid;
      
      /* fork a child process */
      pid = fork();
      
      if (pid < 0) { 					/* error ocrrueed */
      	fprintf(stderr, "Fork Failed");
          return 1;
      } 
      else if (pid == 0) {  			/* child process */
      	execlp("/bin/ls", "ls", NULL);
      }
      else {  							/* parent proces */
      	wait(NULL);
          printf("Child Complete");
      }
      
      return 0;
    }
    • 부모와 자식 프로세스는 fork의 리턴 값이 다름
      • 부모에게는 새로 만들어진 자식 프로세스의 pid가 주어지며, 이 값으 보통 양수
      • 자식 프로세스는 부모 프로세스와 구분하기 위해 리턴 값 0이 주어짐
    • fork가 리턴하는 시점부터 자식 프로세스가 이미 생성된 상태
      • 자식 프로세스는 부모 프로세스와 똑같은 코드를 가지고 실행하게 되며, 구체적인 실행 시작 지점은 fork return 직후가 됨
    • 자식 프로세스가 exec 콜을 실행하면 이 프로그램은 메모리 상에서 사라지고 그 자리를 ls라는 프로그램이 대체하게 됨
      • exec는 프로세스 자체는 그대로 유지하되 프로세스가 실행하는 프로그램만 새로운 것으로 대체하므로, 새로운 프로세스가 생성되는 것은 아님

Process Termination

  • exit() 시스템콜은 프로세스 종료 기능을 수행
  • 하나의 정수 parameter를 가지는데, 이 값은 보통 exit status라고 불리며 wait을 통해 이 값을 부모 프로세스에 전달함
  • abort() : 자식 프로세스를 비정상적으로 종료시키는 시스템콜
    • 자식 프로세스를 강제 종료하기 위해 부모 프로세스가 호출하는 시스템콜
    • 자식 프로세스의 자원 사용량이 지나치게 많을 경우
    • 자식 프로세스가 수행하는 작업이 더이상 필요없을 경우
    • 부모 프로세스가 먼저 exit 하면서 자식 프로세스가 남아있는 것을 허용하지 않는 경우
  • 일부 OS는 부모 프로세스가 먼저 종료하는 경우 자식 프로세스가 존재하는 것을 허용하지 않음
    • cascading termination : 한 프로세스가 종료할 때 자식 프로세스가 존재하는 경우 OS는 자식 프로세스 및 하위 프로세스 tree 상의 모든 프로세스들을 강제 종료시킴
  • wait() : 부모 프로세스가 자식 프로세스의 종료를 기다리기 위해 사용하는 시스템콜
    • 일단 프로세스가 exit()을 하고 나면 상태가 terminated로 변하는데, 이는 완전 소멸된 프로세스는 아님
    • terminated 상태의 프로세스에 대해 부모 프로세스가 wait()을 해서 wait()이 리턴하면 프로세스가 완전히 소멸하게 됨
  • zombie : 자식 프로세스가 exit 했는데 부모가 wait을 호출하지 않는 경우
  • orphan : 부모 프로세스가 먼저 종료하고 자식 프로세스는 아직 동작하고 있는 경우



참고 자료 : Operating System Concepts Essentials
*이미지 자료는 교재 자료를 직접 다시 만든 것으로 무단 불펌 금지입니다




다 끝난 줄 알았는데 아직 반 넘게 남았을 때의 기분이란,,

다음 편은 프로세스 간 통신으로 ~.~

끗!

0개의 댓글