✍️ 기본 미션
p. 304의 확인 문제 1번 풀고 인증하기
✍️ 선택미션
Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기
선입 선처리 스케줄링 알고리즘을 적용하면 준비 큐에 삽입된 순으로 CPU를 할당받는다.
따라서 답은 A → B → C →D 이다.
🗒️내용 정리
Chap09. 운영체제 시작하기
1) 운영체제를 알아야 하는 이유
(1) 운영체제(Operating System)
- 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램
- 자원 : 프로그램 실행에 마땅히 필요한 요소
- 메모리
- 부팅될 때 메모리 내 커널 영역(kernal space)이라는 공간에 따로 적재되어 실행된다.
- 사용자 영역 : 커널 영역을 제외한 나머지 영역으로 사용자가 이용하는 응용 프로그램이 적재되는 영역
- 응용 프로그램(application software) : 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램
(2) 운영체제를 알아야 하는 이유 : 문제 해결의 실마리를 찾을 수 있다.
2) 운영체제의 큰 그림
(1) 운영체제의 심장, 커널(kernal)
- 운영체제의 핵심 서비스를 담당하는 영역
- 운영체제가 제공하는 서비스 중 커널에 표함되지 않는 서비스
- ex. 사용자 인터페이스 (UI; User Interface) : 사용자가 컴퓨터와 상호작용할 수있는 통로
- 그래픽 유저 인터페이스 (GUI : Graphic User Interface), 커맨드 라인 인터페이스(CLI : Command Line Interface)
(2) 이중 모드와 시스템 호출
- 운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는것을 방지하여 자원을 보호한다.
- 이중 모드(dual mode)
- CPU가 명령어를 실행하는 모드를 사용자 모드와 커널 모드로 구분하는 방식
- CPU는 명령어를 사용자 모드로써, 혹은 커널 모드로써 실행 가능.
- 플래그 레지스터 속 슈퍼바이저 플래그를 통해 현재 CPU가 어떤 모드로 실행되는지 알 수 있다.
- 사용자 모드 (user mode)
- 운영체제 서비스를 제공받을 수 없는 실행 모드
- 커널 영역의 코드 실행 불가
- 일반적인 응용 프로그램은 사용자 모드로 실행된다.
- 사용자 모드로 실행 중인 CPU는 하드웨어 자원에 접근하는 명령어 실행 불가
- 사용자 모드로 실행되는 일반적인 응용 프로그램은 자원에 접근할 수 없다.
- 커널 모드 (kernal mode)
- 운영체제 서비스를 제공받을 수 있는 실행 모드
- 커널 영역의 코드를 실행할 수 있는 모드
- CPU가 커널모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다.
- 운영체제는 커널 모드로 실행되기 때문에 자원에 접근할 수 있다.
- 시스템 호출 (System call)
- 사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받기 위해 운영체제에 요청을 보내 커널 모드로 전환되어야 한다.
- 시스템 호출 : 운영체제 서비스를 제공받기 위한 요청
- 시스템 호출은 일종의 인터럽트이다.
- 소프트웨어 인터럽트 : 인터럽트를 발생시키는 특정 명령어에 의해 발생하는 인터럽트
- 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해 나간다.
- 일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스를 매우 빈번하게 이용한다. → 빈번한 시스템 호출
* 가상 머신과 이중 모드의 발전
* 시스템 호출의 종류
종류 | 시스템 호출 | 설명 |
프로세스 관리 | fork() | 새 자식 프로세스 생성 |
execute() | 프로세스 실행 (메모리 공간을 새 프로그램 내용으로 덮어씌움) | |
exit() | 프로세스 종료 | |
waitpid() | 자식 프로세스가 종료할 때까지 대기 | |
파일 관리 | open() | 파일 열기 |
close() | 파일 닫기 | |
read() | 파일 읽기 | |
write() | 파일 쓰기 | |
stat() | 파일 정보 획득 | |
디렉터리 관리 | chdir() | 작업 디렉터리 변경 |
mkdir() | 디렉터리 생성 | |
rmdir() | 비어 있는 디렉터리 삭제 | |
파일 시스템 관리 | mount() | 파일 시스템 마운트 |
unmount() | 파일 시스템 마운트 해제 |
(3) 운영체제의 핵심 서비스
- 프로세스 관리
- 프로세스 (process) : 실행 중인 프로그램
- 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있다.
- CPU는 프로세스들을 번갈아가며 실행한다.
- 운영체제는 다양한 프로세스들을 일목요연하게 관리하고 실행할 수 있어야 한다.
- 여러 프로세스가 동시에 실행되는 환경에서는 프로세스 동기화가 필수적이고, 교착 상태를 해결할 수 있어야 한다.
- 자원 접근 및 할당
- 모든 프로세스는 실행을 위해 자원을 필요로 한다.
- 운영체제는 프로세스들이 사용할 자원에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당한다.
- CPU
- CPU 스케줄링 : 운영체제는 프로세스들에게 공정하게 CPU를 할당하기 위해 어떤 프로세스부터 CPU를 이용하게 할 것인지, 얼마나 오래 CPU를 이용하게 할 것인지를 결정해야 한다.
- 메모리
- 운영체제는 새로운 프로세스가 적재될 때마다 어느 주소에 적재해야 할 지 결정해야 한다.
- 입출력장치
- 입출력장치가 발생시키는 하드웨어 인터럽트도 인터럽트 서비스 루틴이 커널 영역에 있다.
- 입출력 장치가 CPU에 하드웨어 인터럽트 요청 신호를 보내면 CPU는 하던 일을 백업하고 커널 영역에 있는 인터럽트 서비스 루틴을 실행한다.
- 운영체제는 인터럽트 서비스 루틴을 제공함으로써 입출력 작업을 수행한다.
- 파일 시스템 관리
Chap10. 프로세스와 스레드
1) 프로세스 개요
(1) 프로세스 직접 확인하기
- ps 명령어
- 포그라운드 프로세스 (foreground process) : 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스 (background process) : 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
- 사용자와 상효작용하지 않는 백그라운드 프로세스
- 유닉스 체계 운영체제 : 데몬(daemon)
- 윈도우 운영체제 : 서비스(service)
(2) 프로세스 제어 블록 (PCB : Process Control Block)
- 프로세스들은 돌아가며 한정된 시간만큼 CPU를 이용한다.
- 타이머 인터럽트가 발생하면 차례를 양보하고 다음 차례가 올 때까지 기다린다.
- 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다.
- 이를 위해 프로세스 제어 블록을 이용한다.
- 프로세스 제어 블록
- 프로세스와 관련된 정보를 저장하는 자료 구조
- 커널 영역에 생성된다.
- 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다.
- 프로세스 제어 블록에 포함되는 정보
- 프로세스 ID(PID : Process ID) : 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
- 레지스터 값
- 해당 프로세스가 실행했던 프로그램 카운터를 비롯한 레지스터 값이 저장된다.
- 자신의 실행 차례가 되면 이전까지 사용했던 레지스터의 중간값을 모두 복원해 이전의 작업을 이어 실행한다.
- 프로세스 상태
- CPU 스케줄링 정보
- 메모리 관리 정보 : 베이스 레지스터, 한계 레지스터 값과 같은 정보, 페이지 테이블 정보 등이 담긴다.
- 사용한 파일과 입출력장치 목록
(3) 문맥 교환
- 문맥 (context)
- 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
- 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현된다.
- 프로세스가 CPU를 사용할 수 있는 시간이 다 되거나 예기치 못한 상황이 발생하여 인터럽트가 발생하면 운영체제는 해당 프로세스의 PCB에 문맥을 백업한다.
- 문맥 교환 (context switching)
- 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는것
- 여러 프로세스가 끊임없이 빠르게 번갈아가며 실행되는 원리 → 프로세스가 동시에 실행되는 것 처럼 보인다.
- 문맥 교환을 너무 자주 하면 오버헤드가 발생할 수 있다.
(4) 프로세스의 메모리 영역
- 하나의 프로세스는 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.
- 코드 영역 (code segment)
- 텍스트 영역(text segment)이라고도 한다.
- 기계어로 이루어진 명령어가 저장된다.
- CPU가 실행할 명령어가 담겨 있으므로 읽기 전용(read-only) 공간이다. (쓰기가 금지됨.)
- 정적 할당 영역 : 크기가 변하지 않는다.
- 데이터 영역 (data segment)
- 프로그램이 실행되는 동안 유지할 데이터(ex. 전역변수)가 저장되는 공간
- 정적 할당 영역 : 크기가 변하지 않는다.
- 힙 영역 (heap segment)
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 프로그래밍 과정에서 메모리 공간을 힙 영역에 할당했다면 사용 후에 해당 공간을 반환해야 한다.
- 메모리 공간을 반환하지 않으면 메모리 누수(memory leak) 문제가 발생한다.
- 메모리의 낮은 주소에서 높은 주소로 할당된다.
- 스택 영역 (stack segment)
- 데이터를 일시적으로 저장하는 공간
- 함수의 실행이 끝나면 사라지는 매개변수, 지역변수가 저장된다.
- 일시적으로 저장할 데이터는 스택영역에 PUSH되고 더이상 필요하지 않은 데이터는 POP된다.
- 메모리의 높은 주소에서 낮은주소로 할당된다.
2) 프로세스 상태와 계층 구조
(1) 프로세스 상태
: 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다.
- 생성 상태 (new)
- 프로세스를 생성 중인 상태
- 막 메모리에 적재되어 PCB를 할당받은 상태
- 준비 상태 (ready)
- 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 준비 상태가 된다.
- CPU를 할당받으면 실행할 수 있는 상태이지만 자신의 차례가 아니라 기다리고 있다.
- 디스패치 (dispatch) : 준비 상태가 실행 상태로 전환되는 것
- 실행 상태 (running)
- CPU를 할당받아 실행 중인 상태
- 실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU를 사용할 수 있다.
- 이때 프로세스가 할당된 시간을 모두 사용한다면(타이머 인터럽트가 발생) 준비 상태가 된다.
- 실행 도중 입출력 장치를 사용하여 입출력장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.
- 대기 상태 (blocked)
- 입출력 작업은 CPU에 비해 처리 속도가 느리기 때문에 입출력 작업을 요청한 프로세스는 입출력장치가 입출력을 끝낼 때까지(입출력 완료 인터럽트를 받을 때까지) 기다려야 한다.
- 입출력장치의 작업을 기다리는 상태
- 종료 상태 (terminated)
- 프로세스가 종료된 상태
- 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
- 프로세스 상태 다이어그램 (process state diagram)
(2) 프로세스 계층 구조
- 프로세스는 실행 도중 시스템호출을 통해 다른 프로세스를 생성할 수 있다.
- 부모 프로세스 (parent process) : 새 프로세스를 생성한 프로세스
- 자식 프로세스 (child process) : 부모 프로세스에 의해 생성된 프로세스
- 부모 프로세스와 자식 프로세스는 각기 다른 PID를 가진다.
- 많은 운영체제는 프로세스가 프로세스를 낳는 계층형 구조로 프로세스를 관리한다.
(3) 프로세스 생성 기법
- 시스템 호출: exec, fork
- fork
- 자기 자신 프로세스의 복사본을 만드는 시스템 호출
- 부모 프로세스의 자원들이 상속된다.
- exec
- fork를 통해 만들어진 자식 프로세스를 새로운 프로그램으로 전환하는 시스템 호출
- 코드 영역과 데이터영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화된다.
3) 스레드
(1) 프로세스와 스레드
- 단일 스레드 프로세스
- 전통적인 관점에서 하나의 프로세스는 한 번에 하나의 일만을 처리한다.
- 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스
- 스레드 : 프로세스를 구성하는 실행 단위
- 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있다.
- 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있다.
- 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 ㅍ로세스 자원을 공유하며 실행된다.
- 리눅스
- 프로세스와 스레드 모두 실행의 문맥(context of execution)이라는 점에서 동등하게 간주
- 테스크(task)라는 이름으로 통일해 명명한다.
(2) 멀티프로세스와 멀티스레드
- 멀티프로세스 (multiprocess) : 여러 프로세스를 동시에 실행
- 멀티스레드 (multithread) : 여러 스레드로 프로세스를 동시에 실행하는 것
- 스레드들은 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가진 자원을 공유한다. → 메모리를 더욱 효율적으로 사용할 수 있다.
- 스레드는 프로세스의 자원을 공유하기 때문에 서로 협력과 통신에 유리하다.
- 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.
* 프로세스 간 통신 (IPC:Inter-Process Communication)
- 프로세스 간의 자원을 공유하고 데이터를 주고받는 것
- 같은 컴퓨터내의 서로 다른 프로세스나 스레드끼리데이터를 주고받는 것도 통신으로 간주한다.
- 공유 메모리(shared memory) : 프로세스들이 서로 공유할 수 있는 메모리 영역
Chap11. CPU 스케줄링
1) CPU 스케줄링 (CPU scheduling)
: 운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것
(1) 프로세스 우선순위
- 프로세스 구분
- 입출력 집중 프로세스 (I/O bound process)
- 입출력 작업이 많은 프로세스
- 실행 상태보다는 실행을 위한 대기 상태에 더 많이 머물게된다.
- CPU 집중 프로세스 (CPU bound process)
- CPU 작업이 많은 프로세스
- 대기 상태보다 실행 상태에 더 많이 머무르게 된다.
- 프로세스는 CPU 버스트와 입출력 버스트를 반복하며 실행된다.
- CPU 버스트 (CPU burst) : CPU를 이용하는 작업
- 입출력 버스트 (I/O burst) : 입출력장치를 기다리는 작업
- 프로세스 우선순위
- 상황, 프로세스의 중요도에 맞게 프로세스가 CPU를 이용할 수 있도록 하기 위해 운영체제는 프로세스마다 우선순위(priority)를 부여한다.
- 운영체제는 각 프로세스의 PCB에 우선순윌ㄹ 명시하고, PCB에 적힌 우선순위를 기준으로 먼저 처리할 프로세스를 결정한다.
(2) 스케줄링 큐 (scheduling queue)
- 운영체제는 CPU를 사용하고 싶은 프로세스, 메모리에 적재되고 싶은 프로세스, 특정 입출력 장치를 사용하고 싶은 프로세스들을 모두 줄세운다. → 스케줄링 큐로 구현하고 관리
- 대표적인 큐
- 준비 큐 (ready queue) : CPU를 사용하고 싶은 프로세스이 서는 줄
- 대기 큐(waiting queue) : 입출력 장치를 사용하고 싶은 프로세스들이 서는 줄
(3) 선점형과 비선점형 스케줄링
- 선점형 스케줄링 (preemptive schdeduling)
- 프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식
- 어느 한 프로세스의 자원 독점을 막고 프로세스들에 골고루 자원을 배분할 수 있다.
- 문맥 교환 과정에서 오버헤드가 발생할 수 있다.
- 비선점형 스케줄링 (non-preemptive schdeduling)
- 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까진 다른 프로세스가 끼어들 수 없는 스케줄링 방식
- 문맥 교환에서 발생하는 오버헤드가 선점형 스케줄링보다 적다.
- 모든 프로세스가 골고루 자원을 사용할 수 없다.
2) CPU 스케줄링 알고리즘
(1) 선입 선처리 스케줄링 (FCFS 스케줄링 ; First Come For Scheduling)
- 준비 큐에 삽입된 순서대로 프로세스를 처리하는 비선점형 스케줄링
- 호위 효과 (convey effect) : 때때로 프로세스들이 기다리는 시간이 매우 길어진다.
(2) 최단 작업 우선 스케줄링 (SJF 스케줄링 ; Shortest Job First Scheduling)
- 준비 큐에 삽입된 프로세스 중 CPU 이용 시간의 길이가 가장 짧은 프로세스부터 실행하는 스케줄링 방식
- 기본적으로 비선점형 스케줄링 알고리즘으로 분류되지만, 선점형으로 구현될 수 있다.
- 선점형 최단 작업 우선 스케줄링 : 최소 잔여 시간 우선 스케줄링
(3) 라운드 로빈 스케줄링 (round-robin scheduling)
- 선입 선처리 스케줄링 + 타임 슬라이스
- 타임 슬라이스
- 각 프로세스가 CPU를 사용할 수 있는 정해진 시간
- 크기가 매우 중요하다.
- 정해진 타임 슬라이스만큼의 시간 동안 돌아가며 CPU를 이용하는 선점형 스케줄링
-정해진 시간을 다 사용하였음에도 불구하고 아직 프로세스가 완료되지 않았다면 다시 큐의 맨 뒤에 삽입된다.
(4) 최소 잔여 시간 우선 스케줄링 (SRT(Shortest Remaining Time) 스케줄링)
- 최단 작업 우선 스케줄링 알고리즘 + 라운드 로빈 알고리즘
- 프로세스들은 정해진 타임 슬라이스만큼 CPU를 사용하되, CPU를 사용할 다음 프로세스로는 남아있는 작업 시간이 가장 적은 프로세스가 선택된다.
(5) 우선순위 스케줄링 (priority scheduling)
- 프로세스들에 우선순위를 부여하고, 우선순위가 가장 높은 프로세스부터 실행하는 스케줄링 알고리즘
- 우선순위가 같을 시 선입 선처리로 스케줄링된다.
- 기아 현상(starvation) 현상
- 우선순위 스케줄링의 근본적인 문제
- 우선순위가 높은 프로세스를 우선하여 처리하므로 우선순위가 낮은 프로세스는 (준비 큐에 먼저 삽입되었더라도) 우선순위가 높은 프로세스에 의해 계속 실행이 연기될 수 있다.
- 에이징(aging)
- 기아현상을 방지하는 대표적인 기법
- 오랫동안 대기한 프로세스의 우선순위를 점차 높인다.
(6) 다단계 큐 스케줄링 (multilevel queue scheduling)
- 우선순위 스케줄링의 발전된 형태
- 우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식
- 우선순위가 가장 높은 큐에 있는프로세스를 먼저처리하고, 우선순위가 높은 큐가 비어 있으면 그 다음 우선순위에 있는 프로세스들을 처리한다.
- 프로세스 유형별로 우서순위를 구분하여 실행하는 것이 편리해진다.
- 큐별로 타임 슬라이스를 여러 개 지정할 수 있고, 큐마다 다른 스케줄링 알고리즘을 사용할 수 있다.
(7) 다단계 피드백 큐 스케줄링 (multilevel feedback queue scheduling)
- 다단계 큐 스케줄링의 발전된 형태
- 다단계 큐 스케줄링에서는 프로세스들이 큐 사이를 이동할 수 없다.
- 우선순위가 낮은 큐는 계속 연기될 여지가 있다. → 기아 현상
- 다단계 큐 스케줄링과 비슷하지만 프로세스들이 큐 사이를 이동할 수 있다.
- 만약 프로세스가 해당 큐에서 실행이 끝나지 않는다면 다음 우선순위 큐에 삽입되어 실행된다.
- CPU를 비교적 오래 사용해야 하는 CPU 집중 프로세스들은 자연스럽게 우선순위가 낮아지고, CPU를 비교적 적게 사용하는 입출력 집중 프로세스는 자연스레 우선순위가 높은 큐에서 실행이 끝난다.
- 에이징 기법을 적용해 기아 현상을 예방한다.
- 구현이 복잡하지만, 가장 일반적인 CPU 스케줄링 알고리즘으로 알려져 있다.
🤔느낀 점
프로세스 상태와 계층구조는 지난 학기 전공이었던 리눅스시스템으로 배웠던 내용이라 반가웠습니다! CPU 스케줄링 방식은 들어본 것도 있었지만 전반적으로 새로운 내용이라 특히 집중해서 공부했던 것 같습니다.
'독학 > [책] 컴퓨터구조 + 운영체제' 카테고리의 다른 글
[혼공학습단 11기 혼공컴운💿] 컴퓨터구조+운영체제 week6 (2) | 2024.02.05 |
---|---|
[혼공학습단 11기 혼공컴운💿] 컴퓨터구조+운영체제 week5 (0) | 2024.01.31 |
[혼공학습단 11기 혼공컴운💿] 컴퓨터구조+운영체제 week3 (0) | 2024.01.16 |
[혼공학습단 11기 혼공컴운💿] 컴퓨터구조+운영체제 week2 (4) | 2024.01.08 |
[혼공학습단 11기 혼공컴운💿] 컴퓨터구조+운영체제 week1 (0) | 2024.01.03 |