SangKins

[혼공컴운] 4주차 운영체제, 프로세스, 스레드, 스케쥴링에 대해서 본문

Dev/혼공단

[혼공컴운] 4주차 운영체제, 프로세스, 스레드, 스케쥴링에 대해서

holdbird 2024. 1. 26. 00:21

혼공학습단도 어느덧 4주차가 되었습니다. 해이해지지 않고 열심히 공부하도록 하겠습니다.

✅혼자 공부하는 컴퓨터 구조+운영체제

#혼공학습단 #혼공 #혼공컴운

# 진도 기본 미션 선택 미션
1주차
(1/2 ~ 1/7)
Chapter 01 ~ 03 p. 51의 확인 문제 3번, p. 65의 확인 문제 3번 풀고 인증하기 p. 100의 스택과 큐의 개념을 정리하기
2주차
(1/8 ~ 1/14)
Chapter 04 ~ 05 p. 125의 확인 문제 2번, p. 155의 확인 문제 4번 풀고 인증하기 Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기
3주차
(1/15 ~ 1/21)
Chapter 06 ~ 08 p. 185의 확인 문제 3번, p. 205의 확인 문제 1번 풀고 인증하기 Ch.07(07-1) RAID의 정의와 종류를 간단히 정리해 보기
4주차
(1/22 ~ 1/28)
Chapter 09 ~ 11 p. 304의 확인 문제 1번 풀고 인증하기 Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기
5주차
(1/29 ~ 2/4)
Chapter 12 ~ 13 p. 363의 확인 문제 1번 풀고 인증하기 Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기
6주차
(2/5 ~ 2/12)
Chapter 14 ~ 15 p. 400의 확인 문제 1번 풀고 인증하기 Ch.14(14-3) 프로세스가 사용할 수 있는 프레임이 3개 있고, 페이지 참조열이 '2313523423' 일 때 LRU 페이지 교체 알고리즘으로 이 페이지를 참조한다면 몇 번의 페이지 폴트가 발생하는지 풀어보기

 

  • Chapter 09 운영체제 시작하기
  •       09-1 운영체제를 알아야 하는 이유
  •       09-2 운영체제의 큰 그림
  • Chapter 10 프로세스와 스레드
  •       10-1 프로세스 개요
  •       10-2 프로세스 상태와 계층 구조
  •       10-3 스레드
  • Chapter 11 CPU 스케줄링
  •       11-1 CPU 스케줄링 개요
  •       11-2 CPU 스케줄링 알고리즘

 

 

운영체제란

Pixabay

프로그램 실행에 필요한 요소들을 자원이라고 하는데.

이러한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램을 OS(운영체제)라고 한다.

 

운영체제는 메모리 내 커널 영역에 저장되며, 커널 영역을 제외한 공간은 사용자 영역으로, 일반적인 프로그램들이 적재된다.

커널 영역에 있는 운영체제가 사용자 영역에 적재된 프로그램들에 자원을 할당하고 실행을 돕는 것이다.

 

위에서 이야기한 커널 영역에 대해서 알아보자. 앞으로 운영체제라 함은 대체로 커널을 지칭한다.

 

커널에 포함되지 않는 운영체제의 서비스에는 사용자 인터페이스가 있다.

사용자 인터페이스는 GUI, CLI 등이 있다.

 

운영체제는 응용 프로그램이 자원에 접근하려 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호한다.

이때 이중 모드시스템 호출이 사용된다.

 

이중모드

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

사용자 모드 : 운영체제 서비스를 제공받을 수 없는 모드, 커널 영역 코드 실행 불가, 자원 접근 명령어 실행 불가

커널 모드: 운영체제 서비스를 제공받을 수 있는 모드, 커널 영역 코드 실행 가능, 자원 접근 가능

 

시스템 호출

사용자 모드에서 운영체제 서비스를 제공받기 위해 운영체제에 보내는 요청으로

일종의 소프트웨어 인터럽트

시스템 호츨 명령어 실행 시 CPU는 기존 작업을 백업, 커널에서 실행 후 다시 기존 작업으로 복귀

 

 

운영체제의 핵심 서비스

  • 프로세스 관리
  • 실행 중인 프로그램
  • 자원 접근 및 할당
  • CPU, 메모리, 입출력장치
  • 파일 시스템 관리
  • 보조기억장치 데이터를 파일과 디렉토리로 관리하는 파일 시스템

 

프로세스와 스레드

프로세스 개요
실행 중인 프로그램을 프로세스 process라고 한다. 컴퓨터는 수많은 프로세스들이 실행되는데,
유닉스 체계의 운영체제에서는 ps 명령어를 통해 실행 중인 프로세스를 확인할 수 있다.

ps -ef

 

윈도우 운영체제에서는 tasklist와 작업 관리자를 통해 확인할 수 있습니다.

tasklist

 

 

포그라운드 프로세스 
- 사용자가 볼 수 있는 공간에서 실행되는 프로세스


백그라운드 프로세스

- 보이지 않는 공간에서 실행되는 프로세스


사용자와 상호작용하지 않고 정해진 작업을 수행하는 것을 데몬 daemon 이라 한다.

윈도우 운영체제에서는 서비스 service 라고 함.


프로세스 제어 블록

nanoslavic

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

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

 

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

 

  • 사용한 파일과 입출력장치 목록
    • 어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일을 열었는지 등의 정보.

문맥 교환

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

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

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

(CISC,RISC)

 

프로세스의 메모리 영역

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

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

 

프로세스 상태와 계층 구조

여러 프로세스들이 빠르게 번갈아가며 실행되는 과정에서
각각의 프로세스는 여러 상태를 거치며 실행되며
그 상태는 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 가 포함되기도 합니다.

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

 

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

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

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

fork 후 자식 프로세스가 exec 을 하지 않으면 부모 프로세스와 동일한 코드를 병행하여 실행하게 됨 .



스레드

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

프로세스를 구성하는 실행 단위
프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성
힙, 데이터, 코드 영역 등 다른 프로세스 자원은 공유하고 기존의 한 번에 하나의 일만 처리하는 프로세스는 단일 스레드 프로세스라고 말한다.


멀티 프로세스 multi-process

  • 여러 프로세스를 동시에 실행하는 것
  • 프로세스끼리 자원을 공유하지 않음
  • 프로세스끼리 영향력이 적다
  • IPC, 공유 메모리 등으로 통신은 가능하지만 까다로움

 

멀티 스레드 

  • 프로세스 내에 여러 스레드를 동시에 실행하는 것
  • 스레드끼리 프로세스 자원을 공유한다
  • 멀티 프로세스보다 메모리를 더 효율적으로 사용 가능
  • 통신에 유리

 

CPU 스케줄링

공정하고 합리적으로 CPU 자우너을 할당하기 위해 운영체제는 어떤 프로세스에 CPU를 할당할지, 어떤 프로세스를 기다리게 할지를 결정합니다.

 

프로세스마다 우선순위가 다르기 때문에 각각의 상황에 맞게 CPU를 배분하는 방법이라고 생각하면 됩니다.

 

입출력 집중 프로세스
입출력 작업이 많은 프로세스.
대표적으로 비디오 재생이나 디스크 백업 작업 등을 담당하는 프로세스


CPU 집중 프로세스 

CPU 작업이 많은 프로세스.
대표적으로 복잡한 수학 연산, 컴파일, 그래픽 처리 작업 등을 담당하는 프로세스
입출력 집중 프로세스와 CPU 집중 프로세스가 동시에 CPU 자원을 요구할 경우 입출력 집중 프로세스를 먼저 실행하여 입출력장치를 끊임없이 작동시키고 해당 프로세스가 입출력 작업을 하며 대기 상태로 존재하는 동안 CPU 집중 프로세스에 CPU를 집중적으로 할당하는 것이 효율적입니다.

운영체제는 프로세스마다 PCB에 우선순위를 부여하고 이를 기반으로 먼저 처리할 프로세스를 결정하는데
매번 PCB를 확인하는 것은 비효율적입니다.
따라서 프로세스의 상태별로 우선순위에 따라 줄을 세워두고 순서를 결정하는데 이 줄을 스케줄링 큐라고 합니다.
자료구조의 관점에서 FIFO 구조 이지만 반드시 선입선출일 필요는 없습니다.

준비 큐
CPU를 이용하고 싶은 프로세스들이 줄을 서는 스케줄링 큐

 

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


프로세스가 실행되고 있을때 우선순위가 높은 프로세스가 오면 중단 하고 실행하느냐, 끝나고 실행하느냐에 따라 2가지 방법이 있습니다.

선점형 스케줄링 preemptive scheduling
프로세스가 시스템 자원을 사용하고 있더라도 운영체제가 강제로 빼앗아 다른 프로세스에게 할당 가능
어느 하나의 프로세스가 자원 사용을 독점할 수 없는 방식
대부분의 운영체제에서 사용하고 있는 방식
프로세스들에 골고루 자원을 배분할 수 있습니다. 문맥 교환 과정에서의 오버헤드가 발생합니다.


비선점형 스케줄링 non-preemptive scheduling
프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까진 다른 프로세스가 끼어들 수 없는 방식
하나의 프로세스가 자원 사용을 독점할 수 있는 방식
문맥 교환 시 오버헤드는 적지만 모든 프로세스가 자원을 골고루 사용 불가합니다.

 


CPU 스케줄링 알고리즘

운영체제마다 서로 다른 스케쥴링 알고리즘을 사용한다. 여기서는 일곱 가지 방식을 예로 들었습니다.


선입 선처리 스케줄링 (FCFS)
FCFS 스케줄링(FIFO)
준비 큐에 삽입된 순서대로 처리하는 비선점형 스케줄링 방식.
CPU를 오래 사용하는 프로세스가 먼저 도착하면 프로세스들이 기다리는 시간이 매우 길어질 수 있는데

이렇게 CPU를 짧게 사용하는 프로세스가 CPU를 오래 사용하는 프로세스를 기다리며 잠깐의 실행을 위해 오래 기다리게 되는 현상을 호위 효과라고 합니다.


최단 작업 우선 스케줄링 Shortest Job First Scheduling (SJF)
SJF 스케줄링  
호위 효과를 방지하기 위해 CPU 사용 시간이 짧은 프로세스를 먼저 실행하는 비선점형 스케줄링 방식입니다..


라운드 로빈 스케줄링 Round Robin scheduling (RR)
선입 선처리 스케줄링에 프로세스가 CPU를 사용할 수 있도록 정해진 시간 타임 슬라이스개념이 더해진 것입니다.
정해진 시간만큼 CPU를 이용하고 아직 프로세스가 완료되지 않았다면

준비 큐 맨 뒤에 삽입.타임 슬라이스가 너무 크면 호위 효과의 발생이 가능합니다.

너무 작으면 문맥 교환 오버헤드가 커집니다.

 

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

SRT 스케줄링 
최단 작업 우선 스케줄링에 라운드 로빈 스케줄링을 합쳐 선점형 스케줄링 방식으로 구현한 것입니다.
작업 시간 대신 잔여 시간을 기준으로 짧은 것을 앞에 둡니다.
정해진 타임 슬라이스만큼 CPU를 사용하면서 남아있는 작업 시간이 가장 짧은 것을 우선시합니다.


우선순위 스케줄링 Priority (FCFS)
프로세스들에 우선순위를 부여하고, 우선순위가 높은 프로세스부터 실행하는 방식입니다.
우선순위가 같은 프로세스끼리는 선입 선처리 (FCFS)
최단 작업 우선 스케줄링과 최소 잔여 시간 우선 스케줄링도 넓게 보면 여기에 포함.
우선순위가 낮은 프로세스의 실행이 계속 연기되는 기아 현상이 발생 가능합니다. 이러한 해결책으로
오래 대기한 프로세스의 우선순위를 높이는 에이징 기법으로 기아 현상을 방지합니다.


다단계 큐 스케줄링 Multi-Level Queue scheduling
우선순위별로 준비 큐를 여러 개 사용하는 방식입니다.
우선순위가 가장 높은 큐에 있는 프로세스를 먼저 처리하고, 비어 있을 경우 다음 우선순위의 큐를 처리합니다.
프로세스 유형별로 우선순위를 구분하여 실행하기 편리하고, 큐별로 타임 슬라이스, 스케줄링 알고리즘 등을 개별적으로 설정 가능합니다

ex: 선입 선처리, 라운드 로빈


다단계 피드백 큐 스케줄링 Multi-Level Feedback Queue scheduling
다단계 큐 스케줄링에서 발생할 수 있는 기아 현상을 방지하기 위해 발전된 형태로 우선순위에 따라 타임 슬라이스만큼 실행한 후, 완료되지 않았다면 다음 우선순위의 큐에 삽입합니다.
오랫동안 실행되지 못했다면 에이징 기법을 적용하여 높은 우선순위의 큐로 이동합니다.
CPU를 오래 사용할수록 점점 우선순위가 낮아지고 오래 기다리면 에이징 기법으로 우선순위가 높아진다.

 

 

 


 

304P - 1번

 

생성 상태

준비 상태

실행 상태

종료 상태

대기 상태

 

 

선택미션

 

스케줄링 기법CPU 할당

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

 

 

 

 

혼자 공부하는 컴퓨터 구조+운영체제

어려운 컴퓨터 구조와 운영체제의 원리를 누구나 쉽게 이해할 수 있도록 용어와 개념은 한 번 더 풀어쓰고, 적절한 예시와 이해하기 쉬운 그림으로 재미있게 구성했다. 또한 일상 소재를 활용한

www.hanbit.co.kr