저자 github
4주차
- Chapter 09 ~ 11
- p. 304의 확인 문제 1번 풀고 인증하기
- Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기
09 운영체제 시작하기
9-1 운영체제를 알아야 하는 이유
운영체제가 하는 일
- 프로그램에 필요한 자원을 할당한다.
- 프로그램이 올바르게 실행되도록 돕는다.
- 각 응용프로그램의 메모리 주소가 겹치지 않도록 적당한 공간에 프로그램 적재.
- 최대한 공정하게 CPU 자원 할당
- 더 이상 실행되지 않는 프로그램을 메모리에 삭제하며 지속적으로 메모리 자원 관리
메모리
- 커널 영역: 운영체제는 매우 특별한 프로그램. 항상 컴퓨터가 부팅될 때 따로 적재되어 실행된다.
- 시스템 영역: 커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되어 있는 영역.
알아야 하는 이유
운영체제와의 대화를 통해 하드웨어와 프로그램을 더 깊이 이해하고 문제 해결의 실마리.
9-2 운영체제의 큰 그림
커널
이중 모드 (dual mode)
- CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식
- 사용자 모드(user mode)
- 운영체제 서비스를 제공받을 수 없는 실행 모드
- 커널 영역의 코드를 실행할 수 없는 모드
- 일반적인 응용 프로그램
- 커널 모드(kernel mode)
- 운영체제 서비스를 제공받을 수 있는 실행 모드
- 커널 영역의 코드를 실행할 수 있는 모드
- 운영체제
- 시스템 호출(system call): P280 좀 더 알아보기
- 운영체제 서비스를 제공받기 위해 커널 모드로 전환하는 방법
- 일종의 (소프트웨어적인) 인터럽트.
운영체제의 핵심 서비스
- 프로세스 관리
- 프로세스: 실행 중인 프로그램
- CPU는 프로세스들을 조금씩 번갈아 가며 실행한다.
- 이 후에 배울 것
- 프로세스 동기화: 여러 프로세스가 동시에 실행되는 환경에서 필요한 것
- 교착 상태: 프로세스가 꼼짝도 못하고 더이상 실행되지 못하는 상황
- 자원 접근 및 할당
- CPU
- 한 번에 하나의 프로세스만 실행할 수 있다.
- CPU 스케쥴링(어떤 프로세스부터? 얼마나 오래 이용하게 할지?)
- 메모리
- 입출력장치
- 파일 시스템 관리
💡 참고
가상 머신: 소프트웨어적으로 만들어낸 가상 컴퓨터
- 새로운 운영체제와 응용 프로그램을 설치, 실행할 수 있다.
- 가상 머신 또한 응용 프로그램. 사용자 모드로 작동
- 하이버바이저 모드
10 프로세스와 스레드
10-1 개요
프로세스 직접 확인하기
- 포그라운드 프로세스(foreground process): 사용자가 보는 앞에서 실행되는 프로세스
1) 윈도우에서는 .. 작업관리자->프로세스
2) 유닉스에서는 ps 명령어
사용자가 보지 못하는 뒤에서 실행되는 프로세스
- 백그라운드 프로세스(background process): 사용자와 상호작용하지 않고 그저 묵묵히 정해진 일만 수행하는 백그라운드 프로세스
1) 윈도우에서는 서비스
2) 유닉스에서는 데몬(daemon)
프로세스 제어 블록
- PCB: Process Control Block
- 프로세스와 관련된 정보를 저장하는 자료 구조
- 마치 상품에 달린 태그와 같음
- 커널 영역에 생성됨
PCB에 담기는 정보
1) 프로세스 ID (PID:Process ID)
- 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
🤔 책과 다르게 고유 번호가 아닌 프로세스 이름이 나오는 상황.
작업관리자를 뒤적여보니 PID는 [자세히]에서 찾을 수 있다.
2) 레지스터 값
3) 프로세스 상태
4) CPU 스케줄링 정보
5) 메모리 관리 정보
6) 사용한 파일과 입출력장치 목록
문맥 교환(context switching)
기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
프로세스의 메모리 영역
1) 코드 영역(텍스트 영역)
- 기계어로 이루어진 명령어가 저장
- read-only
- 정적 할당 영역(크기가 고정된 영역)
2) 데이터 영역
- 프로그램이 실행되는 동한 유지할 데이터가 저장되는 공간
- 예) 전역변수
- 정적 할당 영역
3) 힙 영역
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 메모리 누수 발생: 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면, 언젠가는 해당 공간을 반환해야 한다. 하지만 반환하지 않는다면 메모리 낭비를 초래한다.
- 동적 할당 영역(프로세스 실행 과정 중 크기가 변할 수 있는 영역)
- 메모리가 낮은 주소에서 높은 주소로 할당
4) 스택 영역
- 데이터를 일시적으로 저장하는 공간
- 예) 매개 변수, 지역변수
- 동적 할당 영역
- 메모리가 높은 주소에서 낮은 주소로 할당
10-2 프로세스 상태와 계층 구조
프로세스 상태
1) 생성 상태(new): 곧바로 실행 x, 준비 상태가 되어 CPU 할당을 기다림
2) 준비 상태(ready): 기다리는 상태
- 실행 상태로 전환되면 dispatch라고 함.
3) 실행 상태(running): 할당된 일정 시간 동안만 cpu 사용 가능. 할당된 시간을 모두 사용하면(타이머 인터럽트 발생) 다시 준비 상태가 됨. 실행 도중 임출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 됨.
4) 대기 상태(blocked): 일반적으로 프로세스 실행 도중 입출력 장치의 작업을 기다리는 상태
5) 종료 상태(terminated): 운영체제는 PCB와 프로세스가 사용한 메모리 정리
프로세스 상태 다이어그램
프로세스 계층 구조
- 프로세스가 프로세스를 낳는 계층적인 구조(트리 구조)로써 프로세스들을 관리
- 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID(Parent PID)가 기록되기도 함
프로세스 생성 기법
1) fork
- 자기 자신 프로세스의 복사본을 자식 프로세스로 생성하는 시스템 호출
- 복사된 자식 프로세스라 하더라도 PID나 저장된 메모리 위치는 달라짐
2) exec
- 자신의 메모리 공간을 다른 프로그램으로 덮어 쓰는 시스템 호출
- 일종의 옷 갈아입기
10-3 스레드
프로세스를 구성하는 실행의 흐름 단위
프로세스와 스레드
- 프로세스는 '실행의 흐름 단위가 하나'라는 점에서 단일 스레드 프로세스라고 볼 수 있다.
- 전통적인 관점에서 하나의 프로세스는 한 번의 하나의 일만을 처리했다.
- 스레드가 등장하면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 됨.
- 프로세스와 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행한다.
- 프로그램 카운터를 포함한 레지스터, 스택
리눅스 창시자 Linus Torvalds의 '프로세스와 스레드'에 대한 반응
multiproces와 multithread
- 멀티프로세스
- 여러 프로세스를 동시에 실행하는 것
- 프로세스끼리 자원 공유 x
- 멀티스레드
- 여러 스레드로 프로세스를 동시에 실행하는것
- 같은 프로세스 내의 자원 공유
- 하나의 스레드에 문제가 생기면 다른 스레드도 영향을 받음
프로세스 간의 통신
- IPC(Inter-Process Communication): 프로세스끼리도 자원을 공유하고 데이터를 주고 받을 수는 있다.
🤔 프로세스, 스레드 실습이 꽤 신기하다.
11 CPU 스케쥴링
11-1 개요
CPU scheduling: 운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것
프로세스 우선순위
프로세스 종류
1) 입출력 집중 프로세스(I/O bound process)
- 비디오 재생, 디스크 백업 등 입출력 작업이 많은 프로세스
- 실행 상태보다 입출력을 위한 대기 상태에 더 많이 머무른다.
- I/O burst가 많은 프로세스
2) CPU 집중 프로세스(CPU bound process)
- 복잡한 수학 연산, 컴파일, 그래픽 처리 작업 등 CPU 작업이 많은 프로세스
- 대기 상태보다 실행 상태에 더 많이 머무른다.
- CPU burst가 많은 프로세스
💡일반적으로 입출력 집중 프로세스(완료 전까지 어차피 대기 상태)를 빨리 실행시키고 그 다음으로 CPU 집중 프로세스에 CPU를 집중적으로 할당하는 것이 더 효율적이다.
- 명령을 통해 일부 프로세스의 우선 순위를 변경할 수 있음
스케쥴링 큐
- Scheduling queue: 운영체재가 '줄을 서시오~.'
CPU를 사용하고 싶은 프로세스들, 메모리에 적재되고 싶은 프로세스들, 특정 입출력 장치를 사용하고 싶은 프로세스들을 모두 줄을 세운다.
- 반드시 선입선출 방식 x
큐의 종류
- ready queue: CPU를 이용하고 싶은 프로세스들이 서는 줄
- waiting queue: 입출력장치를 이용하기 위해 대기 상태에 접어든 프로세스들이 서는 줄
선점형과 비선점형 스케쥴링
1) 선점형 스케쥴링(preemptive scheduling)
- 선점: 남보다 앞서서 차지함
- 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식
- 자원 독점을 막고 골고루 배분 가능
- 문맥 교환 과정에서 오버헤드가 발생할 수 있음
2) 비선점형 스케줄링(non-preemptive scheduling)
- 자원을 이용하고 있는 프로세스가 종료 또는 스스로 대기 상태에 들어가기 전까지 다른 프로세스가 끼어들 수 없는 스케줄링
- 문맥 교환 과정에서 오버헤드가 발생할 경우가 적음
- 새로운 프로세스가 무작정 기다림
- 자원 배분 x
11-2 CPU 스케쥴링 알고리즘❓
종류
1) 선입 선처리 스케줄링(First Come First Served Scheduling)
- FCFS 스케줄링
- CPU를 먼저 요청한 프로세스부터 CPU를 할당하는 방식
- 기다리는 시간이 매우 길어질 수 있음
- 비선점형
2) 최단 작업 우선 스케줄링(Shortest Job First Scheduling)
- SJF 스케줄링
- CPU 사용 시간이 긴 프로세스는 나중에, 짧은 건 먼저
- 기본은 비선점형 스케줄링 알고리즘이지만, 선점형으로도 구현 가능
3) 라운드 로빈 스케줄링(round robin schduling)
- 선입 선처리 스케줄링 + 타임 슬라이스
- 정해진 타임 슬라이스만큼의 시간동안만 CPU를 이용하는 선점형 스케줄링
4) 최소 잔여 시간 우선 스케줄링(Shortest Remaining Time)
- SRT 스케줄링
- 최단 작업 우선 스케줄링 + 라운드 로빈 알고리즘
5) 우선 순위 스케줄링(priority scheduling)
- aging: 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 방식
6) 다단계 큐 스케줄링(multilevel queue scheduling)
- 우선 순위 스케줄링의 발전 형태
🤔 이건 이해가 잘 안 됨.
7) 다단계 피드백 큐 스케줄링(mulilevel feedback queue scheduling)
- 다단계 큐 스케줄링의 발전된 형태
- 프로세스들이 큐 사이를 이동할 수 있다.
숙제
숙제 1: p. 304의 확인 문제 1번 풀고 인증하기
1) 생성상태
2) 준비상태
3) 실행상태
4) 종료상태
5) 대기상태
추가 숙제: Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기
A-B-C-D 순으로
🦖 재미있게 놀면서 간간이 복습하기