[혼공챌린지 : 혼공단 9기 컴퓨터 구조+운영체제] 4주차

김진환·2023년 2월 5일
0

4주차 학습 정리

Chapter 09 : 운영체제 시작하기

09-1 : 운영체제를 알아야 하는 이유

운영체제란

  • 시스템 자원(자원) : 프로그램 실행에 마땅히 필요한 요소들(ex. CPU, 메모리, 보조기억장치, 입출력장치 등)입니다.
  • 운영체제(operating system) : 프로그램 실행에 필요한 "시스템 자원"을 할당하고, 올바르게 실행되도록 돕는 "특별한" 프로그램입니다.
    • 커널 영역(kernal space) : 특별한 프로그램인 "운영 체제"를 위한 공간입니다.
    • 사용자 영역(user space) : 커널 영역을 제외한 나머지 영역입니다. (일반 사용자가 이용하는 응용 프로그램이 적재되는 영역)

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

  • 운영체제를 통해 개발자는 하드웨어를 조작하는 기능을 직접 구현할 필요가 없어집니다.
  • 개발자는 운영체제를 통해 하드웨어 상의 문제 등을 통해서 "문제 해결"의 실마리를 찾을 수 있습니다.

09-2 : 운영체제의 큰 그림

운영체제의 심장, 커널

  • 커널(kernel) : 운영체제의 핵심 서비스를 담당하는 부분입니다.
  • 운영체제의 핵심 서비스
    • 자원에 접근하고 조작하는 기능
    • 프로그램이 올바르고 안전하게 실행하는 기능
  • 운영체제의 핵심 서비스 이외의 부분 (운영체제가 제공하는 커널에 포함되지 않는 서비스)
    • 사용자 인터페이스(UI : User Interface) : 사용자가 컴퓨터와 상호작용할 수 있는 통로, 운영체제가 제공하는 커널에 포함되지 않는 서비스 중 하나 입니다.
      • 그래픽 유저 인터페이스(GUI : Graphical User Interface) : 화면과 같이 그래픽을 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스입니다.
      • 커맨드 라인 인터페이스(Command Line Interface) : 명령어를 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스입니다.

이중 모드와 시스템 호출

  • 이중 모드(dual mode) : CPU가 명령어 실행 시 모드를 '사용자 모드'와 '커널 모드'로 구분하는 방식입니다.
    • 사용자 모드(user mode) : 운영체제 서비스를 제공받을 수 없는 실행 모드입니다.
      • 커널 영역의 코드를 실행할 수 없습니다.
      • 일반적인 응용 프로그램입니다.
      • CPU가 입출력 명령어와 같은 하드웨어 자원에 접근하는 명령어를 실행할 수 없습니다.
    • 커널 모드(kernel mode) : 운영체제 서비스를 제공받을 수 있는 실행 모드입니다.
      • 커널 영역의 코드를 실행할 수 있습니다.
      • CPU가 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있습니다.
  • 시스템 호출(system call) : 사용자 모드가 운영체제 서비스를 제공받기 위한 운영체제에 보내는 요청입니다.
    • 사용자 모드의 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있습니다.
    • 시스템 호출은 소프트웨어 인터럽트(인터럽트를 발생시키는 특정 명령어에 의해 발생하는 방식)입니다.
    • '인터럽트 처리 순서'와 유사하게 동작합니다.
      1. 기존 작업을 백업
      2. 인터럽트 서비스 (커널 영역 내의 시스템 호출을 수행하는 코드)를 실행
      3. 기존 실행하던 응용 프로그램으로 복구 및 실행

운영체제의 핵심 서비스

  • 프로세스 관리
    • 프로세스(process) : 실행 중인(메모리에 적재된) 프로그램
    • CPU가 여러 프로세스를 동시에 실행하기 위해 프로세스들을 조금씩 번갈아 가며 실행하며, 각 프로세스의 동작에 맞춰 관리하고 실행합니다.
  • 자원 접근 및 할당
    • CPU : 프로세스들에게 공정하게 CPU를 할당하기 위해 'CPU 스케줄링'을 제공합니다.
    • 메모리 : 새로운 프로세스가 적재될 때 어느 주소에 적재할지를 결정하며, 메모리 공간이 부족하거나, 남아도 적재가 불가능하는 경우도 관리합니다.
    • 입출력장치 : '하드웨어 인터럽트'에 의한 '이터럽트 서비스 루틴'을 제공하여 입출력 작업을 수행합니다.
  • 파일 시스템 관리
    • 파일시스템(file system) : 파일을 열기, 생성, 삭제 등의 기능과 디렉터리(폴더)관리 등의 기능을 뜻 합니다.
    • 파일시스템은 운영 체제가 지원하는 핵심서비스입니다.

Chapter 10 : 프로세스와 스레드

10-1 : 프로세스 개요

프로세스 직접 확인하기

  • 프로세스(process) : 실행 중인 프로그램, 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행한 경우
  • 프로세스 확인 방법
    • 윈도우 : 작업 관리자의 [프로세스] 탭에서 확인 가능
    • 유닉스 체계 : ps 명령어를 통해 확인 가능
  • 포그라운드 프로세스(forground process) : 사용자가 볼 수 있는 공간에서 실행되는 프로세스
  • 백그라운드 프로세스(background process) : 보이지 않는 공간에서 실행되는 프로세스
    • 유닉스의 데몬(daemon), 윈도우의 서비스(service) : 사용자와 상호작용하지 않고 정해진 일을 수행하는 백그라운드 프로세스

프로세스 제어 블록

  • 타이머 인터럽트(타임아웃 인터럽트) : 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트입니다.
    • 프로세스들이 CPU를 차례대로 돌아가며 한정된 시간만큼만 사용하며, 정해진 시간이 끝났음을 '타이머 인터럽트'를 통해 알 수 있습니다.
  • 프로세스 제어 블록(PCB : Process CVontrol Block) : 프로세스와 관련된 정보를 저장하는 자료 구조입니다.
    • 프로세스의 실행 순서를 관리하고, CPU를 비롯한 자원을 배분하는데 사용됩니다.
    • 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기됩니다.
  • PCB의 정보
    • 프로세스 ID(PID : Process ID) : 프로세스를 식별하기 위해 부여하는 고유한 번호입니다.
    • 레지스터 값 : 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값입니다. (자신의 차례 때 레지스터의 중간값들을 복원하는데 사용됩니다.)
    • 프로세스 상태 : 현재 프로세스가 CPU를 사용하기위해 대기중인지, CPU를 이용중인지, 입출력장치를 대기중인지 등의 프로세스 상태 정보입니다.
    • CPU 스케줄링 정보 : 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보입니다.
    • 메모리 관리 정보 : 프로세스가 사용하는 메모리가 저장된 위치에 대한 정보입니다. 페이지 테이블 정보도 같이 보관됩니다.
    • 사용한 파일과 입출력장치 목록 : 프로세스의 실행 과정 중 사용한 입출력장치나 파일에 대한 정보입니다.

문맥 교환

  • 문맥(context) : 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보입니다.
  • 문맥 교환(context switching) : 기존 프로세스의 문맥을 PCB에 백업하고, 실행할 프로세스의 문맥을 PCB에서 복구하는 동작입니다.
  • 문맥 교환이 자주 일어나면 프로세스는 빠르게 번갈아 가며 수행되어 여러 프로세스들이 동시에 실행되는 것처럼 보입니다.

프로세스의 메모리 영역

  • 정적 할당 영역 : 크기가 고정된 영역입니다.
    • 코드 영역(code segment) or 텍스트 영역(text segment) : 실행할 수 있는 코드(기계어로 이루어진 명령어)가 저장됩니다. 데이터가 아닌 CPU가 실행할 명령어가 있어서 쓰기가 금지되어 있습니다.
    • 데이터 영역(data segment) : 잠시 사용될 데이터가 아닌 프로그램 실행되는 동안 유지될 데이터(ex. 전역 변수(global variable))가 저장될 공간입니다.
  • 동적 할당 영역 : 프로세스 실행 과정에서 그 크기가 변할 수 있는 영역입니다.
    • 힙 영역(heap segment) : 프로그래머가 직접 할당할 수 있는 저장 공간입니다. 프로그래머가 메모리를 할당하고 반환하지 않으면, 메모리 누수(memory leak)이 발생합니다. 낮은 주소에서 높은 주소로 할당됩니다.
    • 스택 영역(stack segment) : 데이터를 일시적으로 저장(ex. 매개 변수, 지역 변수)하는 공간입니다. 힙 영역과의 충돌을 최소화하기 위해 높은 주소에서 낮은 주소로 할당됩니다.

10-2 : 프로세스 상태와 계층 구조

프로세스 상태

  • 대표적인 프로세스 상태
    • 생성 상태 (new) : 프로세스를 생성 중인 상태, 막 메모리에 적재되어 PCB를 할당 받은 상태, 실행 준비가 완료되면 준비 상태가 됩니다.
    • 준비 상태 (ready) : CPU를 할당받아 실행할 수 있지만, 차례가 아니라 기다리는 상태, CPU를 할당 받을 차례가 되면 실행 상태가 됩니다. 준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치(dispatch)라고 합니다.
    • 실행 상태 (running) : CPU를 할당받아 실행 중인 상태를 의미합니다. 할당된 시간을 모두 사용하면 타이머 인터럽트가 발생해 다시 준비 상태가 되고, 입출력장치를 사용 하면 입출력 장치의 작업이 끝날 때까지 대기 상태가 됩니다.
    • 대기 상태 (blocked) : 프로세스가 입출력 장치의 작업을 기다리는 상태입니다. 입출력 작업이 완료되면 다시 준비 상태가 됩니다.
    • 종료 상태 (terminated) : 프로세스가 종료된 상태입니다. 운영체제가 PCB와 사용한 메모리를 정리합니다.
  • 프로세스 상태 다이어그램(process state diagram)

프로세스 계층 구조

  • 부모 프로세스(parent process) : 새 프로세스르 생성한 프로세스

  • 자식 프로세스(child process) : 부모 프로세스에 의해 생성된 프로세스

  • 프로세스 계층 구조

    • 프로세스(부모 프로세스)가 시스템 호출을 통해 다른 프로세스(자식 프로세스)를 생성할 수 있습니다.
    • 자식 프로세스도 시스템 호출을 통해 또 다른 자식 프로세스를 생성할 수 있습니다.
    • 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리합니다.

프로세스 생성 기법

  • 복제와 교체(옷 갈아입기) : 부모 프로세스에서 자식 프로세스를 만들어 내는 방식입니다.
  • fork(복제) : 시스템 호출로 자신의 복사본을 자식 프로세스로 생성하며, 부모 프로세스의 자원들(메모리 내용, 열린 파일 목록 등)이 상속됩니다.
  • exec(교체) : 시스템 호출로 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출입니다. 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌며, 나머지 영역은 초기화됩니다.

10-3 : 스레드

프로세스와 스레드

  • 스레드(thread) : 프로세스를 구성하는 실행의 흐름 단위입니다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 여러 부분을 동시에 실행할 수 있습니다.
  • 단일 스레드 프로세스 : '실해의 흐름 단위가 하나'로 한 번에 하나의 부분만 실행되는 프로세스입니다.
  • 스레드의 구성 요소 : 해당 구성 요소를 가지고 있어 스레드마다 각기 다른 코드를 실행할 수 있으며, 필요한 최소한의 정보(레지스터, 스택)만을 유지하고 프로세스 자원을 공유합니다.
    • 스레드 ID
    • 프로그램 카운터
    • 레지스터 값
    • 스택

멀티프로세스와 멀티스레드

  • 멀티프로세스(multiprocess) : 여러 프로세스를 동시에 실행하는 것을 의미합니다.
  • 멀티스레드(multithread) : 여러 스레드로 프로세스를 동시에 실행하는 것을 의미합니다.
  • 멀티프로세스와 멀티스레드 간의 차이점
    • 프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유합니다.
    • 멀티스레드는 프로세스의 자원을 공유하기 때문에 서로 협력과 통신에 유리합니다.
    • 멀티스레드는 하나의 스레드에 문제가 발생하면, 프로세스 간의 자원을 공유하기 때문에 프로세스 전체에 문제가 생길 수 있습니다.

Chapter 11 : CPU 스케줄링

11-1 : CPU 스케줄링 개요

프로세스 우선순위

  • CPU 스케줄링(CPU scheduling) : 운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것을 뜻합니다.
  • 우선순위(priority) : 프로세스의 중요도에 맞게 프로세스가 먼저 CPU를 이용할 수 있도록 하기 위한 순위입니다.
  • 프로세스별 상황에 맞게 배분하는 것이 효율적이라 CPU를 효율적으로 사용하기 위해 운영체제가 우선순위를 결정해야 합니다.
    • ex. 입출력 집중 프로세스를 가능한 빨리 실행시켜 입출력 장치를 끊임없이 작동시키며, CPU 집중 프로세스에 집중적인 CPU 할당하는 것이 효율적입니다.
      • 입출력 집중 프로세스(I/O bound process) : 입출력 작업(비디오 재생, 디스크 백업 작업 등)이 많은 프로세스, 입출력을 위한 대기 상태에 주로 머무릅니다.
      • CPU 집중 프로세스(CPU bound process) : CPU 작업(복잡한 수학 연산, 컴파일, 그래픽 처리 작업)이 많은 프로세스, 실행 상태에 주로 머무릅니다.

스케줄링 큐

  • 스케줄링 큐(scheduling queue) : 작업(CPU 사용, 메모리 적재, 입출력 장치 사용)을 하고 싶은 프로세스들을 운영체제가 관리하기 위해 줄 세워 놓은 것을 의미합니다.
    • 자료 구조의 큐와 달리 스케줄링의 큐는 반드시 선입선출 방식일 필요가 없습니다.
  • 준비 큐(ready queue) : CPU를 이용하고 싶은 프로세스들의 줄
  • 대기 큐(waiting queue) : 입출력장치를 이용하기 위해 대기 상태에 접어든 프로세스들이 서는 줄

선점형과 비선점형 스케줄링

  • 선점형 스케줄링(preemptive scheduling) : 프로세스가 자원을 사용하고 잇더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식입니다.
    • 장점 : 자원 독점을 막고 프로세스들에 골고루 자원 배분이 가능합니다.
    • 단점 : 문맥 교환 과정에서 오버헤드가 발생할 수 있습니다.
  • 비선점형 스케줄링(non-preemptive scheduling) : 프로세스가 자원을 사용하고 있다면, 그 프로세스가 종료되거나 스스로 대기 상태가 되기 전까지 다른 프로세스가 자원에 접근할 수 없는 스케줄링 방식입니다.
    • 장점 : 문맥 교환에서 발생하는 오버헤드가 선점형 스케줄링보다 적습니다.
    • 단점 : 다른 프로세스가 자원을 사용 중인 경우 계속 기다려야해서 모든 프로세스가 골고루 자원을 사용할 수 없습니다.

11-2 : CPU 스케줄링 알고리즘

선입 선처리 스케줄링 or FCFS 스케줄링(First Come First Served Scheduling)

  • 준비 큐에 삽입된 순서대로 프로세스들을 처리하는 방식입니다.
  • 비선점형 스케줄링 방식입니다.
  • 프로세스들이 기다리는 시간이 매우 길어질 수 있습니다.
    • 호위 효과(convoy effect) : 매우 짧은 작업을 실행하기 위해 긴 시간을 기다리는 것

최단 작업 우선 스케줄링 or SJF 스케줄링(Shortest Job First Scheduling)

  • CPU 사용 시간이 짧은 간단한 프로세스를 먼저 실행하는 방식입니다.
  • 기본적으로는 비선점형 스케줄링 방식이지만, 선점형으로 구현될 수 있습니다.

라운드 로빈 스케줄링(round robin scheduling)

  • 선입 선처리 스케줄링에 타임슬라이스 개념이 더해진 방식입니다.
    • 타임 슬라이스 : 각 프로세스가 CPU를 사용할 수 있는 정해진 시간을 의미합니다.
  • 각 프로세스가 타임 슬라이스의 시간 동안 CPU를 이용하는 방식입니다.
  • 선점형 스케줄링 방식입니다.
  • 타임 슬라이스의 크기가 매우 중요합니다.
    • 너무 클 경우에는 선입 선처리 스케줄링과 같아 호위 효과가 생깁니다.
    • 너무 작을 경우에는 문맥 교환에 발생하는 비용이 커서 CPU가 프로세스 처리보다 문맥 교환에 더 많이 사용됩니다.

최소 잔여 시간 우선 스케줄링 or SRT(Shortest Remaining Time) 스케줄링

  • 최단 작업 우선 스케줄링에 라운드 로빈 알고리즘을 합친 스케줄링 방식입니다.
  • 최소 잔여 시간 우선 스케줄링하여 타임 슬라이스 이후 다음 프로세스로 남아있는 작업 시간이 가장 적은 프로세스를 실행하는 방식입니다.

우선순위 스케줄링(priority scheduling)

  • 프로세스들에 우선순위를 부여하고, 가장 높은 우선순위 순서대로 프로세스를 실행하는 방식입니다.
  • 최단 작업 우선 스케줄링, 최소 잔여 시간 우선 스케줄링 등이 우선순위 스케줄링의 일종으로 볼 수 있습니다.
  • 기아(starvation) 현상 : 우선순위가 높은 프로세스들이 계속 실행되어 낮은 프로세스가 계속 연기되는 상태입니다.
  • 에이징(aging) : 기아 현상을 방지하는 기법 중 하나로 오래 대기한 프로세스의 우선순위를 점차 높이는 방식입니다.

다단계 큐 스케줄(multilevel queu scheduling)

  • 우선순위 스케줄링의 발전된 형태입니다.
  • 우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식입니다.
  • 우선순위가 가장 높은 큐에 있는 프로세스들을 먼저처리하고 해당 큐가 비어 있으면 다음 우선순위 큐에 있는 프로세스들을 처리하는 방식입니다.
  • 큐별로 타임 슬라이스를 지정할 수 있고, 다른 스케줄링 알고리즘을 사용할 수 있습니다.
  • 다단계 큐 스케줄링은 프로세스들이 큐 사이를 이동할 수 없으며, 우선 순위가 낮은 프로세스는 계속 연기되어 기아 현상이 발생할 수 있습니다.

다단계 피드백 큐 스케줄링(multilevel feedback queue scheduling)

  • 다단계 큐 스케줄링의 발전된 형태입니다.
  • 프로세스들이 큐 사이를 이동할 수있습니다.
  • CPU를 비교적 오래 사용해야 하는 CPU 집중 프로세스들은 자연스럽게 우선 순위가 낮아집니다.
    • 새 프로세스는 가장 높은 우선순위 큐에 삽입해 타임 슬라이스만큼 실행하고, 작업이 완료 되지 않으면 다음 우선순위 큐에 삽입되는 식으로 반복하며 우선순위가 낮아집니다.
  • 낮은 우선순위 큐에서 너무 오래 기다리는 프로세스는 우선순위가 높은 큐로 이동시키는 에이징 기법을 통해 기아 현상도 예방할 수 있습니다.
  • 구현이 복잡하지만, 가장 일반적인 CPU 스케줄링 알고리즘입니다.

4주차 미션

1. 기본 미션 : p. 304의 확인 문제 1번

1.1. p. 304 : 확인 문제 1번 : 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. ①부터 ⑤까지 올바른 상태를 적어보세요.


1. 생성
2. 준비
3. 실행
4. 종료
5. 대기

2. 선택 미션 : Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입될 때 선입 선처리, 최단 작업 우선, 라운드 로빈, 우선순위 스케줄링에서 어떤 프로세스로 CPU를 할당 받는지 정리해보기

문제 조건 수정

프로세스에 값 할당

삽입 순서프로세스명작업시간(ms)우선순위
1A15ms3
2B10ms1
3C20ms4
4D5ms2

기타 정보

  • 타임슬라이스 : 5ms

선입 선처리

  • 가장 먼저 들어온 작업을 실행하는 방식입니다.
  • A -> B -> C -> D

최단 작업 우선 순위

  • 가장 짧게 걸리는 프로세스를 먼저 실행하는 방식입니다.
  • D -> B -> A -> C

라운드 로빈

  • 선입 선처리 방식에 타임슬라이스를 적용하는 방식입니다.
경과 시간0ms5ms15ms20ms25ms30ms35ms40ms45ms50ms
실행 프로세스ABCDABCACC
잔여 작업A 10msB 5msC 15msD 0msA 5msB 0msC 10msA 0msC 5msC 0ms

우선순위 스케줄링

  • 결정된 우선순위에 따라 실행합니다.
  • 준비 큐에 우선 순위 값을 기준으로 실행합니다.
  • B -> D -> A -> C

참조 자료

  • 혼자 공부하는 컴퓨터 구조+운영체제 : Chapter 09 ~ 11
profile
발전 중인 주니어 개발자

0개의 댓글