1. 운영체제
1.1. 운영체제의 정의
- 운영체제 : 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램
- 응용 프로그램과 하드웨어 사이에서 사용자 영역에 적재된 응용 프로그램에 자원을 할당하여 응용 프로그램이 올바르게 실행되도록 돕는다.
- 응용 프로그램이 부분별하게 자원에 접근하거나 자원을 사용하는 것을 방지
- 시스템 자원(자원) : 프로그램이 실행되기 위해 필요한 모든 요소
- 커널 영역 : 컴퓨터가 부팅될 때 동작하기 위해 메모리에 적재되는 영역, 운영체제가 적재되는 영역
- 사용자 영역 :커널 영역을 제외한 사용자의 응용 프로그램이 적재되는 메모리 영역
- 프로그램이 실행되기 위해선 메모리에 적재되어야 한다.
- 응용 프로그램(application software) : 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램, 워드, 엑셀, 메모장 등등
1.2. 운영체제의 필요성
- 운영체제를 이용하지 않고 개발을 진행한다면 하드웨어를 조작/관리하는 코드까지 작성해야 함.
1.3. 운영체제의 구성
1.3.1. 커널
- 자동차의 엔진, 사람의 심장과 같은 역할을 한다.
- 프로그램이 올바르고 안전하게 실행되게 하는 서비스를 제공
1.3.2. 사용자 인터페이스
- 커널 외에 운영체제가 제공하는 서비스
- 윈도우의 바탕화면처럼 사용자가 컴퓨터와 상호작용할 수 있는 통로
1.3.2.1. Graphic User Interface(GDI)
1.3.2.2. Command Line Interface(CLI)
1.3.3. 이중 모드
- 응용 프로그램이 부분별하게 자원에 접근하거나 자원을 사용하는 것을 방지
1.3.3.1. 사용자 모드
- 운영체제 서비스를 제공받을 수 없는 실행 모드
- 커널 영역의 코드 사용 불가
- 일반적이 응용 프로그램이 실행되는 모드
- CPU가 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어 실행 불가
1.3.3.2. 커널 모드
- 운영체제 서비스 제공받기 가능
- CPU가 하드웨어 자원에 접근/사용 등 모든 명령어 사용 가능
- 사용자 모드에서 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받음
- 시스템 호출(system call) : 운영체제 서비스를 제공받기 위한 요청
- 소프트웨어 인터럽트 : 특정 명령어에 의해 발생하는 인터럽트
1.3.4. 운영체제의 핵심 서비스
- 프로세스 관리, 자원 접근 및 할당, 파일 시스템 관리
- 프로세스 : 실행 중인 프로그램
- 일반적으로 cpu는 한번에 하나의 프로세스만을 실행시키기 때문에 많은 프로세스를 번갈아 가며 실행
- 프로세스 동기화
- 교착 상태 : 프로세스가 꼼짝도 못하고 더 이상 실행되지 못하는 상황
1.3.4.1. 자원 접근 및 할당
- CPU - CPU 스케쥴링 : 실행할 프로세스의 순서를 정리하는 작업
- 메모리
- 입출력 장치
1.3.4.2. 파일 시스템 관리
1.4. 가상 머신
- 소프트웨어적으로 만들어낸 가상 컴퓨터
- 사용자 모드로 작동, 가상 머신상의 운영체제도 사용자 모드로 작동
- 하이퍼 바이저 모드 : 가상 머신에서 운영체제 서비스를 받기위해 탄생함.
2. 프로세스
2.1. 프로세스
2.1.1. 프로세스 정의
- 프로세스 : 메모리에 적재되어 실행된 프로그램
- 포그라운드(foreground process) : 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스(background process) : 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
- 데몬/서비스 : 사용자와 직접 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스
2.1.2. 프로세스 제어 블록(Process Control Block)
- 프로세스와 관련된 정보를 저장하는 자료 구조, 상품의 태그와 유사
- 커널 영역에서 생성
2.1.2.1. 프로세스 제어 방법
- 타이머 인터럽트를 통해 한정된 CPU 자원을 가지고 프로세스를 번갈아 실행
- 타이머 인터럽트 : 프로세스에 부여된 시간만큼 CPU를 이용하고 다음 차례까지 대기
- PCB를 통해 프로세스에 대한 정보를 확인하고 작업을 재개
2.1.2.2. PCB 기록
- 프로세스 ID(PID) : 프로세스 식별을 위한 고유 번호
- 레지스터 값 : PCB 안에 해당 프로세스가 실행하며 사용했던 프로그램 카운터 등을 레지스터에 기록
- 프로세스 상태 : 현재 프로세스에 대한 상태 값, CPU 사용 대기 여부, CPU 이용 상태 여부 등
- CPU 스케쥴링 정보 : 프로세스가 CPU를 언제 어떤 순서로 할당 받을 지에 대한 스케쥴 관리
- 메모리 관리 정보 : 프로세스가 저장된 메모리 주소 정보, 베이스 레지스터, 한계 레지스터, 페이지 테이블 정보
- 사용한 파일과 입출력장치 목록
2.1.2.3. 문맥 교환
- 문맥 : 수행 중 CPU 사용 시간이 만료되어 추후 작업을 이어하기 위한 정보
- 문맥 교환 : 기존의 프로세스 문맥을 PCB에 입력하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
- 빈번한 문맥 교환은 오버헤드 야기 가능
2.1.3. 프로세스 메모리 영역
2.1.3.1. 코드 영역
- 텍스트 영역 : 실행할 수 있는 코드, 기계어로 이루어진 명령어, 읽기 전용 공간
- 정적 할당 영역 : 프로그램을 구성하는 명령어들이 갑자기 바뀌는 일이 없어 코드 영역의 크기가 변하지 않음
2.1.3.2. 데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- 전역 변수
- 정적 할당 영역 : 프로그램이 실행되는 동안에만 유지되는 데이터이기 때문에 크기가 고정된 영역
2.1.3.3. 힙 영역
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 동적 할당 영역 : 크기가 가변하는 영역
- 메모리 누수 : 할당된 메모리 공간을 반납하지 않고 계속 메모리 내에 남아 낭비되는 상태
- 낮은 주소에서 높은 주소로 할당
2.1.3.4. 스택 영역
- 데이터를 일시적으로 저장하는 공간
- 동적 할당 영역 : 크기가 가변하는 영역
- 매개 변수/지역 변수 : 함수 실행이 끝나면 사라진다.
- 높은 주소에서 낮은 주소로 할당
2.2. 프로세스 상태와 계층
2.2.1. 프로세스 상태
- 프로세스의 현재 상태를 표현
- 생성 상태(new) : 프로세스를 생성 중인 상태 - 메모리에 적재되어 PCB를 할당받은 상태
- 준비 상태(ready) : CPU를 할당받아 실행할 수 있으나 차례가 되지 않아 기다리는 상태
- 디스패치(dispatch) : 준비 상태에서 실행 상태로 전환되는 것
- 실행 상태(running) : CPU를 할당받아 실행 중인 상태 - 일정 시간 동안만 CPU를 할당 받아 실행
- 대기 상태(blocked) : 프로세스 실행 중 입출력 작업 시, 입출력 작업의 처리속도와 CPU 내부의 처리속도가 차이로 인해 상호간의 작업 속도로를 맞춰주기 위해 잠시 입출력 작업이 끝날 때까지 기다려주는 상태
- 입출력 작업 외에도, 특정 이벤트가 일어나길 기다릴 때 프로세스의 대기 상태
- 종료 상태(terminated) : 프로세스가 종료된 상태.
- 운영체제는 PCB와 프로스스가 사용한 메모리를 정리
2.2.2. 프로세스 계층 구조
- 부모 프로세스(parent process) : 프로세스 실행 도중 시스템 호출을 통해 다른 프로세스를 생성한 프로세스
- 부모 프로세스 = 시스템 호출 + 새 프로세스 생성
- PPID(Paren Process ID) : 부모 프로세스 ID
- 자식 프로세스(child process) : 부모 프로세스에 의해 생성된 프로세스
- 자식 프로세스의 자식 프로세스 생성 가능
- init/systemd/launchd : 최초의 프로세스, 모든 프로세스의 시작
2.2.3. 프로세스 생성 기법
- 부모 프로세스를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기를 통해 실행
- 복제(fork) : 일종의 시스템 호출
- 복제(fork) : 시스템 호출을 통해 자신의 복제본인 자식 프로세스 생성
- 부모 프레세스의 자원(메모리 내의 내용, 열린 파일 목록 등)을 상속
- PID 값 및 저장된 메모리 위치는 다름
- exec(옷 갈아입기) : 자신의 메모리 공간으로 새로운 프로그램으로 덮어쓰는 시스템 호출
- 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화 됨
- 자식 프로세스가 exec를 호출하지 않으면, 부모 프로세스와 자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 됨
2.3. 확인문제
- 프로세스 상태 다이어그램
3. 스레드
- 스레드 : 프로세스를 구성하는 실행의 흐름 단위
- 프로세스 내의 각기 다른 스레드 ID, 프로그램 카운터 값, 레지스터 값, 스택으로 구성
- 위의 각기 다른 값을 가지고 있기 때문에 각기 다른 코드를 실행 가능
- 실행에 필요한 최소한의 정보(프로그램 ㅏ운터, 레지스터, 스택)을 유지하고 프로세스 자원을 공유하며 실행
3.1. 단일 스레드 프로세스
- 하나의 프로세스가 하나의 부분만을 실행하는 프로세스
3.2. 멀티 프로세스 & 멀티 스레드
3.2.1. 멀티 프로세스
3.2.2. 멀티 스레드
3.2.3. 멀티 프로세스와 멀티 스레드의 차이
- 가정 : "hollo, os"를 세번 출력하는 프로그램
- 멀티 프로세스
- 코드 영역, 데이터 영역, 힙 영역 등 동일한 자원이 사용됨 -> 메모리 낭비
- 프로세스 간의 독립적은 실행으로 오류 발생 시 다른 프로세스에 영향 없음
- 멀티 스레드
- 하나의 프로세스가 소유한 자원을 여러 스레드가 공유, 협력 및 통신에 유리 -> 효율적인 작업 가능
- 하나의 스레드에서 문제가 발생하면 프로세스 전체의 문제로 번질 수 있음
프로세스 간 통신(Inter-Process Communication)
- 프로세스 간의 자원을 공유하고 데이터를 주고 받는 것
- 공유 메모리 : 프로세스 간의 메모리를 공유하는 영역을 두고 데이터를 주고 받는 메모리 영역
4. CPU 스케쥴링
4.1. CPU 스케줄링
- 운영체제가 프로세스 간의 합리적이고 공정한 CPU 자원 배분
4.1.1. 프로세스 우선순위
- 우선순위 : 입출력 작업이 많은 프로세스를 먼저 실행함
- 입출력 집중 프로세스 : 비디오 재생, 디스크 백업 등 입출력 작업이 많은 프로세스(많은 입출력 버스트)
- CPU 집중 프로세스 : 복잡한 수학 연산, 컴파일, 그래픽 처리 등 CPU 작업이 많은 프로세스(많은 CPU 버스트)
- 대기시간 : 입출력 작업 > CPU 작업
- 실행시간 : 입출력 작업 < CPU 작업
- 따라서 입출력 작업을 먼저 수행하면 입출력 작업을 위해 대기하는 동안 CPU 작업을 수행할 수 있어 작업이 효율적이다.
- CPU 버스트 : CPU를 이용하는 작업
- I/O 버스트 : 입출력장치를 기다리는 작업(=입출력 버스트)
4.1.2. 스케줄링 큐
- CPU를 사용하고자 하는 프로세스, 메모리에 적재되고 싶은 프로세스, 특정 입출력장치를 사용하고자 하는 프로세스 모두에 순서를 부여
4.1.2.1. 준비 큐
- CPU를 이용하고 싶은 프로세스의 차레
- 선입선출을 기본으로 하나 우선순위가 높은 프로세스를 우선 처리
4.1.2.2. 대기 큐
- 입출력장치를 이용하고 싶은 프로세스 중 대기 상태에 접어든 프로세스의 차례
4.1.3. 선점형/비선점형 스케줄링
4.1.3.1. 선점형 스케줄링
- 프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당하는 방식
- 장점 : 프로세스의 자원 독점을 막고 프로세스들에게 골고루 자원을 배분
- 단점 : 문맥 교환 과정에서 오버헤들 발생
4.1.3.2. 비선점형 스케줄링
- 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까지 다른 프로세스가 끼어들 수 없는 스케줄링 방식
- 장점 : 오버헤드 발생 적음
- 단점 : 프로세스의 자원 독점, 선행 작업 종료시 까지 반드시 대기
4.2. CPU 스케줄링 알고리즘
4.2.1. 선입 선처리 알고리즘
- FCFS 스케줄링(First Come First Scheduling)이라고도 함
- 비선점형 스케줄링 방식
- 호위효과(convoy effect) : a, b, c 프로세스 각각 17ms, 5ms, 2ms가 소요되는데 c 프로세스가 처리되기 위해 22ms를 대기해야하는 비효율적인 상황
4.2.2. 최단 작업 우선 스케줄링
- SJF 스케줄링(Shortest Job First Scheduling) 이라고도 함
- 선점형/비선점형 모두 구현 가능
4.2.3. 라운드 로빈 스케줄링
- 선입 선처리 스케줄링에 타임 슬라이스 개념 추가
- 타임 슬라이스 : 프로세스가 CPU를 사용할 수 있는 정해진 시간
- 정해진 타임 슬라이스 만큼의 시간 동안 돌아가며 CPU를 이용하는 선점형 스케줄링
- 타임 슬라이스의 범위에 따라 선입 선처리 알고리즘이 되어 호위 효과가 발생하기도 하며, 빈번한 문맥 교환으로 오버헤드 발생 가능
4.2.4. 최소 잔여 시간 우선 스케줄링
- SRT 스케줄링(Shortest Remaining Time)
- 최단 작업 우선 스케줄링 + 라운드 로빈 스케줄링
- 타임 슬라이스만큼 CPU를 사용하되, CPU를 사용할 다음 프로세스를 남은 작업시간이 가장 적은 프로세스로 지정
4.2.5. 우선순위 스케줄링
- 프로세스에 우선순위 부여, 가장 높은 우선순위 작업부터 처리
- 기아(starvation) 현상 : 우선순위가 낮은 프로세스의 차례가 밀리는 현상
- 보완 방안
- 에이징 : 오래 대기한 프로세스에 우선순위를 높이는 기법
4.2.6. 다단계 큐 스케줄링
- multilevel queue scheduling
- 우선순위 별로 준비 큐를 여러 개 사용
- 우선순위가 높은 프로세슬 별로 모인 준비 큐부터 처리하 후 다음 우선순위 큐에 있는 프로세스를 실행
4.2.7. 다단계 피드백 큐 스케줄링
- 다단계 큐 스케줄링의 발전 형태
- 낮은 우선순위의 큐에 발생할 기아현상을 보완
- 큐와 큐 사이를 프로세스들이 이동 가능
- 타임 슬라이스 동안 처리가 완료되지 않은 프로세스를 다음 우선선위의 큐로 보냄
4.3. 확인문제
- A, B, C, D 순서로 프로세스가 들어왔을 때
선입선출 알고리즘을 적용하면 A, B, C, D 순서로 프로세스를 처리