본문 바로가기
Computer Science/Computer Architecture, Operating System

[혼공컴운] 4주차_Chapter 09~11

by 양진주 2024. 2. 9.
기본미션
p. 304의 확인 문제 1번 풀고 인증하기

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

 

Chapter 0️⃣9️⃣

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

(시스템) 자원: 프로그램 실행에 마땅히 필요한 요소들

e.g. 컴퓨터 부품(CPU, 메모리, 보조기억장치, 입출력 장치)

⬇️

운영체제: 실행할 프로그램에 필요한 자원 할당 + 프로그램이 올바르게 실행되도록 돕는 프로그램

메모리 = 커널 영역(운영 체제) + 사용자 영역(응용 프로그램)

 

운영 체제를 깊이 이해하면 ➡️ 하드웨어와 프로그램을 더 깊이 이해할 수 있음 

 

2) 운영체제의 큰 그림

운영체제의 핵심 서비스:

커널 (자원에 접근하고 조작하는 기능 + 프로그램이 올바르고 알전하게 실행되게 하는 기능)

+ 사용자 인터페이스(그래픽 유저 인터페이스, 커맨드 라인 인터페이스)

 

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

사용자 모드: 운영체제 서비스를 제공받을 수 없는 실행 모드(시스템 호출 필요) ➡️ 커널 영역의 코드 실행 불가

e.g. 일반적인 응용 프로그램

커널 모드: 운영체제 서비스를 제공받을 수 있는 실행 모드 ➡️ 커널 영역의 코드 실행 가능 

e.g. 운영체제 

 

시스템 호출(시스템 콜): 인터럽트의 일종, 사용자 모드 프로그램 커널 모드 전환 ➡️ 운영체제 커널 서비스 제공

 

시스템 호출 처리 순서 = 인터럽트 처리 순서 [Chapter 04]

1. 시스템 호출 발생 명령어 실행

2. CPU: 현재 작업 백업 

3. 인터럽트 서비스 루틴 실행

4. 기존에 실행하던 응용 프로그램 복귀, 이전 작업 실행 

 

운영체제 커널 서비스

- CPU: 한 번에 하나의 프로세스만 실행 가능

➡️ 다양한 프로세스 관리/실행 필요 [Chapter 10] + 프로세스 동기화 [Chapter12] + 교착 상태 해결 필요 [Chpater 13]

 

- 운영체제

➡️ CPU: CPU 스케줄링 [Chpater 11]

➡️ 메모리: 프로세스 메모리 할당 방법 + 메모리 부족 시 극복 방법 [Chpater 14]

➡️ 입출력장치: 인터럽트 서비스 루틴 제공 ➡️ 입출력 작업 수행 

 

- 운영체제: 보조기억장치 속 데이터 ➡️ 파일/디렉터리로 관리 [Chapter 15]

 

Chpater 🔟

1) 프로세스 개요

포그라운드 프로세스: 사용자가 보는 앞에서 실행되는 프로세스 

백그라운드 프로세스: 사용자가 보지 못한느 뒤편에서 실행되는 프로세스

- 사용자와 직접 상호작용할 수 있는 백그라운드 프로세스

- 데몬(유닉스)/서비스(윈도우): 사용자와 상호작용하지 않는 백그라운드 프로세스 

 

프로세스 제어 블록(PCB)

if 프로세스 생성 ➡️ 메모리 커널 영역(운영체제)  PCB 생성 ➡️ 특정 프로세스 식별, 해당 프로세스 처리 필요 정보 판단 ➡️ 프로세스 실행 순서 관리 + 프로세스에 자원(CPU) 배분 

- 프로세스 ID: 특정 프로세스 식별 목적 부여 고유 번호 (같은 일 수행 프로그램 N번 실행 ➡️ PID 다른 N 개의 프로세스 생성)
- 레지스터 값: 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들 
- 프로세스 상태: 현재 프로세스의 상태 (입출력장치 사용 대기 상태 or CPU 사용 대기 상태 or CPU 이용 상태)
- CPU 스케줄링 정보: 프로세스가 언제, 어떤 순서로 CPU를 할당받을지
- 메모리 관리 정보: 프로세스가 어느 주소에 저장되어있는지에 대한 정보(베이스 레지스터, 한계 레지스터, 페이지 테이블 정보 [Chapter 14])
- 사용한 파일과 입출력장치 목록: 어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보 

 

문맥: 하나의 프로세스 수행을 재개하기 위해 기억해야할 정보(PCB)

e.g. 프로그램 카운터, 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일, 사용한 입출력장치

 

문맥 교환: if 프로세스 CPU 사용 시간 끝 or 인터럽트 발생 ➡️ 운영체제: 해당 프로세스의 PCB에 문맥 백업 ➡️ 프로세스 B의 문맥 복구 

 

프로세스 생성 ➡️ 사용자 영역(코드 영역, 데이터 영역, 힙 영역, 스택 영역) 분할 저장 

- 코드 영역(= 텍스트 영역): 정적 할당 영역, 코드(기계어로 이루어진 명령어) 저장
CPU가 실행할 명령어 ➡️ 읽기 전용 공간(쓰기 금지)

- 데이터 영역: 정적 할당 영역, 프로그램이 실행되는 동안 유지할 데이터 저장
e.g. 전역 변수 [Chapter 12]

- 힙 영역: 동적 할당 영역(낮은 주소 ➡️ 높은 주소), 프로그래머가 직접 할당할 수 있는 저장 공간
(언젠가 해당 공간을 반환해야함 or 메모리 누수 문제)

- 스택 영역: 동적 할당 영역(높은 주소 ➡️ 낮은 주소) ,  데이터를 일시적으로 저장하는 공간 
저장할 데이터 - PUSH / 필요하지 않은 데이터 - POP
e.g. 매개 변수, 지역 변수 

 

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

프로세스 상태 

- 생성 상태: 프로세스를 생성 중인 상태(메모리 적재 ➡️ PCB 할당)

- 준비 상태: CPU 할당 받아 실행 가능 but 차례 기다리고 있는 상태 

- 실행 상태: CPU 할당 받아 실행 중, 할당된 일정 시간 동안만 CPU 사용 가능 

- 대기 상태: 입출력장치의 작업을 기다리는 상태 

- 종료 상태: 프로세스가 종료된 상태, PCB와 프로세스가 사용한 메모리 정리 

프로세스 상태 다이어그램

 

부모 프로세스: 새 프로세스를 생성한 프로세스 (개별 PID)

자식 프로세스: 부모 프로세스에 의해 생성된 프로세스 (개별 PID + Parent PID)

➡️ 최초의 프로세스가 자식 프로세스들을 생성, 자식 프로세스들이 새로운 프로세스들을 생성...

➡️ 프로세스 계층 구조

 

➕최초의 프로세스

    유닉스 - init

    리눅스 - systemd

    macOS - launched

 

부모 프로세스: fork ➡️ 자식 프로세스(복사본) 생성 ➡️ 자식 프로세스: exex ➡️ 자신의 메모리 공간을 새로운 프로그램으로 덮어씀(새로운 프로그램으로 전환) 

+ exec 호출하지 않는 경우) 부모 프로세스 & 자식 프로세스: 같은 코드 병행하여 실행 

 

os를 import해 자식프로세스를 생성하고, 각기 다른 작업을 수행하도록 하는 코드와 출력 결과 

 

 

❓기본 미션
Q. 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. 1부터 5까지 올바른 상태를 적어보세요. 
A. 1 - 생성 상태, 2 - 준비 상태, 3 - 실행 상태, 4 - 종료 상태, 5 - 대기 상태 

 

3) 스레드

단일 스레드 프로세스: 모든 프로세스가 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스 

스레드 = 프로세스를 구성하는 실행 단위(스레드 ID + 프로그램 카운터 값을 비롯한 레지스터 값 + 스택) ➡️ 각기 다른 코드 실행 가능, 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행됨 

➕ 리눅스: 프로세스 = 스레드 ➡️ 태스크 

 

멀티프로세스: 여러 프로세스를 동시에 실행, 자원 공유 ❌ ➡️ 메모리 낭비 

멀티스레드: 여러 스레드로 프로세스를 동시에 실행, 자원(코드 + 데이터 + 힙 영역) 공유 ⭕ ➡️ 메모리 효율적 사용, 협력 유리 but, 하나의 스레드에 문제 발생 시 프로세스 전체에 문제 발생 

 

➕ 프로세스 간 통신(IPC): 스레드에 비해 까다롭지만 가능하다!

 

Chapter 1️⃣1️⃣

1) CPU 스케줄링 개요 

프로세스: 실행 상태 🔄️ 대기 상태

입출력 집중 프로세스: 입출력 작업이 많은 프로세스, CPU 사용량 ⬇️

e.g. 비디오 재생, 디스크 백업 작업 

CPU 집중 프로세스: CPU 작업이 많은 프로세스, CPU 사용량 ⬆️

e.g. 수학 연산, 컴파일, 그래픽 처리 작업 

 

if 입출력 집중 프로세스 & CPU  집중 프로세스 동시 CPU 자원 요구

:   입출력 집중 프로세스 실행 ➡️ 입출력 장치 작동, CPU 집중 프로세스에 CPU 할당

 

운영체제: 프로세스 우선순위 부여 ➡️ 프로세스의 중요도에 맞게 CPU 이용 ➡️ 우선순위 높은 프로세스: 더 빨리, 자주 실행 

➕ 프로세스 우선순위: 유닉스 체계 운영체제) ps -el

 

❗매번 모든 프로세스의 PCB를 확인해 우선순위를 정하는 것은 비효율적 

➡️ 스케줄링 큐: 모든 프로세스를 큐에 삽입하여 줄을 세움 

 

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

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

(➡️ 입출력 완료 ➡️ 인터럽트 발생 ➡️ 준비 큐로 이동)

 

선점형 스케줄링: 프로세스가 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식 ➡️ 어느 하나의 프로세스가 자원 사용 독점 불가능

🔼 한 프로세스의 자원 독점 방지, 프로세스들에 골고루 자원 배분

🔽 문맥 교환 과정에서 오버헤드 발생 

 

비선점형 스케줄링: 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까진 다른 프로세스가 끼어들 수 없는 스케줄링 방식 

🔼 오버헤드 ⬇️

🔽 모든 프로세스 골고루 자원 사용 불가능 

 

2) CPU 스케줄링 알고리즘 

 

  방식 장점 단점
선입 선처리 스케줄링
(FCFS 스케줄링)
비선점형 스케줄링. 
준비된 큐에 삽입된 순서대로 프로세스들을 처리
공정 호위 효과
(프로세스 대기 시간 ⬆️⬆️⬆️)
최단 작업 우선 스케줄링
(SJF 스케줄링)
비선점형 스케줄링.
CPU 이용 시간의 길이가 가장 짧은 프로세스부터 실행 
호위 효과 방지   
라운드 로빈 스케줄링 선점형 스케줄링.
선입 선처리 스케줄링 + 타임 슬라이스(각 프로세스가 CPU를 사용할 수 있는 정해진 시간)
프로세스가 타임 슬라이스 동안 돌아가며 CPU 이용 
  타임 슬라이스 크기 ⬆️
호위 효과 발생

타임 슬라이스 크기 ⬇️
프로세스 전환 잦음 
최소 잔여 시간 우선 스케줄링
(SRT 스케줄링)
선점형 스케줄링. 
최단 작업 우선 스케줄링 알고리즘 + 라운드 로빈 알고리즘 
   
우선순위 스케줄링 프로세스들에 우선순위 부여, 가장 높은 우선순위를 가진 프로세스부터 실행    기아 현상(우선순위 낮은 프로세스 실행 계속 연기)
➡️ 에이징 기법: 오랫동안 대기한 프로세스 우선순위 ⬆️
다단계 큐 스케줄링  우선순위별로 준비 큐 여러 개 사용
➡️ 우선순위가 가장 높은 큐에 있는 프로세스 먼저 처리,그다음 우선순위에 큐에 있는 프로세스 처리 
우선순위 구분 실행 편리  프로세스들 큐 사이 이동 불가
➡️ 우선순위 낮은 프로세스 계속 연기 (기아 현상)
다단계 피드백 큐 스케줄링  프로세스 큐 사이 이동 가능 ➡️ 
CPU 이용 시간 ⬆️ ▶️ 우선순위 ⬇️ 큐
대기 시간 ▶️ 우선순위 ⬆️ 큐 
  구현 복잡 
❗ 선택 미션 
Q. Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기

A. A, B, C, D 순서