[운영체제] CPU 스케줄링

ryun·2023년 3월 27일
0

운영체제

목록 보기
6/17

*fork의 리턴으로 부모는 자식의 pid 값이 넘어오고, 자식은 0이 넘어오기 때문에 서로 다른 일을 할 수 있다

exec()

하나의 프로세스를 완전히 새로운 프로세스로 덮어씌운다

execlp()

프로그램을 완전히 새로운 프로그램으로 덮어씌우는 역할을 한다
누군가가 만든 독립적인 프로그램

  • 끝나고 원래 프로그램으로 되돌아오지 않는다
  • 뒤에 어떤 코드를 넣어놓아도 실행하지 않는다
  • 부모 프로세스
    • 포크 한 뒤에 프린트
  • 자식 프로세스
    • eseclp로 data라는 프로그램을 덮어씌우고 실행

wait () 시스템 콜

*프로세스는 자기 주소 공간이 있다 (코드 / 데이터 / 스택)

fork로 똑같은 자식 프로세스가 만들어 짐>
fork 결과값이 0이 아닌 경우에(부모 프로세스에) wait 이라는 시스템 콜 >
자식이 끝날 때까지 부모 프로세스를 블록 상태로 슬립을 시킨다

wait 콜 호출하지 않으면 부모와 자식은 CPU를 두고 경쟁관계

프로세스가 블럭 상태에 들어간 경우

  • 오래 기다려야 하는 작업이 있을 때 블럭 상태 (공유 데이터 기다리는 경우 등)
  • waiting 시스템 콜을 해서 자식 프로세스의 종료를 기다리면서 블럭 된 경우도 있을 수 있다
    • 부모 프로세스가 자식 종료될 때까지 블럭 상태가 되어서 CPU를 얻지 못한다
    • 자식이 종료되면 다시 부모가 CPU 얻을 수 있다

exit()

프로세스를 종료시키는 시스템 콜

  • 자발적 종료

    • 프로그램에서 자체적으로 명시적으로 exit 호출 가능
    • 프로그래밍할 때, exit 넣어주지 않더라도 모든것이 끝날 때 컴파일러가 넣어줌
  • 비자발적 종료

    • 원하지 않는데 강제 종료되는 경우
      (부모가 자식 강제종료 등, 사람이 키보드에서 kill/break 커맨드로 프로세스 죽이는 경우, 브라우저 창의 엑스)
    • 부모가 먼저 종료되면 부모 죽기 전에 자식 먼저 종료
  • exit()은 모든 자원 반납하고 부모 프로세스에게 죽는다는 것을 전달한다

프로세스 간 협력

  • 원래 프로세스는 협력하지 않는다(=경쟁)
    • 독립적으로 동작한다
    • A프로세스가 B의 메모리 공간을 볼 수 없다
    • 프로세스는 항상 자기 자신의 주소 공간만을 볼 수 있다

프로세스가 협력하는 경우

IPC를 통해서 정보 주고받고 협력

  • shared memory

    • 프로세스 A와 B 겹쳐지는 메모리를 공유
      운영체제한테 시스템 콜 요청 >
      공유할 메모리 공간 정해지면 메모리를 공유(서로 데이터를 읽을 수 있다)
      신뢰할 수 있는 경우 공유해도 문제 없지만아니면 문제가 생길 수도 있다
  • 메시지 패싱

    • 프로세스가 다른 프로세스에게 메시지 전달
  • 스레드

    • 별도의 프로세스 X
    • 하나의 프로세스 안에 CPU 수행단위인 스레드가 여러 개 존재
    • 프로세스 내 스레드 간에는 메모리 공간이 하나 뿐. 따라서 스레드들 끼리는 협력이 훨씬 쉽다
    • 스레드 만들어지는 것 자체가 메모리 공간이 공유되는 것
      P가 Q한테 메시지를 전달

메시지 패싱

운영체제(커널)가 매개가 되어서 운영체제한테 시스템 콜하면 운영체제가 메시지 패싱

패싱 방법 2가지

  • 다이렉트

    • 누구한테 보낼지 명시
  • 인다이렉트

    • 메일박스나 포트에 집어넣는 것
    • P가 누구한테 전달할지 모른다
    • 정해지지 않은 누군가가 메시지를 받을 수 있음

프로세스의 일생


아래 두 가지 작업이 반복

  • CPU 버스트
    • CPU에서 기계어를 실행하는 단계
    • 초당 많은 기계어를 실행
  • I/O 버스트
    • I/O 작업을 하는 단계(오래걸림))
    • CPU를 빼앗기고 블럭 상태

CPU 버스트 타임 분포

  • X축 (버스트 시간)
    • 버스트 시간이 긴 프로그램들과 짧게 쓰는 프로그램들이 존재

  • 길게 쓰는 프로그램: CPU 바운드 잡 (프로세스)
    • 과학계산, 연산량 많은 프로세스들
  • 짧게 쓰는 프로그램: I/O 바운드 잡 (사람하고 인터랙션 하는 프로그램)
    • 사람과 인터랙션 하는 프로세스들

CPU를 누구에게 먼저 줘야 하는가?

서로 다른 작업들이 섞여있는 시스템 안의 자원이 효율적으로 사용되기 위해서 CPU 스케줄링이 중요하다

  • CPU 스케줄러
    • ready 상태의 프로세스 중에서 누구한테 CPU 줄지 결정
  • 디스패처 => 소프트웨어(운영체제 안에 있는 특정 역할을 하는 코드 일부)
    • 결정된 프로세스한테 CPU 넘기는 역할
      빼앗기는 문맥을 세이브, 얻는 프로세스의 문맥 로드

스케줄링 일어났을 때의 상태변화

  • CPU 얻으면 ready에서 running
  • 빼앗길 때는 running에서 ready
    (CPU 쓰고싶은데 타이머 인터럽트로 강제로 빼앗는 것)
  • running에서 blocked
    (쓰다가 I/O 같이 오래걸리는 작업 하게 되면 다른 사람한테 CPU를 주는 것)
  • I/O가 끝나면 blocked에서 ready (CPU 얻는 권한 생김) (우선순위가 높으면 I/O 끝나자마자 CPU 얻을 수 있음)
  • 종료되었을 때 터미네이티드

preemptive : 강제로 빼앗을 수 있는 것
nonpreemptive : 빼앗을 수 없는 것

1번(더이상 CPU 필요없음)과 4번(끝남)은 nonpreemptive 자진해서 CPU 내어놓는 것
2, 3번은 나머지는 계속 쓰고싶은데 정책상 빼앗는 것

타이머 줘서 계속 빼앗는다 => preemptive
아이오 하러갈 때까지 안 빼앗는다 => nonpreemptive

성능 척도 (3가지)

  • 이용률
    일한 시간의 비율
    높을 수록 좋다

  • 처리량 (시스템 입장)
    얼마나 많은 일을 했는지
    단위 시간당 처리량 많을수록 좋다

  • 나머지 세개

    • 시간 관련 (고객 입장)
      빠른게 좋다
  • 소요 시간, 반환 시간

    • 전체 시간 (기다린 시간 + CPU 사용시간)
  • 대기 시간

    • 쓰러와서 기다린 전체 시간(기다린 시간의 합)
    • 얻었다가 뺏기고 레디큐에 줄 서고 또 쓰고 줄 서있던 모든 대기 시간들을 다 합친 것
  • 응답 시간

    • 프로세스가 CPU를 쓰러 들어와서 최초로 CPU 얻기까지 걸린 시간
      (I/O 끝날때까지 기다리는 시간, 레디큐 줄에 있다가 얻는 시간 등)

0개의 댓글