이번 블로깅은 면접을 위한 CS 전공지식 노트 운영체제 부분을 정리해보았습니다.
운영체제
- 사용자가 컴퓨터를 쉽게 다루게 해주는 인터페이스, 한정된 메모리나 시스템 자원을 효율적으로 분배함
- 운영체제에서 소프트웨어를 추가로 설치할 수 없는 것이 펌웨어
운영체제와 컴퓨터
운영체제의 역할과 구조
운영체제의 역할
- CPU 스케줄링과 프로세스 관리
- 메모리 관리
- 디스크 파일 관리
- I/O 디바이스 관리
운영체제의 구조
- 유저 프로그램
- GUI
- 시스템콜
- 커널
- 드라이버: 하드웨어를 제어하기 위한 소프트웨어
- 하드웨어
가운데의 4개가 운영체제
- 시스템콜: 운영체제가 커널에 접근하기 위한 인터페이스이며 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할 때 씀
- 유저 프로그램이 I/O 요청으로 트랩을 발동하면 올바른 I/O 요청인지 확인한 후 유저 모드가 시스템콜을 통해 커널 모드로 변환되어 실행
- 프로세스나 스레드에서 운영체제로 어떠한 요청을 할 때 시스템콜이라는 인터페이스와 커널을 거쳐 운영체제에 전달함
- modebit: 시스템콜이 작동될 때 modebit를 참고해서 유저 모드와 커널 모드를 구분. modebit는 1 or 0(커널)의 값을 가지는 플래그 변수
컴퓨터의 요소
CPU, DMA 컨트롤러, 메모리, 타이머, 디바이스 컨트롤러 등으로 이루어짐
CPU
- Central Processing Unit
- 산술논리연산장치, 제어장치, 레지스터로 구성되어 있는 컴퓨터 장치
- 인터럽트에 의해 단순히 메모리에 존재하는 명령어를 해석해서 실행하는 일꾼
- 관리자 역할을 하는 운영체제의 커널이 프로그램을 메모리에 올려 프로세스로 만들면 일꾼인 CPU가 이를 처리함
제어장치
- Control Unit. 프로세스 조작을 지시하는 CPU의 한 부품
- 출력장치 간 통신을 제어하고 명령어들을 읽고 해석하며 데이터 처리를 위한 순서를 결정
레지스터
- 매우 빠른 임시기억장치
- 연산 속도가 메모리보다 수십, 수백배
- CPU는 자체적으로 데이터를 저장할 방법이 없어서 레지스터를 거쳐 데이터를 전달
산술논리연산장치
- ALU, Arithmetic Logic Unit
- 덧셈, 뺄셈 같은 두 숫자의 산술 연산과 배타적 논리합, 논리곱 같은 논리 연산을 계산하는 디지털 회로
연산 과정
- 제어장치가 메모리에 계산할 값을 로드. 또한, 레지스터에도 로드
- 제어장치가 레지스터에 있는 값을 계산하라고 산술논리연산장치에 명령
- 제어장치가 계산된 값을 다시 레지스터에서 메모리로 계산한 값을 저장
인터럽트
- 어떤 신호가 들어왔을 떄 CPU를 잠깐 정지시키는 것
- 키보드, 마우스, IO 디바이스, 프로세스 오류 등으로 발생
- 인터럽트 핸들러 함수가 모여 있는 인터럽트 벡터로 가서 인터럽트 핸들러 함수가 실행
- 인터럽트 간에는 우선순위가 있고 우선순위에 따라 실행됨
- 인터럽트는 하드웨어 인터럽트, 소프트웨어 인터럽트 2가지로 나뉨
- 인터럽트 핸들러 함수: 커널 내부의 IRQ를 통해 호출되며 request_irq()를 통해 인터럽트 핸들러 함수를 등록할 수 있음
- 하드웨어 인터럽트: IO 디바이스에서 발생하는 인터럽트
- 인터럽트 라인이 설계된 이후 순차적인 인터럽트 실행을 중지하고 운영체제에 시스템콜을 요청해서 원하는 디바이스로 향해 디바이스에 있는 작은 로컬 버퍼에 접근하여 일을 수행
- 소프트웨어 인터럽트: 트랩(trap). 프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동
DMA 컨트롤러
- I/O 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치
- CPU 부하를 막아주며 CPU의 일을 부담하는 보조 일꾼
메모리
- 전자회로에서 데이터나 상태, 명령어 등을 기록하는 장치
- 보통 그냥 RAM(Random Access Memory)
- CPU는 계산, 메모리는 기억을 담당
디바이스 컨트롤러
- 컴퓨터와 연결되어 있는 I/O 디바이스들의 작은 CPU
메모리
메모리 계층
레지스터, 캐시, 메모리, 저장장치로 구성
- 레지스터: CPU 안에 있는 작은 메모리, 휘발성, 속도 가장 빠름, 기억 용량이 가장 적음.
- 캐시: L1, L2, L3 캐시를 지칭. 휘발성, 속도 빠름, 기억 용량이 적음
- 메모리(RAM)/주기억장치: 휘발성, 속도, 기억 용량 보통
- 보조기억장치: HDD, SSD. 비휘발성, 속도 낮음, 기억 용량이 많음
캐시
- 데이터를 미리 복사해 놓는 임시 저장소이자
- 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리
- 메모리와 CPU 사이의 속도 차이가 너무 크기 때문에 그 중간에 레지스터 계층을 두는 것과 같음
- 속도 차이를 해결하기 위해 계층과 계층 사이에 있는 계층을 캐싱 계층
- 캐시 메모리와 보조기억장치 사이에 있는 주기억장치를 보조기억장치의 캐싱 계층이라고 할 수 있음
지역성의 원리
- 캐시 계층을 두는 것 말고 캐시를 직접 설정할 때 개념
- 자주 사용하는 데이터를 기반으로 설정해야 함
- 이 근거가 지역성
캐시히트와 캐시미스
- 캐시에서 원하는 데이터를 찾았다면 캐시히트
- 해당 데이터가 캐시에 없다면 주 메모리로 가서 데이터를 찾아오는 것을 캐시미스라고 함
- 캐시히트를 하게 되면 해당 데이터를 제어장치를 거쳐 가져오게 되서 위치도 가깝고 CPU 내부 버스를 기반으로 작동하기 때문에 빠름
- 캐시미스가 발생되면 메모리에서 가져오게 되는데, 이는 시스템 버스를 기반으로 작동하기 때문에 느림
캐시매핑
- 캐시가 히트되기 위해 매핑하는 방법
- 레지스터는 주 메모리에 비하면 굉장히 작고 주 메모리는 굉장히 크기 때문에 작은 레지스터가 캐시 계층으로써 역할을 잘 해주려면 이 매핑이 중요함
웹 브라우저의 캐시
- 웹 브라우저의 작은 저장소 쿠키, 로컬 스토리지, 세션 스토리지
- 사용자의 커스텀한 정보나 인증 모듈 관련 사항들을 웹 브라우저에 저장해서 추후 서버에 요청할 때 자신을 나타내는 아이덴티티나 중복 요청 방지를 위해 쓰임
메모리 관리
운영체제의 대표적인 할 일 중 하나
가상 메모리
- 메모리 관리 기법의 하나로 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말함
- 가상 주소, 실제 주소
- 가상 주소는 메모리관리장치(MMU, Memory Management Unit)에 의해 실제 주소로 변환
- 가상 메모리는 가상 주소와 실제 주소가 매핑되어 있고 프로세스의 주소 정보가 들어 있는 '페이지 테이블'로 관리됨
- 이때 속도 향상을 위해 TLB를 씀
- TLB: 메모리와 CPU 사이에 있는 주소 변환을 위한 캐시
- 페이지 테이블에 있는 리스트를 보관
- CPU가 페이지 테이블까지 가지 않도록 해 속도를 향상시킬 수 있는 캐시 계층
스와핑
- 가상 메모리에는 존재하지만 실제 메모리인 RAM에는 현재 없는 데이터나 코드에 접근할 경우 페이지 폴트가 발생. 이때 당장 사용하지 않는 영역을 하드디스크로 옮기고 하드디스크의 일부분을 마치 메모리처럼 불러와 쓰느 것
- 이를 통해 마치 페이지 폴트가 일어나지 않는 것처럼 만듬
페이지 폴트
- 프로세스의 주소 공간에는 존재하지만 지금 이 컴퓨터의 RAM에는 없는 데이터에 접근했을 경우에 발생
페이지 폴트와 그로 인한 스와핑 과정
- CPU는 물리 메모리를 확인하여 해당 페이지가 없으면 트랩을 발생해서 운영체제에 알림
- 운영체제는 CPU의 동작을 잠시 멈춤
- 운영체제는 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인하고, 없으면 프로세스를 중단하고 현재 물리 메모리에 비어 있는 프레임이 있는지 찾습니다. 물리 메모리에도 없다면 스와핑이 발동
- 비어 있는 프레임에 해당 페이지를 로드하고, 페이지 테이블을 최신화
- 중단되었던 CPU 다시 시작
- 페이지: 가상 메모리를 사용하는 최소 크기 단위
- 프레임: 실제 메모리를 사용하는 최소 크기 단위
스레싱
- 메모리의 페이지 폴트율이 높은 것을 의미. 컴퓨터의 심각한 성능 저하를 초래
- 메모리에 너무 많은 프로세스가 동시에 올라가게 되면 스와핑이 많이 일어나서 발생
- 페이지 폴트가 일어나면 CPU 이용률이 낮아짐. 그러면 가용성을 더 높이기 위해 더 많은 프로세스를 메모리에 올리게 됨. 이렇게 악순환이 반복되어 스레싱이 일어남
- 운영체제 입장에서의 해결 방법은 작업 세트와 PFF가 있음
작업 세트
- working set. 프로세스의 과거 사용 이력인 지역성을 통해 결정된 페이지 집합을 만들어서 미리 메모리에 로드
PFF
- Page Fault Frequency. 페이지 폴트 빈도를 상한선과 하한선을 만들어 조절하는 방법
메모리할당
- 메모리에 프로그램을 할당할 때는 시작 메모리 위치, 메모리의 할당 크기를 기반으로 할당함.
- 연속 할당과 불연속 할당으로 나뉨
연속 할당
- 메모리에 연속적으로 공간을 할당
- 고정 분할 방식, 가변 분할 방식으로 나뉨
고정 분할 방식
- 메모리를 미리 나누어 관리
- 융통성이 없고, 메모리 단편화가 발생
가변 분할 방식
- 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용
- 외부 단편화가 발생할 수 있음
- 최초적합, 최적적합, 최악적합이 있음
내부 단편화
- 메모리를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 공간이 많이 발생하는 현상
외부 단편화
- 메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 공간이 많이 발생하는 현상
홀
- 할당할 수 있는 비어 있는 메모리 공간
불연속 할당
- 현대 운영체제가 쓰는 방법
- 메모리를 동일한 크기의 페이지로 나누고 프로그램마다 페이지 테이블을 두어 이를 통해 메모리에 프로그램을 할당
- 세그멘테이션, 페이지드 세그멘테이션이 있음
페이징
- 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당
- 홀의 크기가 균일하지 않은 문제가 없어지지만 주소 변환이 복잡해짐
세그멘테이션
- 페이지 단위가 아닌 의미 단위인 세그먼트로 나누는 방식
- 프로세스가 코드, 데이터, 스택, 힙 등으로 이루어지는데, 코드와 데이터 등 이를 기반으로 나눌 수도 있으며 함수 단위로 나눌 수도 있음
- 공유와 보안 측면에서 좋으며 홀 크기가 균일하지 않은 문제가 발생
페이지드 세그멘테이션
- 공유나 보안을 의미 단위의 세그먼트로 나누고, 물리적 메모리는 페이지로 나누는 것
페이지 교체 알고리즘
- 스와핑은 많이 일어나지 않도록 설계되어야 하며 이는 페이지 교체 알고리즘을 기반으로 스와핑이 일어남
오프라인 알고리즘
- 먼 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘이며, 가장 좋은 방법
- 미래에 사용되는 프로세스를 우리가 알 수가 없으니 사용할 수 없는 알고리즘
FIFO
- 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법
LRU
- Least Recentle Used. 참조가 가장 오래된 페이지를 바꿈
- 오래된 것을 파악하기 위해 각 페이지마다 계수기, 스택을 두어야 하는 문제가 있음
- LRU 구현을 프로그래밍으로 구현할 때는 2개의 자료구조로 구현하는데 해시 테이블과 이중 연결 리스트
- 해시 테이블은 이중 연결 리스트에서 빠르게 찾을 수 있도록 쓰고, 이중 연결 리스트는 한정된 메모리를 나타냄
NUR
- Not Used Recently. clock 알고리즘.
- 0과 1을 가진 비트를 둠. 1은 최근에 참조되었고 0은 참조되지 않음을 의미. 시계 방향으로 돌면서 0을 찾고 0을 찾은 순간 해당 프로세스를 교체하고, 해당 부분을 1로 바꾸는 알고리즘
프로세스와 스레드
- 프로세스는 컴퓨터에서 실행되고 있는 프로그램
- CPU 스케줄링의 대상이 되는 작업
- 스레드는 프로세스 내 작업의 흐름
프로세스와 컴파일 과정
- 프로그램은 컴파일러가 컴파일 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일이 되는 것을 의미
- 별도의 컴파일 과정 없이 한 번에 한 줄씩 읽어들여서 실행하는 프로그램인 인터프리터 언어로 된 프로그램과는 다름
프로그램의 컴파일 과정
소스코드 -> 전처리 -> 컴파일러 -> 어셈블리어 -> 어셈블러 -> 목적코드 -> 링커 -> 실행 가능한 파일
전처리
- 소스코드의 주석을 제거하고 #include 등 헤더 파일을 병합하여 매크로를 치환
컴파일러
- 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환
어셈블러
- 목적 코드로 변환
링커
- 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 겷합하여 실행 파일을 만듬
- .out 확장자
정적 라이브러리와 동적 라이브러리
- 정적 라이브러리는 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
- 시스템 환경 등 외부 의존도가 낮고 코드 중복 등 메모리 효율성이 떨어지는 단점
- 동적 라이브러리는 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하는 방식이며, 메모리 효율성에서의 장점과 외부 의존도가 높아진다는 단점
프로세스의 상태
생성 상태
- 프로세스가 생성된 상태를 의미하며 fork() 또는 exec() 함수를 통해 생성
- 이때 PCB가 할당
fork()
- 부모 프로세스의 주소 공간을 그대로 복사하며, 새로운 자식 프로세스를 생성하는 함수
- 주소 공간만 복사할 뿐이지 부모 프로세스의 비동기 작업 등을 상속하지 않음
exec()
- 새롭게 프로세스를 생성
대기 상태
- 메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기하고 있으며 CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태
대기 중단 상태
- 메모리 부족으로 일시 중단된 상태
실행 상태
- CPU 소유권과 메모리를 할당받고 인스트럭션(CPU가 실행하는 명령어)을 수행 중인 상태를 의미
- CPU burst라고 표현
중단 상태
- 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
- I/O 디바이스에 의한 인터럽트로 이런 현상이 많이 발생
일시 중단 상태
- 대기 중단과 유사
- 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태
종료상태
- 메모리와 CPU 소유권을 모두 놓고 가는 상태
- 부모 프로세스가 자식 프로세스를 강제시키는 비자발적 종료도 있음
- process, kill 등 여러 명령어로 프로세스를 종료할 때 발생
프로세스의 메모리 구조
- 운영체제는 프로세스에 적절한 메모리를 할당하는데 다음 구조를 기반으로 할당
- 위에서부터 동적영역의 스택과 힙, 정적 영역인 데이터 영역(BSS segment, Data segment), 코드 영역
- 스택은 위 주소부터 할당되고 힙은 아래 주소부터 할당
스택
- 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정되며 동적인 특징을 갖음
- 함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 늘어날 수 있는데, 이 때 힙과 스택의 메모리 영역이 겹치면 안 되기 떄문에 힙과 스택 사이의 공간을 비워 놓습니다.
힙
- 동적 할당할 때 사용되며 런타임 시 크기가 결정
- 벡터 같은 동적 배열은 힙에 동적 할당
- 동적인 특징을 가짐
데이터 영역
- 전역변수, 정적변수가 저장
- 정적인 특징을 갖는 프로그램이 종료되면 사라지는 변수가 들어 있는 영역
- BSS 영역과 Data 영역으로 나뉘고, BSS 영역은 초기화가 되지 않은 변수가 0으로 초기화되어 저장되며 Data 영역(Data segment)은 0이 아닌 다른 값으로 할당된 변수들이 저장
코드 영역
- 프로그램에 내장되어 있는 소스 코드가 들어가는 영역
- 수정 불가능한 기계어로 저장
PCB
- Process Control Block. 운영체제에서 프로세스에 대한 메타데이터를 저장한 '데이터'를 말함
- 프로세스 제어 블록. 프로세스가 생성되면 운영체제는 해당 PCB를 생성
- 일반 사용자가 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리
메타데이터: 데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터, 대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대해 부여되는 데이터
PCB의 구조
- 프로세스 스케줄링 상태: '준비', '일시중단' 등 프로세스가 CPU에 대한 소유권을 얻은 이후의 상태
- 프로세스 ID: 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
- 프로세스 권한: 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
- 프로그램 카운터: 프로세스에서 실행해야 할 다음 명령어의 주소에 대한 포인터
- CPU 레지스터: 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
- CPU 스케줄링 정보: CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
- 계정 정보: 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
- I/O 상태 정보: 프로세스에 할당된 I/O 디바이스 목록
컨텍스트 스위칭
PCB를 교환하는 과정
한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해서 발생함
(싱글코어 기준)어떠한 시점에서 실행되고 있는 프로세스는 단 한개이며, 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되고 있기 때문에 여러 개의 프로세스가 동시에 구동되는 것 처럼 느끼는 것
프로세스 A가 실행하다 멈추고, 프로세스 A의 PCB를 저장하고 다시 프로세스 B를 로드하여 실행. 그리고 다시 프로세스 B의 PCB를 저장하고 프로세스 A의 PCB를 로드
- 그래서 컨텍스트 스위칭이 일어날 때 유휴 시간이 발생함
- 추가적으로 캐시미스라는 비용이 더 듬
캐시미스: 컨텍스트 스위칭이 일어날 때 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소 변환이 생기므로 캐시클리어 과정을 겪게 되고 이 때문에 캐시미스가 발생
멀티프로세싱
- 여러 개의 '프로세스', 즉 멀티프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것
- 하나 이상의 일을 병렬로 처리. 신뢰성이 높음
웹 브라우저
- 멀티프로세스 구조
- 브라우저 프로세스: 주소 표시줄, 북마크 막대, 뒤로 가기 버튼, 앞으로 가기 버튼 등을 담당하며 네트워크 요청이나 파일 접근 같은 권한을 담당
- 렌더러 프로세스: 웹 사이트가 '보이는' 부분의 모든 것을 제어
- 플러그인 프로세스: 웹 사이트에서 사용하는 플러그인을 제어
- GPU 프로세스: GPU를 이용해서 화면을 그리는 부분을 제어
IPC
- Inter Process Communication. 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘
- 클라이언트, 서버 통신도 IPC의 예시
- 종류로는 공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메시지 큐
- 메모리가 완전히 공유되는 스레드보다는 속도가 떨어짐
공유 메모리
- 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 버퍼를 생성
- 불필요한 데이터 복사의 오버헤드가 발생하지 않아 가장 빠르며 같은 메모리 영역을 여러 프로세스가 공유하기 떄문에 동기화가 필요
- 하드웨어 관점에서 공유 메모리는 CPU가 접근할 수 있는 큰 랜덤 접근 메모리인 RAM을 가리킬 수 있음
파일
- 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터
소켓
- 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미
- TCP, UDP
익명 파이프
- unamed pipe. 프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식
- 부모, 자식 프로세스 간에만 사용가능하고 다른 네트워크 상에서는 사용이 불가능
명명된 파이프
- named pipe. 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 이중 파이프를 말함.
- 클라이언트/서버 통신을 위한 별도의 파이프를 제공하며, 여러 파이프를 동시에 사용할 수 있다.
메시지 큐
- 메시지를 큐 데이터 구조 형태로 관리하는 것을 의미
- 커널의 전역변수 형태 등 커널에서 전역적으로 관리되며 다른 IPC 방식에 비해서 사용 방법이 매우 직관적이고 간단하며 다른 코드의 수정 없이 단지 몇 줄의 코드를 추가시켜 간단하게 메시지 큐에 접근할 수 있다는 장점 존재
- 공유 메모리를 통해 IPC를 구현할 때 쓰기 및 읽기 빈도가 높으면 동기화 때문에 기능을 구현하는 것이 매우 복잡해지는데, 이때의 대안으로 사용 가능
스레드와 멀티스레딩
스레드
- 프로세스의 실행 가능한 가장 작은 단위
- 코드, 데이터, 힙은 스레드끼리 서로 공유하고, 프로세스 상태(각각의 스레드 상태), 스택 영역은 서로 공유함
멀티스레딩
- 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법이며 스레드끼리 서로 자원을 공유하기 때문에 효율성이 높음
- 동시성에도 큰 장점
공유 자원과 임계 영역
공유자원
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수 등을 의미
- 이 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태라고 함
- 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태
임계 영역
둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
임계 영역을 해결하기 위한 방법은 크게 뮤텍스, 세마포어, 모니터가 있음. 이 방법 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족
- 토대가 되는 메커니즘은 잠금(lock)
상호배제: 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없음
한정 대기: 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안됨
융통성: 한 프로세스가 다른 프로세스의 일을 방해해서는 안됨
뮤텍스
- mutex. 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금 해체하는 객체.
- 잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 점근할 수 없고 해제는 그와 반대
- 잠금 또는 잠금 해제라는 상태만을 가짐
세마포어
- semaphore. 일반화된 뮤텍스. 간단한 정수 값과 두 가지 함수 wait(P 함수), signal(V 함수)로 공유 자원에 대한 접근을 처리
- wait()는 자신의 차례가 올 때까지 기다리는 함수, signal()은 다음 프로세스로 순서를 넘겨주는 함수
- 프로세스나 스레드가 공유 자원에 접근하면 세마포어에서 wait() 작업을 수행하고 프로세스나 스레드가 공유 자원을 해제하면 세마포어에서 signal() 작업을 수행
- 조건 변수가 없고 프로세스나 스레드가 세마포어 값을 수정할 때 다른 프로세스나 스레드는 동시에 세마포어 값을 수정할 수 없음
바이너리 세마포어
- 0과 1의 두 가지 값만 가질 수 있는 세마포어
- 뮤텍스랑 비슷하다고 생각할 수 있지만 뮤텍스는 잠금을 기반으로 상호배제가 일어나는 '잠금 메커니즘'이고, 세마포어는 신호를 기반으로 상호 배제가 일어나는 '신호 메커니즘'임
카운팅 세마포어
- 여러 개의 값을 가질 수 있는 세마포어, 여러 자원에 대한 접근을 제어하는데 사용
모니터
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공
- 모니터큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리할 수 있음
- 세마포어보다 구현하기 쉽고, 상호 배제는 자동인 반면에, 세마포어에서는 상호 배제를 명시적으로 구현해야 하는 차이가 있음
교착 상태
두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
교착 상태 원인
- 상호 배제: 한 프로세스가 자원을 독점, 다른 프로세스들은 접근이 불가능
- 점유 대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
- 비선점: 다른 프로세스의 자원을 강제적으로 가져올 수가 없는 상태
- 환형 대기: 프로세스 A는 프로세스 B의 자원을 요구하고, 프로세스 B는 프로세스 A의 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황을 말함
교착상태 해결 방법
- 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계
- 교착 상태 가능성이 없을 때만 자원이 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘'을 씀
- 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한 개씩 지움
- 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 커서 교착 상태가 발생하면 사용자가 작업을 종료함. '응답 없음'이 뜨는 경우
은행원 알고리즘: 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안정 상태로 나누고 안정 상태로 가도록 자원ㅇ르 할당하는 알고리즘
CPU 스케줄링 알고리즘
- CPU 스케줄러는 CPU 스케줄링 알고리즘에 따라 프로세스에서 해야 하는 일을 스레드 단위로 CPU에 할당
- CPU 이용률은 높게, 주어진 시간에 많은 일을 하게, 준비 큐에 있는 프로세스는 적게, 응답 시간은 짧게 설정하는 것을 목표로 함
비선점형 방식
- 프로세스가 스스로 CPU 소유권을 포기하는 방식
- 강제로 프로세스를 중지하지 않음
- 컨텍스트 스위칭으로 인한 부하가 적음
FCFS
- Frist Come, First Served. 가장 먼저 온 것을 가장 먼저 처리하는 알고리즘
- 준비 큐에서 오래 기다리는 현상(convoy effect)이 발생하는 단점
SJF
- Shortest Job First. 실행 시간이 가장 짧은 프로세스를 가장 먼저 실행하는 알고리즘
- 긴 시간을 가진 프로세스가 실행되지 않는 현상이 일어나며 평균 대기 시간이 가장 짧음
- 실제로는 실행 시간을 알 수 없기 때문에 과거의 실행했던 시간을 토대로 추측함
우선순위
- SJF에서 오랜된 작업일수록 '우선순위를 높이는 방법'을 통해 단점을 보완한 알고리즘
선점형 방식
- 현대 운영체제가 쓰는 방식
- 알고리즘에 의해 프로세스를 중단시켜 버리고 강제로 다른 프로세스에 CPU 소유권을 할당하는 방법
라운드 로빈
- 현대 컴퓨터가 쓰는 스케줄링인 우선순위 스케줄링의 일종
- 각 프로세스는 동일한 할당 시간을 주고 그 시간 안에 끝나지 않으면 다시 준비 큐의 뒤로 가는 알고리즘
- q만큼의 할당 시간이 부여되었고 N개의 프로세스가 운영된다고 하면 (N-1)*q 시간이 지나면 자신의 차례가 옴
- 할당 시간이 너무 크면 FCFS가 되고 짧으면 컨특스트 스위칭이 잦아져서 오버헤드, 즉 비용이 커짐
- 전체 작업 시간은 길어지지만 평균 응답 시간은 짧아진다는 특징이 있음
- 로드밸런서에서 트래픽 분산 알고리즘으로 쓰임
SRF
- 중간에 실행 시간이 더 짧은 작업이 들어와도 기존 짧은 작업을 모두 수행하고 그 다음 짧은 작업을 이어나가는데, SRF는 중간에 더 짧은 작업이 들어오면 수행하던 프로세스를 중지하고 해당 프로세스를 수행하는 알고리즘
다단계 큐
- 우선순위에 따른 준비 큐를 여러 개 사용하고, 큐마다 라운드 로빈이나 FCFS 등 다른 스케줄링 알고리즘을 적용한 것을 말함
- 큐 간의 프로세스 이동이 안되므로 스케줄링 부담이 적지만 유연성이 떨어짐
질문: 운영체제의 역할, PCB란?, 메모리 계층에 대해 설명
출처: 면접을 위한 CS 전공지식 노트(주홍철 지음, 길벗 출판사)