본문 바로가기
혼공단

[혼공단 10기] 혼자 공부하는 컴퓨터 구조+운영체제 4주차

by ra388 2023. 7. 28.

9장 내용 정리

09-1 운영체제

실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램.

실행할 프로그램을 메모리에 적재하고, 더 이상 실행되지 않는 프로그램을 메모리에서 삭제한다.

  • 커널 영역: 메모리 내의 운영체제가 적재된 영역
  • 사용자 영역: 메모리 내의 사용자가 이용하는 응용 프로그램이 적재되는 영역

09-2 운영체제의 큰 그림

커널: 운영체제의 핵심 서비스를 담당하는 부분으로 운영체제의 핵심 서비스는 다음과 같다.

  • 프로세스 관리: 실행중인 프로그램을 프로세스, 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있다.
  • 자원 접근 및 할당 
  • 파일 시스템 관리

사용자 인터페이스: 운영체제의 서비스 중 커널에 포함되지 않는 서비스 중 하나

  • 그래픽 유저 인터페이스(GUI): 그래픽 기반으로 컴퓨터와 상호작용하는 인터페이스 
  • 커맨드 라인 인터페이스(CLI): 명령어를 기반으로 컴퓨터와 상호작용하는 인터페이스

이중 모드: CPU가 명령어를 실행하는 모드를 사용자 모드와 커널 모드로 구분하는 방식

  • 사용자 모드: 운영체제 서비스를 제공받을 수 없는 실행 모드, 즉 커널 영역의 코드를 실행할 수 없는 모드
  • 커널 모드: 운영체제 서비스를 제공받을 수 있는 실행 모드, 운영체제는 커널 모드로 실행되기 때문에 자원에 접근 가능하다.
  • 시스템 호출(시스템 콜): 사용자 모드로 실행되는 프로그램이 운영체제 서비스를 제공받기 위한 요청하여 커널 모드로 전환한다. 일종의 소프트웨어적인 인터럽트이다.

10장 내용 정리

10-1 프로세스 개요

프로세스: 실행 중인 프로그램으로 윈도우에서는 [작업관리자]-[프로세스], 유닉스에서는 ps 명령어로 확인할 수 있다.

  • 포그라운드 프로세스(foreground process): 사용자가 보는 앞에서 실행되는 프로세스
  • 백그라운드 프로세스(background process): 사용자가 보지 못하는 뒤에서 실행되는 프로세스로 사용자와 상호작용하는 백그라운드 프로세스도 있지만, 정해진 일만 수행하는 백그라운드 프로세스도 있는데, 이를 유닉스에서는 데몬, 윈도우에서는 서비스라고 부른다.

프로세스 제어 블록(Process Control Block): 프로세스와 관련된 정보를 저장하는 자료 구조, 커널 영역에 생성된다.

  • 프로세스 ID(PID): 특정 프로세스를 식별하기 위해 부여하는 고유한 번호.
  • 레지스터 값: 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.
  • 프로세스 상태: 현재 프로세스가 어떤 상태인지가 담긴다.
  • CPU 스케줄링 정보: 프로세스가 언제 어떤 순서로 CPU를 할당받을지에 대한 정보가 기록된다.
  • 메모리 관리 정보: 프로세스마다 메모리에 저장된 위치가 다르기 때문에 주소에 대한 정보가 담긴다.
  • 사용자 파일과 입출력장치 목록: 어떤 입출력장치가 프로세스에 할당되었는지, 어떤 파일을 열었는지에 대한 정보가 기록된다.

문맥 교환: 프로세스 제어 블록(PCB)에 기록되는 정보들을 문맥, 기존 프로세스의 문맥를 PCB에 백업하고, 새로운 프로세스의 문맥을 PCB에 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환이라고 한다. 너무 자주하면 오버헤드가 발생할 수 있기 때문에 문맥 교환이 자주 일어난다고 해서 반드시 좋은 것은 아니다.

 

프로세스의 메모리 영역: 사용자 영역에서 프로세스가 배치되는 방법은 다음과 같다.

정적 할당 영역: 프로그램을 구성하는 것들이 담겨 있어 크기가 고정된 영역

  • 코드 영역(텍스트 영역): CPU가 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장된다. 데이터가 아닌 명령어가 저장된 것으로 쓰기가 금지된 읽기 전용이다.
  • 데이터 영역: 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간, 전역 변수가 대표적이다.

동적 할당 영역: 프로그램이 실행되는 과정에서 그 크기가 변할 수 있는 영역

  •  힙 영역: 프로그래머가 직접 할당할 수 있는 저장 공간, 언젠가는 해당 공간을 반환해야 한다. 메모리의 낮은 주소에서 높은 주소로 할당된다.
    • 메모리 누수: 메모리 공간을 반환하지 않아 할당된 공간이 메모리 내에 계속 남아 메모리 낭비를 초래하는 문제
  • 스택 영역: 데이터를 일시적으로 저장하는 공간, 함수의 실행이 끝나면 사라지는 매개 변수, 지역 변수가 대표적이다. 메모리의 높은 주소에서 낮은 주소로 할당된다.

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

프로세스의 상태

  • 생성 상태(new): 프로세스를 생성 중인 상태, 이제 막 메모리에 적재되어 PCB를 할당받은 상태. 준비상태가 된다.
  • 준비 상태(ready): 차례를 기다리는 상태, 차례가 되면 CPU를 할당받으면 실행상태가 된다.
  • 실행 상태(running): CPU를 할당받아 실행 중인 상태, 할당된 시간을 모두 사용하면 준비상태가 되고, 입출력장치를 사용하여 기다려야할 경우 대기 상태가 된다.
  • 대기 상태(blocked): 입출력장치의 작업을 기다리는 상태로, 입출력 작업이 완료되면 다시 준비상태로 CPU할당을 기다린다.
  • 종료 상태(terminated): 프로세스가 종료된 상태.

프로세스 계층 구조: 최초의 프로세스가 자식 프로세스를 생성하고 자식 프로세스가 새로운 프로세스들을 생성하는 과정을 도표로 그린 것.

  • 부모 프로세스: 새 프로세스를 생성한 프로세스
  • 자식 프로세스: 부모 프로세스에 의해 생성된 프로세스
  • PPID(Parent PID): 자식 프로세스의 PCB에 부모 프로세스의 PID

프로세스 생성 기법

  • fork: 자기 자신의 복사본을 만드는 시스템 호출, 부모 프로세스가 fork를 통해 자식 프로세스를 만든다.
  • exec: 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출, exec를 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고 나머지 영역은 초기화 된다.

10-3 스레드

프로세스와 스레드

스레드: 프로세스를 구성하는 실행 흐름의 단위, 하나의 프로세스는 여러 개의 스레들를 가질 수 있다. 스레드는 프로세스 내에서 각기 다른 스레드 ID, 레지스터 값, 스택으로 구성된다. 리눅스에서는 프로세스와 스레드를 구분 짓지 않고 태스크라고 동일하게 부른다.

  • 단일 스레드 프로세스: 모든 프로세스가 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스
  • 멀티 스레드 프로세스: 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있다. 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다.

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

멀티 프로세스 멀티 스레드
여러 프로세스를 동시에 실행 여러 스레드로 프로세스를 동시에 실행
프로세스끼리 자원 공유  스레드끼리 자원을 공유
독립적으로 실행된다 스레드끼리 협력과 통신에 유리하다.
하나의 프로세스에 문제가 생겨도 다른 프로세스에 지장이 없다 하나의 스레드에 문제가 생기면 다른 스레드도 영향을 받는다

11장 내용 정리

11-1 CPU스케줄링 개요

CPU 스케줄링: 운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것.

 

프로세스 우선순위: 각각의 상황에 맞게, 프로세스의 중요도에 따라 CPU를 배분한다.

  • 입출력 집중 프로세스: 입출력 작업(입출력 버스트)이 많은 프로세스로 입출력을 위한 대기 상태에 많이 머무른다.
  • CPU 집중 프로세스: CPU작업(CPU 버스트)이 많은 프로세스로 대기 상태보다는 실행 상태에 더 많이 머무른다.

스케줄링 큐: 운영체제는 먼저 자원을 이용할 프로세스를 찾으려고 PCB를 일일이 검사하는게 아니라, 줄을 세운다.

  • 준비 큐: CPU를 이용하고 싶은 프로세스들이 서는 줄
  • 대기 큐: 입출력장치를 이용하기 위해 대기 상태에 접어든 프로세스들이 서는 줄

선점형과 비선점형 스케줄링: 급하게 자원을 써야하는 프로세스가 생길 경우

  • 선점형 스케줄링: 운영체제가 자원을 이용하고 있는 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링
    • 장점: 어느 한 프로세스의 자원 독점을 막고 프로세스들에 골고루 자원을 배분할 수 있다.
    • 단점: 문맥 교환 과정에서 오버헤드가 발생할 수 있다.
  • 비선점형 스케줄링: 다른 프로세스가 끼어들 수 없는 스케줄링 방식
    • 장점: 문맥 교환에서 발생하는 오버헤드는 비교적 적다.
    • 단점: 하나의 프로세스가 자원을 사용 중이라면 당장 자원이 필요하더라도 무작정 기다려야 한다.

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

스케줄링 알고리즘 종류

  • 선입 선처리 스케줄링(FCFS; First Come First Served 스케줄링): 단순히 준비 큐에 삽입된 순서대로 프로세스들을 처리하는 비선점형 스케줄링 방식
    • 호위 효과(convoy effect): 실행 시간이 짧더라도 기다리는 시간이 매우 길어질 수 있는 현상
  • 최단 작업 우선 스케줄링(SJF;Shortedst Job First 스케줄링): 준비 큐에 삽입된 프로세스들 중 CPU이용 시간의 길이가 가장 짧은 프로세스부터 실행하는 스케줄링 방식, 비선점형 스케줄링 알고리즘으로 분류된다.
  • 라운드 로빈 스케줄링: 선입 선처리 스케줄링에 타임 슬라이스라는 개념이 더해진 것으로, 타임 슬라이스의 크기가 지나치게 크면 호위 효과가 생길 수 있고 지나치게 작으면 문맥 교환에 발생하는 비용이 더 커진다.
    • 타임 슬라이스: 각 프로세스가 CPU를 사용할 수 있는 정해진 시간
  • 최소 잔여 시간 우선 스케줄링(SRT;Shortest Remaining Time 스케줄링): 최단 작업 우선 스케줄링 알고리즘 과 라운드 로빈 알고리즘을 합친 스케줄링. 정해진 타임 슬라이스만큼 CPU를 사용하되 다음 프로세스는 남아있는 작업 시간이 가장 적은 프로세스가 선택된다.
  • 우선 순위 스케줄링: 프로세스들에 우선순위를 부여하는 스케줄링 알고리즘, 우선순위가 같으면 선입 선처리로 스케줄링된다. 
    • 기아(starvation) 현상: 우선순위가 낮은 프로세스들이 높은 프로세스들에 의해 실행이 계속해서 연기되는 것
    • 에이징: 기아 현상을 방지하기 위한 대표적인 기법, 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 방식
  • 다단계 큐 스케줄링: 우선순위 스케줄링의 발전된 형태로, 우선순위별로 준비 큐를 여러 개 사용하는 스케줄링, 큐마다 타임 슬라이스를 여러 개 지정할 수도 있고, 큐마다 다른 스케줄링 알고리즘을 사용할 수도 있다. 단, 우선순위가 낮은 프로세스는 계속해서 연기되는 기아 현상이 발생할 수 있다.
  • 다단계 피드백 큐 스케줄링: 다단계 큐 스케줄링의 발전된 형태로 프로세스들이 큐 사이를 이동할 수 있게 한 스케줄링. 한 프로세스의 CPU 이용 시간이 길면 낮은 우선순위로 이동시키고, 낮은 우선순위 큐에서 너무 오래 기다린 프로세스는 높은 우선순위 큐로 이동시킬 수 있는 알고리즘. 구현이 복잡하지만 가장 일반적인 CPU 스케줄링 알고리즘.

기본 미션

p.304의 확인 문제 1번 풀고 인증하기

선택 미션

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

>>> 선입 선처리 스케줄링은 먼저 들어온 순으로 먼저 처리된다. 따라서 A-B-C-D