1.1 운영체제
1. 운영체제란 ⭐
하드웨어 위에 설치되어 하드웨어 계층과 다른 소프트웨어 계층을 연결하는 소프트웨어 계층
컴퓨터 시스템의 자원을 관리하고, 사용자가 컴퓨터를 사용할 수 있는 환경을 제공
2. 운영체제의 목적 ⭐
1. 처리 능력 향상
자원 관리를 통해 일정 시간 내에 시스템이 처리하는 일의 양을 향상시킴
2. 반환 시간 단축
사용자가 시스템에 요청한 작업을 완료할 때까지 소요되는 시간 단축시킴
3. 사용 가능도 향상
사용자가 컴퓨터를 사용해야 할 때 자원을 즉시 사용할 수 있게 함
사용 가능도? 시스템 자원을 얼마나 빨리 제공할 수 있는가
4. 신뢰도 향상
입력 값에 대한 정확한 결과 값을 줄 수 있도록
신뢰도? 시스템이 주어진 문제를 정확하게 푸는지
3. CPU와 메모리 구조 ⭐⭐
CPU (Central Processing Unit, 중앙 처리 장치)
컴퓨터의 뇌 역할, 컴퓨터에서 프로그램을 실행하는 데 필요한 연산 수행
프로세서(Processor)라고도 함
메모리
데이터를 저장하기 위한 기억장치
주기억장치(메인메모리) - 휘발성 메모리 ex) RAM
보조기억장치 - 비휘발성 메모리 ex) SSD, HDD
메모리 계층 구조
- 레지스터
CPU가 사용자 요청을 처리하는 데 필요한 데이터를 임시로 저장하는 기억장치
CPU 내부에 존재하며 접근 속도 빠름
- 캐시메모리
CPU와 RAM 사이의 속도 차이를 해결하기 위한 기억장치
CPU 내부에 존재하며 접근 속도가 레지스터 다음으로 빠름
- RAM
컴퓨터에서 프로그램을 실행할 때 필요한 정보 저장
CPU에서 접근 속도가 하드 디스크보다 빠르고, 휘발성 기억장치
보통 메모리라고 할 때 RAM을 의미
- 하드 디스크
사용자가 필요한 데이터와 프로그램 저장, 비휘발성 메모리
4. 커널과 시스템 콜 ⭐⭐⭐
커널 (Kernel)
OS의 핵심 요소
컴퓨터 하드웨어와 프로세스의 보안, 자원 관리, 하드웨어 추상화 같은 중요한 역할 수행
자원 관리를 위해 CPU 스케줄링, 메모리 관리, 입출력 관리, 파일 시스템 관리 등 담당
- 커널 모드
중요 자원에 사용자가 쉽게 접근하지 못하도록 하는 모드
하드웨어에 직접 접근해 메모리, CPU와 같은 자원 사용 가능
- 사용자 모드
커널 모드의 자원에 접근할 수 없게 제한을 둠
사용자 모드에서 실행된 프로세스가 자원에 접근하려면 시스템 콜을 호출해 커널에 요청해야 함
커널은 시스템 콜로 받은 요청을 처리한 후 다시 시스템 콜로 결과 값을 반환함
시스템 콜이란?
사용자 모드에서 커널 모드에 접근해 필요한 기능을 수행할 수 있게 하는 시스템 함수
프로세스 제어, 파일 조작, 장치 관리, 데이터 유지 보수, 통신, 보호 할 수 있음
- 시스템 콜 대표적 예시
프로세스를 생성하는 fork()
부모 프로세스가 자식 프로세스의 수행을 기다리는 wait()
1.2 프로세스
1. 프로세스와 스레드 ⭐⭐⭐
프로세스 (Process)
컴퓨터에서 실행 중인 하나의 프로그램 의미
PCB(Process Control Block) 프로세스 제어 블록
프로세스에 할당된 메모리 영역
프로세스의 메모리 영역 구조
스택 영역: LIFO(후입선출)
힙 영역: FIFO(선입선출)
메모리 영역을 공유하기 때문에 서로의 영역을 침범하는 문제 생길 수 있음
- 스택 오버플로 (스택 영역이 힙 영역 침범)
- 힙 오버플로 (힙 영역이 스택 영역 침범)
스레드 (Thread)
프로세스는 한 개 이상의 스레드 가짐
프로세스에서 실제로 실행되는 흐름의 단위
프로세스 안에 존재하므로 프로세스의 메모리 공간 이용
지역 변수를 저장하는 스택 영역 할당받음
전역 변수를 저장하는 힙 영역은 다른 스레드와 공유
2. PCB(Process Control Block) ⭐⭐
프로세스를 제어하기 위해 프로세스 정보 저장
프로세스 현재 상태, 프로세스를 나타내는 고유의 PID, 부모 프로세스 PID, 자식 프로세스 PID, 다음 실행할 명령어의 주소 PC(Program Counter), 프로세스 우선순위, 메모리 제한 등을 저장
3. 프로세스의 생성 ⭐⭐⭐
부모 프로세스에서 fork() 함수를 호출하면 부모 프로세스는 자식 프로세스의 PID 값을, 자식 프로세스는 0을 반환
4. 프로세스 상태도 ⭐⭐⭐
모든 프로세스는 CPU에 의해 생성되고 소멸하는 과정 거침
- 생성: 프로세스가 PCB를 가지고 있지만, OS로부터 승인 받기 전
- 준비: OS로부터 승인받은 후 준비 큐에서 CPU 할당 기다림
- 실행: 프로세스가 CPU를 할당받아 실행함
- 대기: 프로세스가 입출력이나 이벤트 발생을 기다려야 해서 CPU 사용을 멈추고 기다림
- 종료: 프로세스 실행을 종료함
5. 멀티 프로세스와 멀티 스레드 ⭐⭐⭐
- 동시성
하나의 코어(싱글 코어)에서 여러 작업을 번갈아 가면서 처리하는 방식, CPU는 하나의 작업만 처리할 수 있어서 여러 작업을 번갈아 처리하는데 이를 콘텍스트 스위칭이라고 함
- 병렬성
CPU가 여러 개(멀티 코어)있어서 각 CPU에서 각 작업을 동시에 처리하는 방식
멀티 프로세스
응용 프로그램 하나를 여러 프로세스로 구성하는 것
장점) 한 프로세스가 죽어도 다른 프로세스에 영향 x
단점) 시간과 메모리 공간을 많이 사용함(오버헤드)
여러 프로세스를 처리하려면 콘텍스트 스위칭 작업 필요
프로세스는 독립적인 메모리 할당받음
따라서, 공유할 자원이 있다면 IPC(Inter Process Communication)를 통해 프로세스 간 자원 공유
공유할 메모리 직접 참조하는 것보다 비효율적
멀티 스레드
스레드를 여러 개 생성해 스레드들이 각자 다른 작업을 처리하는 것
스레드 간에 힙, 데이터, 코드 영역을 공유
장점) 콘텍스트 스위칭할 때 오버헤드가 적게 발생하고 IPC 사용 x
프로세스 여러개여러 개 생성 < 스레드 여러 개 생성 자원 효율적
단점) 스택 영역을 다른 스레드와 함께 사용하므로 공유 자원에 대한 동기화 필수
스레드에 문제가 생기면 프로세스 내 다른 스레드에 영향을 미칠 수 있음
6. 콘텍스트 스위칭 (Context Switching)⭐⭐⭐
멀티 프로세스 환경에서 CPU가 처리 중인 프로세스의 정보를 바꾸는 것
CPU는 하나의 프로세스만 처리 가능하기 때문에 멀티 프로세스를 처리하려면 CPU 스케줄러에 의해 인터럽트가 발생하며 콘텍스트 스위칭이 일어남
- 인터럽트
입출력 관련 이벤트가 발생하거나 예외 상황이 발생할 때 이에 대응할 수 있게 CPU에 처리를 요청하는 것
- 콘텍스트
CPU가 처리하는 프로세스의 정보를 의미
❓ CPU에서 처리 중인 프로세스가 중간에 변경되어도 이전에 실행하던 코드를 이어서 실행할 수 있는 이유
PCB에 프로그램 카운터와 스택 포인터 값이 저장되어 있기 때문
- 프로그램 카운터(PC, Program Counter)
프로세스가 이어서 처리해야 하는 명령어의 주소
- 스택 포인터(Stack Pointer)
스택 영역에서 데이터가 채워진 가장 높은 주소 값
7. 프로세스 동기화 ⭐⭐⭐
- 경쟁상태
공유 자원에 동시에 접근해 경쟁하는 상태
- 임계영역
공유 자원에 접근할 수 있고 접근 순서에 따라 결과가 달라지는 코드 영역
- 프로세스 동기화
임계 영역에서 경쟁 상태가 발생하는 것을 방지하려면 여러 프로세스가 공유 자원에 접근해도 데이터의 일관성이 유지되도록 동기화해야 함
임계영역 동시에 여러 접근 방지하는 3가지 조건
- 상호 배제 기법
어떤 프로세스가 임계 영역을 실행 중일 때 다른 프로세스가 임계 영역에 접근할 수 없음 ex) 뮤텍스, 세마포어
- 진행
임계 영역을 실행 중인 프로세스가 없을 때 다른 프로세스가 임계 영역을 실행
- 한정된 대기
임계 영역에 접근을 요청했을 때 무한한 시간 기다리지 않음
뮤텍스 (mutex)
락(lock)을 가진 프로세스만이 공유 자원에 접근할 수 있게 하는 방법
임계 영역에 접근한 프로세스가 임계 영역에 락을 건다고 해서 락킹 알고리즘이라고도 함
- 스핀락
임계 영역에 접근하지 못한 프로세스는 락을 얻기 위해 기다리는 동안 락이 풀렸는지 반복문 돌면서 기다리는 것
세마포어 (semaphore)
공유 자원에 접근할 수 있는 프로세스의 수를 정해 접근을 제어하는 방법
8. 교착 상태 ⭐⭐⭐
상호 배제 기법 때문에 2개 이상의 프로세스가 각각 자원을 가지고 있으면서 서로의 자원을 요구하며 기다리는 상태
교착 상태가 발생하는 4가지 필요충분조건
교착 상태를 막으려면 4가지 필요 충분 조건에서 한 가지 제거하면 됨
1. 상호배제
하나의 공유 자원에 하나의 프로세스만 접근할 수 있음
2. 점유와 대기
프로세스가 최소 하나의 자원을 점유하고 있는 상태에서 추가로 다른 프로세스에서 사용 중인 자원을 점유하기 위해 대기
3. 비선점
다른 프로세스에 할당된 자원을 뺏을 수 없음
4. 환형 대기
프로세스가 자신의 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원을 요구
9. 스레드 안전 ⭐⭐
멀티스레드 환경에서 하나의 변수, 함수, 객체에 스레드 여러 개가 동시에 접근해도 문제가 없는 것
`var++;`
var 변수의 값을 메모리에서 CPU 레지스터로
로드 -> 연산 처리 -> 연산 결과를 메모리에 작성하는 과정 거침
이 코드에 스레드 2개가 접근하면 잘못된 결과 초래 가능
10. IPC (Inter Process Communication) ⭐⭐
프로세스는 고유한 메모리 영역을 가지고 있기 때문에
프로세스 간 자원을 공유해야 될 때 IPC 해야됨
- 공유메모리
프로세스 간에 공유 가능한 메모리를 구성해 자원을 공유하는 방식
- 소켓
네트워크 소켓을 이용하는 프로세스 간 통신
외부 시스템과도 이용 가능, 클라이언트 <-> 서버
- 세마포어
접근하는 프로세스 수를 제어해 공유자원 관리
- 파이프
FIFO형태의 메모리인 파이프를 이용해 프로세스 간 자원을 공유하는 방식
- 메시지 큐
FIFO형태의 큐 자료구조를 사용해 프로세스 간 메시지를 주고받는 방식
11. 좀비 프로세스와 고아 프로세스 ⭐⭐
- 좀비 프로세스
자식 프로세스가 종료되었지만 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않았을 경우에 남겨진 자식 프로세스
- 고아 프로세스
부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우의 자식 프로세스
1.3 스케줄링
1. 스케줄링의 목적 ⭐
멀티 프로세스 환경에서 모든 프로세스를 공평하게 실행하기 위해
2. 스케줄링의 단계 ⭐⭐⭐
- 장기 스케줄링
준비 큐에 어떤 프로세스를 넣을지 결정해 메모리에 올라가는 프로세스 수를 조절
잡 스케줄링 or 승인 스케줄링이라고도 함
- 중기 스케줄링
메모리에 로드된 프로세스 수를 동적으로 조절
메모리에 프로세스가 많이 로드되면 스왑 아웃해서 일부 프로세스를 통째로 저장
스왑 아웃된 프로세스는 중단 상태가 됨
- 단기 스케줄링
준비 큐에 있는 대기 상태 프로세스 중 어떤 프로세스를 다음으로 실행할지 스케줄링 알고리즘으로 결정
즉, 어떤 프로세스를 디스패치할지 결정하는데 이를 CPU 스케줄링이라고 함
3. 스케줄링 알고리즘 ⭐⭐⭐
CPU 스케줄러가 준비 큐에 있는 프로세스 중 어떤 프로세스를 실행시킬지 결정하는 데 사용
비선점형 스케줄링
실행 중인 프로세스가 종료될 때까지 다른 프로세스를 실행할 수 없음
- FCFS 스케줄링 (First Come First Served)
준비 큐에 먼저 들어온 프로세스가 우선순위를 갖는 알고리즘
- SJF 스케줄링 (Shortest Job First)
실행 시간이 짧은 프로세스가 우선순위를 갖는 알고리즘
선점형 스케줄링
스케줄러가 실행 중인 프로세스를 중단시키고 다른 프로세스를 실행할 수 있음
- RR 스케줄링 (Round Robin)
비선점형 스케줄링과 달리 프로세스간 우선순위 없음
모든 프로세스를 순서대로 일정 시간 동안 실행하며, 일정 시간을 초과하면 다른 프로세스를 실행
- SRTF 스케줄링 (Shortest Remaining Time First)
준비 큐에서 대기 시간이 가장 짧게 남은 프로세스를 우선 수행하는 알고리즘
한 프로세스가 실행 중일 때 실행 시간이 더 짧은 프로세스가 준비 큐에 들어오면 실행 시간이 더 짧은 프로세스가 CPU를 차지하게 됨. 평균 대기 시간이 짧다는 장점이 있지만, 수행 시간이 긴 프로세스는 기아 상태가 되기 쉬움
- 멀티 레벨 스케줄링 (multi level)
준비 큐를 목적에 따라 여러 개로 분리해 사용하는 알고리즘
분리한 큐는 각각 우선순위가 있고 각자 다른 스케줄링 알고리즘 적용 가능
1.4 메모리 관리 전략
1. 논리 메모리와 물리 메모리 ⭐
CPU가 프로세스를 처리할 때 보는 주소 값과 실제 메모리의 주소 값은 다름
논리(가상) 메모리 영역: 프로세스가 보는 메모리 영역
물리 메모리 영역: 실제로 사용되는 메모리 영역(RAM)
논리(가상) 주소: CPU가 프로세스를 실행하며 보는 주소 값
물리 주소: 실제 메모리에서 사용되는 주소
- 메모리 관리 장치 (MMU, Memory Management Unit)
CPU가 프로세스를 실행할 때 사용하는 주소 값과 실제 주소 값이 다르기 때문에 논리 주소를 물리 주소로 변환을 해주는 하드웨어 장치
2. 연속 메모리 할당 ⭐
고정 분할 방식
메모리 영역을 분할한 뒤 각 영역에 프로세스를 할당하는 방식
단점)
메모리에 올릴 수 있는 프로세스 수와 각 프로세스의 크기가 제한
단편화 문제가 발생할 수 있음 ex) 내부 단편화, 외부 단편화
가변 분할 방식
할당할 프로세스의 크기에 따라 메모리 공간을 분할하는 방식
- 최초 적합 (first-fit)
가용 메모리 공간에서 프로세스 크기만큼 비어 있는 메모리 공간을 찾아 차례대로 프로세스를 로드하는 방식
- 최적 적합 (best-fit)
할당하려는 프로세스 크기 이상인 가용 메모리 공간 중에서 가장 작은 공간에 프로세스를 할당하는 방식
- 최악 적합 (worst-fit)
할당하려는 프로세스 크기보다 큰 가용 메모리 공간 중에서 가장 큰 공간에 프로세스를 할당하는 방식
3. 비연속 메모리 할당 ⭐⭐⭐
페이징
프로세스의 논리 메모리 영역과 물리 메모리 영역을
각각 일정한 크기의 페이지와 프레임으로 나눔
- 페이지 테이블
페이지와 프레임을 매핑하는 곳
페이지 테이블은 각 프로세스의 PCB에 저장됨
세그먼테이션
프로세스의 메모리 영역을 논리적 단위인 세그먼트로 분할해 메모리 할당
- 세그먼테이션 테이블
세그먼트의 논리 주소를 물리 주소로 매핑
1.5 가상 메모리
1. 가상 메모리란 ⭐⭐⭐
프로세스의 일부만 메모리에 로드하고,
나머지는 디스크에 둔 상태로 프로세스르 실행하는 방식
- 프로그램이 메모리 크기에 대한 제약을 덜 받을 수 있음
- 동시에 많은 프로그램을 실행하므로 CPU 이용률과 처리율을 높일 수 있음
- 필요한 영역만 메모리에 로드해 스와핑 횟수를 줄여서 프로그램 실행 속도를 높일 수 있음
2. 요구 페이징 ⭐⭐⭐
프로세스에서 필요한 페이지만 메모리에 로드하는 방식
필요한 페이지를 물리 메모리에 로드하고, 필요하지 않은 페이지는 디스크에 저장
- 페이지 폴트
프로그램을 실행하다가 물리 메모리에 필요한 페이지가 없을 때
페이지 폴트가 발생하면 디스크에서 필요한 페이지를 스왑인함
- 페이지 테이블
페이지에 해당 메모리 영역이 물리 메모리에 있는지 페이지 테이블로 파악 가능
v(valid): 페이지에 해당하는 프레임이 존재
i(invalid): 페이지에 해당하는 프레임이 존재x 유효x
3. 스레싱 ⭐⭐⭐
동시에 일정 수 이상의 프로그램을 실행했을 때 오히려 CPU 이용률이 떨어지는 상황
다중 프로그래밍 정도가 일정 수준 이상 높아지면 페이징이 빈번히 일어나게 되고 실질적으로 CPU 이용률이 떨어지는 스레싱 발생
1.6 캐시 메모리
1. 캐시 메모리와 지역성 ⭐⭐⭐
CPU와 메인 메모리 간에 데이터 접근 시 속도 차이를 줄이기 위해 사용
- 지역성
CPU가 자주 참조하는 데이터가 고르게 분포되지 않고 특정 부분에 몰려 있는 것
시간 지역성: 최근 참조한 내용을 다시 참조할 가능성이 높음
공간 지역성: 실제 참조한 주소 근처의 내용을 참조할 가능성이 높음
2. 캐시 메모리의 매핑 방식 ⭐
- 직접 매핑
메인 메모리를 일정한 크기로 나누고 각 영역을 캐시 메모리에 매핑하는 방식
- 연관 매핑
메모리 영역을 캐시 메모리에 규칙 없이 매핑하는 방식
- 집합 연관 매핑
직접 매핑과 연관 매핑을 결합해 단점을 보완한 방식