공부 기록/혼공학습단

혼공학습단 10기 - 혼공컴운 (4주차)

노루동산 2023. 7. 30. 20:39

 

4주 차 목표

# 진도 기본 미션 선택 미션
4주차
(7/24 ~ 7/30)
Chapter 09 ~ 11 p. 304의 확인 문제 1번 풀고 인증하기 Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기

 

4주 차부터는 운영체제 시작!

운영 체제라는 하나의 프로그램에 대해 배우는 것이기에 컴퓨터 구조보다 다소 복잡한 감도 있으나

프로그래머에게 직접적인 도움이 되는 파트임을 느꼈다.

 

기본 미션

 

p.304 확인 문제 1번

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

 

A. 1: 생성 상태, 2: 준비 상태, 3: 실행 상태, 4: 종료 상태, 5: 대기 상태

 

 

선택 미션

 

Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기

 

선입 선처리 스케줄링은 무조건 먼저 삽입된 프로세스가 먼저 실행되는 알고리즘이다.

A, B, C, D 순으로 삽입되었기 때문에 실행 순서도 동일하게 A, B, C, D 순으로 실행된다.

 

 

메모

더보기

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

1. 프로그램 실행에 있어 마땅히 필요한 요소를 자원이라 하며, 이에는 컴퓨터의 네 가지 핵심 부품도 포함된다. 운영체제(operating system)는 프로그램에게 자원을 할당해 주며, 프로그램이 올바르게 실행되도록 돕는 프로그램이다.
  - 운영체제가 하는 일
    - 1. 운영체제는 메모리 내에 커널 영역(kernel space)이라는 특별한 영역에 적재된다. 응용 프로그램사용자 영역(user space)에 적재된다. 응용 프로그램을 메모리에 적재하는 일은 운용체제가 담당한다.
    - 2. 운영체제는 CPU도 관리하는데 어떤 프로그램이 먼저 실행될지, 얼마나 오래 실행될지를 판단해 프로그램에게 CPU 자원을 할당한다.
    - 3. 운영체제는 입출력장치 또한 관리한다. 동시에 입출력장치를 실행하려는 것을 막고 순차적으로 실행시킨다.
2. 운영체제 덕분에 개발자는 하드웨어에 직접 접근하는 코드를 짜지 않아도 된다. 그러나 운영체제를 알아야 하는 이유는 오류 메시지에 대한 이해가 높아지기 때문이다.


09 - 2 운영체제의 큰 그림

1. 운영체제의 서비스는 다양하지만 모든 운영체제가 가지고 있는, 핵심 기능을 담당하는 부분을 커널(kernel)이라고 한다. 운영체제에 포함되며 커널에는 포함되지 않는 대표적인 서비스는 UI가 있다(CLI, GUI).
2. 운영체제는 응용 프로그램들이 자원을 접근하려 할 때 자신을 통하도록 보호한다. 이런 역할은 이중 모드(dual mode)로써 구현되는데, CPU가 명령하는 모드를 사용자 모드(user mode)와 커널 모드(kernel mode)로 구분하는 방식이다. 일반적인 응용 프로그램은 사용자 모드로 실행된다. 커널 모드에서는 운영체제 서비스를 제공받아 자원에 직접 접근할 수 있다.
  - 레지스터 속 슈퍼바이저 플래그로 어떤 모드가 실행 중인지 알 수 있다.
  - 시스템 호출(system call): 일종의 소프트웨어 인터럽트. 시스템 호출을 통해 커널 모드로 전환할 수 있다.
3. 운영체제의 핵심 서비스
  - 1. 프로세스 관리: 실행 중인 프로그램을 프로세스(process)라고 한다. CPU는 한 번에 하나의 프로세스만 실행할 수 있기 때문에 프로세스들을 번갈아가며 실행한다. 운영체제는 다양한 프로세스를 일목요연하게 관리하고 실행한다.
    - 프로세스 동기화, 교착 상태 해결
  - 2. 자원 접근 및 할당
    - CPU 접근(CPU 스케줄링): 어떤 프로세스를 먼저, 얼마나 오래 실행할지 결정.
    - 메모리 접근(페이징, 스와핑,...): 프로세스에 어떻게 메모리를 할당하는지, 메모리가 부족할 경우 어떻게 극복하는지.
    - 입출력장치 접근: 인터럽트 서비스 루틴 제공.
  - 3. 파일 시스템(file system)


10 - 1 프로세스 개요


1. 프로세스의 종류
  - 포그라운드 프로세스(foregrount process): 사용자가 볼 수 있는 공간에서 실행되는 프로세스
  - 백그라운드 프로세스(background process): 사용자가 보지 못하는 공간에서 실행되는 프로세스
  - 사용자와 상호작용할 수 있는 프로세스와, 상호작용하지 않고 일을 수행하는 프로세스로 나뉜다. 후자를 데몬(demon), 서비스(service, 윈도우 운영체제에서)라 불린다.
2. 프로세스는 CPU를 필요로 하지만 자원은 한정되어 있다. 그래서 프로세스는 돌아가면서 한정된 시간만큼만 이용할 수 있다. 시간이 끝나면 타이머 인터럽트가 발생하고 다음 프로세스 차례로 넘어간다.
  - 프로세스 제어 블록(PCB; Process Control Block): 프로세스의 실행 순서를 관리하고 자원을 배분하는데 이용하는 자료구조로 프로세스에 대한 정보를 가지고 있음. 커널 영역에 적재됨. 대표적인 정보는 아래와 같음.
  - 프로세스 ID (=PID): 식별 번호.
  - 레지스터 값: 프로세스는 CPU의 레지스터를 이용한다. 그러나 다음 프로세스 차례가 오면 레지스터의 값은 날아가기 때문에, 이전까지 사용했던 레지스터 값을 저장해 놓는 것.
  - 프로세스 상태: 입출력장치를 사용하기 위해 기다리는 상태인지, CPU를 사용하기 위해 기다리고 있는 상태인지 등.
  - CPU 스케줄링 정보: 언제, 어떤 순서로 CPU를 할당받을지.
  - 메모리 정보: 프로세스가 어디에 저장되어 있는지, 페이지 테이블에 대한 정보.
  - 사용한 파일과 입출력장치 정보
3. 지금까지 실행하였던 내용의 정보를 문맥(context)라고 한다. 기존 프로세스의 문맥을 PCB에 저장하고, 다음 프로세스의 문맥을 PCB에서 가져오는 것을 문맥 교환(context switching)이라 한다.
4. 프로세스의 메모리 영역은 대표적으로 아래와 같다.
  - 정적 할당 영역: 크기가 고정된 영역
    - 코드 영역(code segment, 텍스트 영역(text segment)): 기계어로 이루어진 명령어 저장. 데이터가 아니라 명령어가 담기기에 쓰기가 금지되어 있다.(read-only)
    - 데이터 영역(data segment): 프로그램이 실행되는 동안 유지할 데이터 저장. ex 전역 변수.
  - 동적 할당 영역: 크기가 가변적인 영역
    - 힙 영역(heap segment): 프로그래머가 직접 할당할 수 있는 영역. 가비지 컬렉션 기능이 없는 언어에서는 해체해주지 않으면 메모리 누수(memory leak)가 생김.
    - 스택 영역(stack segment): 데이터를 일시적으로 저장하는 공간.
    - 이 두 영역은 동적 할당 영역에 공존하기 때문에, 힙 영역은 낮은 주소부터 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당된다.


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

1. 프로세스 상태는 대표적으로 아래와 같다
생성 상태(new): 막 메모리에 적재되어 PCB를 할당받은 상태. 준비가 완료되면 준비 상태로 넘어감.
준비 상태(ready)CPU를 할당받아 실행할 수 있는 상태지만 자신의 차례가 아니라 기다리는 상태. 실행 상태로 바뀌는 것을 디스패치(dispatch)라고 함.
실행 상태(running)CPU를 할당받아 실행 중인 상태. 타이머 인터럽트가 발생하면 준비 상태가 되며, 입출력장치를 사용할 경우 입출력장치의 작업이 끝날 때까지 대기 상태로 접어듦.
대기 상태(locked): 프로세스가 실행 도중 입출력 작업을 하는 경우. 입출력 작업이 끝날 때까지 대기. 끝나면 준비 상태로 접어듦.
종료 상태(terminated)프로세스가 종료된 상태. PCB, 프로세스의 메모리가 정리됨.
2. 프로세스 계층 구조: 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성 가능. 이때 생성한 프로세스를 부모 프로세스(parent process), 생성된 프로세스는 자식 프로세스(child process)라 한다. 윈도우 운영체제는 해당사항 없다.
- 엄연히 서로 다른 프로세스이기에 다른 PID를 가지지만 일부 운영체제에서는 자식 프로세스가 부모 프로세스의 PID인 PPID(Parent PID)를 기록하기도 한다.
3. 프로세스 생성 기법: 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성해 내고, 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다. 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화된다.


10 - 3 스레드

1. 스레드는 프로세스를 구성하는 실행 흐름의 단위. 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다. 실행 흐름이 하나면 단일 스레드 프로세스, 여러 개면 멀티 스레드 프로세스라 한다.
2. 스레드마다 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택 등 실행에 필요한 최소한의 정보를 가지고 있으며 프로세스 자원을 공유하여 실행됨.
3. 여러 프로세스를 동시에 실행하는 것을 멀티프로세스(multiprocess), 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드(multithread)라고 하는데 두 차이는 프로세스끼리는 기본적으로 자원을 공유하지 않고, 스레드끼리는 같은 프로세스 내의 자원을 공유한다는 점이다. 자원을 공유한다는 점이 메모리 절약이라는 장점이 될 수도, 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생긴다는 단점이 될 수도 있음.
  - 프로세스도 기본적으로는 자원을 공유하지 않으나, 프로세스끼리도 자원을 공유하고 데이터를 주고받을 수 있음. 이를 프로세스 간 통신(IPC; Inter-Process Communication)이라고 부름. 파일을 통해 프로세스 간 통신을 하거나, 공유 메모리를 두어 데이터를 주고받을 수 있음.


11 - 1 CPU 스케줄링 개요

1. CPU 스케줄링이란 운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 분배하는 것.
  - 입출력 작업이 많은 프로세스(입출력 집중 프로세스, I/O bound process)는 CPU 작업이 많은 프로세스(CPU bound process)보다 우선순위가 높다. 입출력작업을 완료할 때까지 대기상태가 되어 CPU를 할당하지 않아도 되기 때문에 미리 처리해 버리는 것이다.
  - 이렇듯 상황에 맞게 CPU를 배분하는 것이 효과적이기 때문에 운영체제는 프로세스마다 우선순위(priority)를 부여하고 PCB에 명시한다. 이 순서를 바탕으로 순서와 빈도가 정해진다.
2. 스케줄링 큐(scheduling queue): 특정 자원(CPU, 메모리, 입출력장치 등)을 이용하고 싶어 하는 프로세스들을 각각의 자원에 해당하는 큐에 삽입하여 줄을 세운다.
  - 큐이지만, 무조건 선입선출을 따르진 않음. 늦게 삽입되었더라도 우선순위가 높은 프로세스가 먼저 나갈 수 있음.
  - 준비 큐(ready queue): 준비 상태의 프로세스 큐, CPU를 이용하기 위해 기다리는 줄.
  - 대기 큐(waiting queue): 대기 상태의 프로세스 큐, 입출력장치를 이용하기 위해 기다리는 줄.
  - 입출력장치별로 큐가 나누어져 있음.
3. 선점형 스케줄링(preemptive scheduling): 어느 하나의 프로세스가 자원 사용을 독점할 수 없는 스케줄링 방식. 정해진 시간, 정해진 빈도만큼만 CPU 사용 가능.
  - 장점: 한 프로세스의 자원 독점을 막고 골고루 자원을 배분할 수 있음.
  - 단점: 문맥 교환 과정에서 오버헤드 발생 가능
4. 비선점형 스케줄링(non-preemptive scheduling): 어느 한 프로세스가 대기상태가 되거나 종료하기 전까지 다른 프로세스의 자원 사용을 막음.
  - 장점: 문맥 교환 과정의 오버헤드가 줄어듦
  - 단점: 한 프로세스의 독점이 끝날 때까지 기다려야 함.


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

1. 선입 선처리 스케줄링(FCFS (First Come First Served)): 단순히 준비 큐에 삽입된 순서대로 처리하는 비선점 스케줄링.
  - 이전 프로세스의 실행 시간이 길수록 다음 프로세스들이 기다리는 시간이 길어진다. 이런 현상을 호위 효과(convoy effect)라고 한다.
2. 최단 작업 우선 스케줄링(CJF (Shortest Job First))CPU 사용 시간이 가장 짧은 프로세스부터 처리하는 스케줄링 방식. 기본적으로 비선점 스케줄링.
3. 라운드 로빈 스케줄링(RR (Round Robin)): 선입 선처리 스케줄링 + 타임 슬라이스(time slice)프로세스가 CPU를 정해진만큼만 사용하는 알고리즘. 만약 시간을 다 썼는데도 작업이 끝나지 않았다면 다시 큐의 맨 뒤에 삽입(문맥 교환 발생).
  - 타임 슬라이스가 너무 길면, 선입 선처리 스케줄링과 동일하게 호위 효과 발생. 너무 짧으면 문맥 교환이 잦아져 오버헤드 발생 높아짐.
4. 최소 잔여 시간 우선 스케줄링(SRT (Shortest Remaining Time)): 최단 작업 우선 스케줄링 + 라운드 로빈 스케줄링. 정해진 시간만큼 CPU를 이용하되, 다음으로 CPU를 사용할 프로세스로는 남은 작업 시간이 제일 작은 프로세스 선택.
5. 우선순위 스케줄링(priority scheduling): 프로세스들에 우선순위를 부여하고, 우선순위가 높은 프로세스부터 실행. 최단 작업 우선 스케줄링, 최소 잔여 시간 우선 스케줄링도 여기에 포함.
  - 기아(starvation) 현상 발생 가능. 우선순위가 낮은 프로세스는 먼저 삽입되었음에도 불구하고 계속 순위가 밀릴 수 있음.
  - 에이징(aging): 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 방식. (예를 들어 1초 기다릴 때마다 우선순위가 1씩 높아짐.)
6. 다단계 큐 스케줄링(Multilevel queue): 우선순위별로 여러 개의 준비 큐 사용. 우선순위가 가장 높은 큐의 프로세스를 먼저 처리하고, 큐가 비면 다음 우선순위 큐의 프로세스 실행. 큐 별로 다른 스케줄링 알고리즘 적용 가능.
  - 큐 간의 이동이 불가능하기 때문에 기아 현상 발생 가능.
7. 다단계 피드백 큐 스케줄링(Multilevel feedback queue): 큐 간의 기동이 가능함. 새로 준비 상태가 된 프로세스가 있다면 가장 높은 우선순위 큐에 삽입, 타임 슬라이스만큼 실행된 뒤 모두 끝나지 않았다면 다음 우선순위 큐에 삽입. 이렇게 CPU를 오래 써야 하는 프로세스는 우선순위가 점차 낮아짐. 반대로 CPU를 적게 사용하는 프로세스는 자연스레 우선순위가 높은 큐에서 실행이 끝남.
  - 가장 일반적인 CPU 스케줄링 알고리즘.