[혼공단 10기] 혼자 공부하는 컴퓨터 구조+운영체제 4주차
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