[혼공학습단 9기] 혼공컴운 4주차

Pt J·2023년 1월 30일
0
post-thumbnail

학습 범위

운영체제가 무엇인지 알아보고, 프로세스, 스레드, CPU 스케줄링의 개념을 알아보는 시간이다.

운영체제 시작하기

운영체제를 알아야 하는 이유

프로그램 실행에 필요한 요소들을 시스템 자원이라고 하는데,
실행할 프로그램에 이러한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램을
운영체제 OS; operating system 라고 한다.

운영체제는 컴퓨터가 부팅될 때 메모리 내 커널 영역 kernal space 라는 공간에 적재되며,
커널 영역을 제외한 공간은 사용자 영역 user space 으로, 일반적인 응용 프로그램이 적재된다.
커널 영역에 적재된 운영체제가 사용자 영역에 적재된 프로그램들에 자원을 할당하고 실행을 돕는 것이다.

운영체제가 하는 작업의 사례로는 다음과 같은 것들이 있다.

  • 메모리 관리
    실행할 프로그램을 메모리에 적재
    더 이상 실행되지 않는 프로그램을 메모리에서 삭제
  • CPU 관리
    어떤 프로그램부터 CPU를 이용하게 할지 결정
    얼마나 오랫동안 CPU를 이용하게 할지 결정
  • 입출력장치 관리
    복수의 프로그램이 동일한 입출력장치 접근 시도 시 동시 접근 방지

이외에도 다양한 역할이 있지만 세부적인 것들은 앞으로 차차 알아보도록 하자.

운영체제가 있기에 하드웨어를 조작하고 관리하는 기능을 직접 작성할 필요 없이
운영체제의 도움을 받아 프로그램을 간편하게 개발할 수 있다는 점.

컴퓨터 구조를 이해하면 문제 해결 능력을 키울 수 있다고 한 것과 같은 맥락에서
운영체제에 대한 이해 또한 문제 해결의 실마리를 찾는 데 도움이 된다.

더 알아보기

[컴퓨터 공학 기초 강의] 23강. 운영체제를 알아야 하는 이유】

운영체제의 큰 그림

세상에는 다양한 운영체제가 존재하며 운영체제가 응용 프로그램에 제공하는 서비스 종류도 다양하지만
어느 운영체제에나 존재하는 핵심적인 기능들이 있다.
운영체제의 핵심 서비스를 담당하는 부분을 커널 kernal 이라고 한다.
운영체제가 설치된 모든 기기에는 커널이 있다.

운영체제에 대해 다룰 때 대부분 운영체제의 핵심부, 즉 커널에 대해 이야기를 하며
앞으로 언급되는 "운영체제"는 대체로 커널을 지칭한다.
커널에 포함되지 않는 운영체제의 서비스에는 대표적으로 다음과 같은 것이 있다.

  • 사용자 인터페이스 user interface
    • 그래픽 유저 인터페이스 GUI; graphical user interface
      그래픽을 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스
    • 커맨드 라인 인터페이스 CLI; command line interface
      명령어를 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스

운영체제는 응용 프로그램이 시스템 자원에 접근하려고 할 때
오직 자신을 통해서만 접근하도록 하여 자원을 보호하는데
이 때 이중 모드시스템 호출이 사용된다.

  • 이중 모드 dual mode
    CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식
    • 사용자 모드 user mode
      운영체제 서비스를 제공받을 수 없는 모드.
      커널 영역의 코드 실행 불가.
      일반적인 응용 프로그램의 기본 실행 모드.
      입출력 명령어를 포함하여 하드웨어 자원에 접근하는 명령어 실행 불가.
    • 커널 모드 kernal mode
      운영체제 서비스를 제공받을 수 있는 모드.
      커널 영역의 코드 실행 가능.
      시스템 자원에 접근 가능.
  • 시스템 호출 system call
    사용자 모드로 실행 중인 프로그램이 운영체제 서비스를 받기 위해 운영체제에 보내는 요청.
    이를 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있다.
    소프트웨어 인터럽트로, 처리 순서는 하드웨어 인터럽트와 유사.
    시스템 호출 명령어 실행 시 CPU는 기존 작업을 백업하고 커널 내 시스템 호출을 수행하는 코드를 실행한 뒤 다시 기존 작업으로 복귀.

일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스를 빈번하게 이용하며
시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행된다.

우리는 운영체제의 세 가지 핵심 서비스를 다룰 것이다.

  • 프로세스 관리
    실행 중인 프로그램을 프로세스 process 라고 한다.
    일반적으로 CPU(코어)는 한 번에 하나의 프로세스만 실행할 수 있어 조금씩 번갈아가며 실행.
    다양한 프로세스를 일목요연하게 관리하고 실행할 수 있도록 한다.
  • 자원 접근 및 할당
    • CPU
      프로세스들에 공정하게 CPU를 할당하기 위한 CPU 스케줄링.
      어떤 프로세스부터 CPU를 이용하게 할 것이며 얼마나 오래 이용하게 할 것인지 결정.
    • 메모리
      새로운 프로세스가 적재될 때 어느 주소에 적재해야 할지 결정
      메모리 공간이 꽉 차 있거나 프로세스를 적재하지 못하는 상황 발생 시 처리
    • 입출력장치
      인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 존재
  • 파일 시스템 관리
    보조기억장치 속 데이터를 파일과 디렉터리로 관리하는 파일 시스템 file system

더 알아보기

[컴퓨터 공학 기초 강의] 24강. 운영체제의 큰 그림】
[컴퓨터 공학 기초 강의] 25강. 시스템 호출(system call) 직접 관찰하기】
【↗[저자 GitHub] 리눅스 시스템 호출 정리】

프로세스와 스레드

프로세스 개요

앞서 살짝 언급되었지만, 실행 중인 프로그램을 프로세스 process 라고 한다.
컴퓨터가 부팅되는 순간부터 수많은 프로세스들이 실행되는데,
유닉스 체계의 운영체제에서는 ps 명령어를 통해 실행 중인 프로세스를 확인할 수 있다.
(그냥 ps 만 하면 현재 터미널에서 실행 중인 프로세스를 확인할 수 있으며,
시스템 내 전체 프로세스를 확인하려면 -ef 와 같은 옵션을 설정해야 한다.)

다음은 그 출력 예시다.

새삼... 전원 안끈지 며칠이나 된 겨...;;ㅋㅋ

여기엔 직접 실행한 프로세스 외에도 운영체제에 의해 실행되는 다양한 프로세스가 존재한다.
윈도우 운영체제에서는 "작업 관리자"라는 것을 통해 GUI로 확인할 수 있다나.

  • 포그라운드 프로세스 foreground process
    사용자가 볼 수 있는 공간에서 실행되는 프로세스
  • 백그라운드 프로세스 background process
    보이지 않는 공간에서 실행되는 프로세스
    그 중에서도 사용자와 상호작용하지 않고 정해진 작업을 수행하는 것을 데몬 daemon 이라 한다.
    (윈도우 운영체제에서는 서비스 service 라고 한다나.)

프로세스 제어 블록

프로세스가 차례대로 돌아가며 한정된 시간만큼 CPU를 이용하기 위해 타이머 인터럽트가 사용되는데,
클럭 신호를 발생시키는 장치에 의해 주기적으로 타이머 인터럽트가 발생하면
프로세스가 자신의 차례를 양보하고 다음 차례가 올 때까지 기다린다.
그리고 이러한 작업을 하기 위해 운영체제는 프로세스와 관련된 정보를 저장하는 자료구조,
프로세스 제어 블록(PCB) process control block 을 이용한다.

PCB에는 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 포함되어 있으며, 커널 영역에 존재한다.
PCB에 담기는 정보는 운영체제마다 차이가 있지만 대표적으로 다음과 같은 것들이 있다.

  • 프로세스 ID PID; process ID
    프로세스를 식별하기 위해 부여하는 고유한 번호.
    같은 프로그램도 두 번 실행하면 PID가 다른 두 개의 프로세스 생성.
  • 레지스터 값
    자신의 실행 차례가 돌아오면 복원할 레지스터 값들을 백업한 것.
  • 프로세스 상태
    프로세스가 CPU를 이용하고 있는지, 기다리고 있는지, 입출력장치를 사용하려 하는지 등의 정보.
  • CPU 스케줄링 정보
    프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보.
  • 메모리 관리 정보
    프로세스가 어느 주소에 저장되어 있는지에 대한 정보.
    베이스 레지스터, 한계 레지스터 값과 페이지 테이블 정보.
  • 사용한 파일과 입출력장치 목록
    어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일을 열었는지 등의 정보.

문맥 교환

어떤 프로세스가 실행되다가 다른 프로세스에게 CPU 자원을 양보하는 상황에서
이전 프로세스가 사용하던 레지스터 값, 메모리 정보 등 중간 정보를 백업해야 하는데
이처럼 프로세스 수행을 재개하기 위해 기억해야 할 중간 정보를 문맥 context 이라고 한다.
문맥은 CPU 사용 시간이 다 되거나 인터럽트가 발생하면 해당 프로세스의 PCB에 백업되며,
프로세스 수행이 재개될 때 PCB에 기록되어 있는 문맥을 복구한다.

이전 프로세스의 문맥을 해당 프로세스의 PCB에 백업하고
다음 프로세스의 문맥을 해당 프로세스의 PCB로부터 복구하여
새로운 프로세스를 실행하는 과정을 문맥 교환 context switch 이라고 한다.

문맥 교환이 자주 일어나는 만큼 빠르게 번갈아가며 수행되어 마치 동시에 실행되는 것처럼 보인다.

프로세스의 메모리 영역

하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장.

  • 정적 할당 영역
    프로그램이 실행되는 동안 크기가 변하지 않는 영역
    • 코드 영역 code segment
      텍스트 영역 text segment 이라고도 불린다.
      기계어로 이루어진 명령어가 저장되는 읽기 전용 공간.
    • 데이터 영역 data segment
      전역 변수와 같이 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간.
  • 동적 할당 영역
    프로그램이 실행되는 동안 크기가 변할 수 있는 영역
    • 힙 영역 heap segment
      프로그래머가 직접 할당할 수 있는 공간.
      프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 언젠가는 반환해야 한다.
      반환하지 않는다면 메모리 낭비를 초래하게 되는데 이를 메모리 누수 memory leak 이라고 한다.
      일반적으로 메모리의 낮은 주소에서 높은 주소로 할당.
    • 스택 영역 stack segment
      잠깐 쓰다가 말 데이터를 일시적으로 저장하는 공간.
      함수의 실행이 끝나면 사라지는 매개 변수, 지역 변수 등.
      일시적으로 저장할 데이터를 PUSH, 더 이상 필요하지 않은 데이터를 POP.
      일반적으로 메모리의 높은 주소에서 낮은 주소로 할당.

더 알아보기

[컴퓨터 공학 기초 강의] 26강. 프로세스 개요】

프로세스 상태와 계층 구조

여러 프로세스들이 빠르게 번갈아가며 실행되는 과정에서
각각의 프로세스는 여러 상태를 거치며 실행되며
그 상태는 PCB를 통해 인식되고 관리된다.

프로세스 상태 표현 방식은 운영체제마다 차이가 있지만 대표적인 상태는 다음과 같다.

  • 생성 상태 new
    이제 막 메모리에 적재되어 PCB를 할당받은 상태.
    실행할 준비가 되면 준비 상태가 되어 CPU의 할당을 기다린다.
  • 준비 상태 ready
    당장이라도 CPU를 할당받아 실행할 수 있지만 자신의 차례가 아니기에 기다리고 있는 상태.
    차례가 되면 CPU를 할당받아 실행 상태가 되는데, 이를 디스패치 dispatch 라고 한다.
  • 실행 상태 running
    CPU를 할당받아 실행 중인 상태.
    타이머 인터럽트가 발생할 때까지 할당된 일정 시간 동안 CPU 사용 가능.
    할당된 시간이 끝나면 다시 준비 상태가 되며, 입출력 작업 등을 기다려야 한다면 대기 상태가 된다.
  • 대기 상태 blocked
    실행 도중 입출력장치를 사용하여 해당 작업이 끝날 때까지 기다리는 상태.
    입출력 작업이 완료되면 입출력 인터럽트를 받고 다시 준비 상태가 되어 CPU 할당을 기다린다.
  • 종료 상태 terminated
    프로세스가 종료된 상태.
    PCB와 프로세스가 사용한 메모리 정리.

프로세스 상태를 도표로 정리한 프로세스 상태 다이어그램 process state diagram 이라고 한다.

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있는데,
이 때 생성의 주체가 되는 프로세스를 부모 프로세스 parent process 라고 하며
생성의 객체가 되는 프로세스를 자식 프로세스 child process 라고 한다.
운영체제에 따라 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID parent PID 가 포함되기도 한다.

많은 운영체제들은 컴퓨터가 부팅될 때 실행되는 최초의 프로세스가 자식 프로세스를 생성하고
생성된 자식 프로세스가 또 다시 자식 프로세스를 생성하여 트리 구조를 이루는
프로세스 계층 구조로 프로세스들을 관리한다.

로그인 프로세스와 데몬은 최초의 프로세스의 자식에 해당한다는 건 여담.

최초의 프로세스는 운영체제마다 차이가 있는데
유닉스 운영체제에서는 init, 리눅스 운영체제에서는 systemd, macOS에서는 launchd 와 같으며,
그 PID는 항상 1이다.

pstree 명령어를 사용하면 다음과 같은 계층 구조를 확인할 수 있다.

부모 프로세스는 시스템 호출 fork를 통해 자신의 복사본을 자식 프로세스로 생성하고
자식 프로세스는 시스템 호출 exec을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

fork를 통해 프로세스를 복제하면 시스템 자원을 그대로 복사한 채
PID와 메모리 주소만 다르고 동일한 내용이 할당된다.

exec은 자신의 메모리 공간에 새로운 프로램을 덮어쓰는 시스템 호출로,
코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고 나머지 영역은 초기화된다.

만약 fork 후 자식 프로세스가 exec 을 하지 않는다면
부모 프로세스와 동일한 코드를 병렬적으로 실행하게 된다.

더 알아보기

[컴퓨터 공학 기초 강의] 27강. 프로세스 상태와 계층 구조】
[컴퓨터 공학 기초 강의] 29강. 파이썬 코드로 프로세스 확인하기】
【↗[저자 GitHub] Python으로 프로세스 다루기】
【↗[저자 GitHub] C/C++으로 프로세스 다루기】

스레드

전통적인 관점에서 보면 하나의 프로세스는 한 번에 하나의 일만을 처리하였으나
스레드 thread 라는 개념이 도입되며 한 번에 여러 일을 처리할 수 있게 되었다.

  • 프로세스를 구성하는 실행 단위
  • 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성
  • 힙, 데이터, 코드 영역 등 다른 프로세스 자원은 공유

기존의 한 번에 하나의 일만 처리하는 프로세스는 단일 스레드 프로세스라고 칭한다.

  • 멀티 프로세스 multi-process
    여러 프로세스를 동시에 실행하는 것
    기본적으로 프로세스끼리 자원을 공유하지 않는다
    하나에 문제가 생겨도 서로에게 영향력이 적다
    IPC, 공유 메모리 등으로 통신은 가능하지만 오버헤드 존재
  • 멀티 스레드 multi-thread
    프로세스 내에 여러 스레드를 동시에 실행하는 것
    같은 프로세스 내의 스레드끼리 프로세스 자원을 공유한다
    여러 프로세스를 병행 실행하는 것보다 메모리를 더 효율적으로 사용 가능
    협력과 통신에 유리

더 알아보기

[컴퓨터 공학 기초 강의] 28강. 스레드】
[컴퓨터 공학 기초 강의] 30강. 파이썬 코드로 스레드 확인하기】
【↗[저자 GitHub] Python으로 스레드 다루기】
【↗[저자 GitHub] C/C++으로 스레드 다루기】

CPU 스케줄링

CPU 스케줄링 개요

운영체제는 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하기 위해
CPU 스케줄링 CPU scheduling 을 수행한다.
프로세스마다 우선순위 priority 가 다르기 때문에 일반적으로 운영체제는 이를 반영하여 스케줄링한다.

  • 입출력 집중 프로세스 I/O bound process
    입출력 작업이 많은 프로세스.
    대표적으로 비디오 재생이나 디스크 백업 작업 등을 담당하는 프로세스
  • CPU 집중 프로세스 CPU bound process
    CPU 작업이 많은 프로세스.
    대표적으로 복잡한 수학 연산, 컴파일, 그래픽 처리 작업 등을 담당하는 프로세스

입출력 집중 프로세스와 CPU 집중 프로세스가 동시에 CPU 자원을 요구할 경우
입출력 집중 프로세스를 먼저 실행하여 입출력장치를 끊임없이 작동시키고
해당 프로세스가 입출력 작업을 하며 대기 상태로 존재하는 동안
CPU 집중 프로세스에 CPU를 집중적으로 할당하는 것이 효율적.
⇒ 일반적으로 입출력 집중 프로세스의 우선순위가 더 높다

프로세스의 우선순위는 ps -el 명령어로 확인할 수 있다.

운영체제는 각 프로세스의 PCB에 우선순위를 부여해해고 이를 기반으로 먼저 처리할 프로세스를 결정하는데
CPU를 사용할 다음 프로세스를 찾을 때마다 PCB를 일일이 확인하는 것은 비효율적이다.
따라서 프로세스의 상태별로 우선순위에 따라 줄을 세워두고 순서를 결정하는데
이 줄을 스케줄링 큐 scheduling queue 라고 한다.
(큐라고 하지만 엄밀히 말하면 일반적으로는 완전한 선입선출은 아닌 우선순위 큐)

  • 준비 큐 ready queue
    CPU를 이용하고 싶은 프로세스들이 줄을 서는 스케줄링 큐
  • 대기 큐 waiting queue
    입출력장치를 이용하기 위해 대기 상태에 접어든 프로세스들이 줄을 서는 스케줄링 큐
    특정 입출력장치별로 대기 큐가 존재
    입출력이 완료되어 완료 인터럽트 발생 시 대기 큐에서 제거되고 준비 큐로 이동

실행 중인 프로세스 우선순위가 더 높은 프로세스가 도착했을 때
실행 중인 것까지만 실행하고 우선순위가 높은 프로세스를 실행하는지
실행 중인 것을 중단하고 우선순위가 높은 프로세스를 먼저 실행하는지에 따라
스케줄링 기법이 구분된다.

  • 선점형 스케줄링 preemptive scheduling
    프로세스가 시스템 자원을 사용하고 있더라도 운영체제가 강제로 빼앗아 다른 프로세스에게 할당 가능
    어느 하나의 프로세스가 자원 사용을 독점할 수 없는 방식
    앞서 언급된, 타이머 인터럽트에 따라 CPU 자원을 뺏어 다음 프로세스에게 전달하는 것도 여기에 포함
    대부분의 운영체제에서 차용하고 있는 방식
    프로세스들에 골고루 자원을 배분할 수 있다는 장점
    문맥 교환 과정에서의 오버헤드 발생
  • 비선점형 스케줄링 non-preemptive scheduling
    프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까진 다른 프로세스가 끼어들 수 없는 방식
    어느 하나의 프로세스가 자원 사용을 독점할 수 있는 방식
    문맥 교환 시의 오버헤드는 적지만 모든 프로세스가 자원을 골고루 사용 불가

더 알아보기

[컴퓨터 공학 기초 강의] 31강. CPU 스케줄링 개요】

CPU 스케줄링 알고리즘

CPU 스케줄링 알고리즘은 다양하고 운영체제마다 다른 알고리즘을 사용하고 있지만
그 중 몇 가지 알고리즘에 대해 알아보도록 하겠다.

  • 선입 선처리 스케줄링
    FCFS 스케줄링 First-Come First-Scheduling 이라고도 불린다.
    준비 큐에 삽입된 순서대로 프로세스를 처리하는 비선점형 스케줄링 방식.
    CPU를 오래 사용하는 프로세스가 먼저 도착하면 프로세스들이 기다리는 시간이 매우 길어질 수 있는데
    이와 같이 CPU를 짧게 사용하는 프로세스가 CPU를 오래 사용하는 프로세스를 기다리며
    잠깐의 실행을 위해 오래 기다리게 되는 현상을 호위 효과 convoy effect 라고 한다.
  • 최단 작업 우선 스케줄링
    SJF 스케줄링 Shortest Job First Scheduling 이라고도 불린다.
    호위 효과를 방지하기 위해 CPU 사용 시간이 짧은 프로세스를 먼저 실행하는 비선점형 스케줄링 방식.
  • 라운드 로빈 스케줄링 round robin scheduling
    선입 선처리 스케줄링에 프로세스가 CPU를 사용할 수 있도록 정해진 시간,
    타임 슬라이스 time slice 개념이 더해진 것.
    정해진 시간만큼 CPU를 이용하고 아직 프로세스가 완료되지 않았다면 준비 큐 맨 뒤에 삽입.
    타임 슬라이스가 너무 크면 호위 효과의 여지가 있고, 너무 작으면 문맥 교환 오버헤드가 커진다.
  • 최소 잔여 시간 우선 스케줄링
    SRT 스케줄링 Shortest Remaining Time 이라고도 불린다.
    최단 작업 우선 스케줄링에 라운드 로빈 스케줄링을 합쳐 선점형 스케줄링 방식으로 구현한 것.
    작업 시간 대신 잔여 시간을 기준으로 짧은 것을 앞에 둔다.
    정해진 타임 슬라이스만큼 CPU를 사용하되, 남아있는 작업 시간이 가장 적은 것을 우선시한다.
  • 우선순위 스케줄링 priority scheduling
    프로세스들에 우선순위를 부여하고, 우선순위가 높은 프로세스부터 실행하는 방식.
    우선순위가 같은 프로세스끼리는 선입 선처리.
    최단 작업 우선 스케줄링과 최소 잔여 시간 우선 스케줄링도 넓게 보면 여기에 포함.
    우선순위가 낮은 프로세스의 실행이 계속 연기되는 기아 starvation 현상 발생 가능.
    오래 대기한 프로세스의 우선순위를 높이는 에이징 aging 기법으로 기아 현상 방지.
  • 다단계 큐 스케줄링 multilevel queue scheduling
    우선순위별로 준비 큐를 여러 개 사용하는 방식.
    우선순위가 가장 높은 큐에 있는 프로세스를 먼저 처리하고, 비어 있을 경우 다음 우선순위의 큐 처리.
    프로세스 유형별로 우선순위를 구분하여 실행하기 편리.
    큐별로 타임 슬라이스, 스케줄링 알고리즘 등을 개별적으로 설정 가능.
  • 다단계 피드백 큐 스케줄링 multilevel feedback queue scheduling
    다단계 큐 스케줄링에서 발생할 수 있는 기아 현상을 방지하기 위해 발전된 형태.
    우선순위에 따라 타임 슬라이스만큼 실행된 후, 완료되지 않았다면 다음 우선순위의 큐에 삽입.
    오랫동안 실행되지 못했다면 에이징 기법을 적용하여 높은 우선순위의 큐로 이동.
    CPU를 오래 사용할수록 점점 우선순위가 낮아지고 오래 기다리면 에이징 기법으로 우선순위가 높아진다.

더 알아보기

[컴퓨터 공학 기초 강의] 32강. CPU 스케줄링 알고리즘】

미션 수행하기

이번 주 미션

  • 기본 미션 | p. 304의 확인 문제 1번 풀고 인증하기
  • 선택 미션 | Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입될 때 선입 선처리, 최단 작업 우선, 라운드 로빈, 우선순위 스케줄링에서 어떤 프로세스로 CPU를 할당 받는지 정리해보기

기본 미션

미션은 P.304의 1번 문제뿐이지만, 이왕 학습하고 확인 문제를 푸는 거 다 풀어보자.

P.267 [09-1 | 운영체제를 알아야 하는 이유] 확인 문제

  1. 빈칸에 알맞은 단어를 채워 보세요.
    "운영체제는 실행할 프로그램에 [ 시스템 자원 ]을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램입니다.
  1. 운영체제에 대한 설명으로 옳지 않은 것을 고르세요.
    ① 운영체제를 이해하면 하드웨어와 프로그램을 더 깊이 이해할 수 있습니다.
    ② 운영체제는 사용자 영역에 적재됩니다. → 그건 응용 프로그램. 운영체제는 커널 영역에.
    ③ 운영체제는 시스템 자원을 관리하는 프로그램입니다.
    ④ 운영체제는 사용자가 실행하는 프로그램이 올바르게 실행되도록 돕습니다.

P.281 [09-2 | 운영체제의 큰 그림] 확인 문제

  1. 빈칸에 알맞은 단어를 작성하세요.
    "[ 커널 ]은 운영체제의 핵심 기능을 담당하는 부분을 의미합니다."
  1. 이중 모드와 시스템 호출에 대해 옳지 않은 것을 고르세요.
    ① 운영체제의 핵심 서비스는 커널 모드로 실행됩니다.
    ② 일반적인 응용 프로그램은 사용자 모드로 실행됩니다.
    ③ 시스템 호출을 통해 사용자 모드에서 커널 모드로 전환할 수 있습니다.
    ④ 시스템 호출은 인터럽트와 아무런 연관이 없습니다. → 소프트웨어 인터럽트.
  1. 운영체제의 핵심 서비스가 아닌 것을 고르세요.
    ① 프로세스 관리
    ② 자원 접근 및 할당
    ③ 사용자 인터페이스 제공 → 커널 외적인 부분.
    ④ 파일 시스템 관리

P.295 [10-1 | 프로세스 개요] 확인 문제

  1. 프로세스와 관련한 설명 중 옳지 않은 것을 고르세요.
    ① 실행되는 프로그램을 프로세스라고 합니다.
    ② 프로세스가 생성되면 커널 영역에 PCB가 생성됩니다.
    ③ 프로세스들은 문맥 교환을 통해 번갈아 가며 수행됩니다.
    ④ 프로세스는 반드시 사용자와 상호작용할 수 있어야 합니다. → 데몬의 경우 상호작용하지 않음.
  1. 문맥 교환과 관련한 설명 중 옳지 않은 것을 고르세요.
    ① 문맥 교환은 빠르게 수행될수록 좋습니다. → 어느 정도까지는 동시에 실행되는 것처럼 보이기에 좋지만, 지나치게 빠를 경우 오버헤드가 크다.
    ② 문맥 교환 과정에서 직전에 수행되던 프로새스의 문맥이 백업됩니다.
    ③ 문맥 교환 과정에서 다음에 수행할 프로세스의 문맥이 복구됩니다.
    ④ 문맥은 PCB에 기록됩니다.

P.304~305 [10-2 | 프로세스 상태와 계층 구조] 확인 문제

  1. 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. ①부터 ⑤까지 올바른 상태를 적어 보세요.

① 생성 상태
② 준비 상태
③ 실행 상태
④ 종료 상태
⑤ 대기 상태

(요것이 이번주 기본 미션!!)

  1. 최초의 프로세스가 로그인 프로세스를 생성하고, 로그인 프로세스는 bash 프로세스를, bash 프로세스는 Vim 프로세스를 생성했다고 가정해 보겠습니다.
  • bash 프로세스의 부모 프로세스는 무엇인가요? [① 로그인 프로세스 ]
  • bash 프로세스의 자식 프로세스는 무엇인가요? [② Vim 프로세스 ]
  • Vim 프로세스의 부모 프로세스는 무엇인가요? [③ bash 프로세스 ]
  1. fork와 exec에 대한 설명으로 옳지 않은 것을 고르세요.
    ① fork 시스템 호출을 하면 새로운 폴더가 생성됩니다. → 새로운 프로세스 생성.
    ② fork 시스템 호출을 하면 부모 프로세스의 복제본이 자식 프로세스로서 생성됩니다.
    ③ exec 시스템 호출을 하면 프로세스의 메모리 공간이 다른 프로세스의 내용으로 변경됩니다.
    ④ 많은 운영체제는 fork와 exec을 통해 프로세스 계층 구조를 형성합니다.
  1. 프로세스 상태에 대한 설명으로 옳은 것을 고르세요.
    ① 생성 상태는 프로세스가 입출력 장치의 작업을 기다리는 상태입니다. → 그건 대기 상태.
    ② 실행 상태는 프로세스가 종료되는 상태입니다. → 그건 종료 상태.
    ③ 종료 상태는 프로세스가 이제 막 생성된 상태입니다. → 그건 생성 상태.
    ④ 준비 상태는 CPU를 할당받기를 기다리고 있는 상태입니다.

P.313 [10-3 | 스레드] 확인 문제

  1. 스레드와 관련한 설명으로 옳지 않은 것을 고르세요.
    ① 스레드는 프로세스 내의 실행의 흐름 단위입니다.
    ② 프로세스 내의 스레드들은 각기 다른 코드/데이터/힙 영역을 가지고 있습니다. → 동일한 것 공유
    ③ 프로세스 내의 스레드들은 각기 다른 프로그램 카운터 값을 가지고 있습니다.
    ④ 프로세스 내의 스레드들은 각기 다른 스택을 가지고 있습니다.
  1. 멀티프로세스와 멀티스레드의 차이를 설명하는 내용입니다, 아래 글에서 제시된 단어 중 옳은 것을 고르세요.
    "프로세스끼리는 기본적으로 자원을 [ 공유하지 않지만, 공유하지만 ], 프로세스 내 스레드끼리는 같은 프로세스 내의 자원을 [ 공유하지 않습니다, 공유합니다 ].

P.326~327 [11-1 | CPU 스케줄링 개요] 확인 문제

  1. 프로세스 스케줄링에 대해 옳지 않은 것을 고르세요.
    ① 운영체제는 우선순위를 토대로 프로세스들을 스케줄링합니다.
    ② 운영체제는 스케줄링 큐를 사용하여 스케줄링할 프로세스를 관리합니다.
    ③ 준비 큐에는 준비 상태인 프로세스들이, 대기 큐에는 대기 상태인 프로세스들이 삽입됩니다.
    ④ 선점형 스케줄링은 프로세스가 이용 중인 자원을 빼앗을 수 없는 방식을 의미합니다. → 그건 비선점형.
  1. ①과 ②에 알맞은 말을 써넣으세요.

① 준비 큐
② 대기 큐

(다이어그램이 살짝 이상하지만 다음 쇄에서 수정 반영 예정이라고 답변 받았다.)

  1. 선점형 스케줄링과 비선점형 스케줄링에 대해 옳지 않은 것을 고르세요.
    ① 선점형 스케줄링은 어느 한 프로세스가 자원을 독점할 수 없는 스케줄링 방식입니다.
    ② 선점형 스케줄링은 문맥 교환 과정의 오버헤드가 비선점형 스케줄링에 비해 적습니다. → 우선순위에 따라 자원을 분배하는 과정에서 오버헤드 발생.
    ③ 비선점형 스케줄링은 어느 한 프로세스가 자원을 독점할 수 있는 스케줄링 방식입니다.
    ④ 비선점형 스케줄링은 문맥 교환 과정의 오버헤드가 선점형 스케줄링에 비해 적습니다.

P.337 [11-2 | CPU 스케줄링 알고리즘] 확인 문제

  1. 준비 큐에 프로세스 A, B, C, D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링을 적용한다면 어떤 프로세스 순서대로 CPU를 할당받게 될까요?
    ① A-D-B-C
    ② B-C-A-D
    ③ A-B-C-D
    ④ D-C-B-A
  1. 다음 보기에서 올바른 정의를 찾아 써 보세요.
    [보기| 기아 현상, 에이징, 타임 슬라이스]
  • 우선순위가 낮아 실행이 계속 연기되는 문제를 무엇이라고 하나요? [① 기아 현상 ]
  • 우선순위가 낮아 실행이 계속 연기되는 문제를 해결하기 위해 점차 우선순위를 높이는 기법을 무엇이라고 하나요? [② 에이징 ]

선택 미션

준비 큐에 A,B,C,D 순으로 삽입될 때 각각의 스케줄링 기법에 따른 CPU 할당을 정리해보면,

스케줄링 기법CPU 할당
선입 선처리A가 모두 실행된 후 B가 실행되고, B가 모두 실행된 후 C가 실행되고, C가 모두 실행된 후 D가 실행된다.
최단 작업 우선A, B, C, D 중 실행 시간이 짧은 것부터 작업 시간 순으로 실행된다.
라운드 로빈A, B, C, D가 타임 슬라이스만큼의 시간동안 실행되며, 아직 실행할 게 남은 동안 이 순서로 반복된다.
우선순위A, B, C, D의 우선순위를 판별하여 우선순위가 높은 프로세스부터 실행된다.

여담

내 눈에는 모호해보이는 보기가 있길래 제안.

그리고 프로세스 상태 다이어그램에서 뭔가 위화감이 느껴져서 뭐지 했는데
준비 상태가 두 개인 걸 인지하여 제보했다.

profile
Peter J Online Space - since July 2020

0개의 댓글