[CS] 운영체제 핵심 정리

·2024년 9월 8일

Study Note ✍🏻

목록 보기
48/60

커널과 쉘

쉘 (Shell)

사용자가 운영체제 기능과 서비스를 조작할 수 있도록 인터페이스를 제공하는 프로그램
터미널 환경(CLI), GUI 환경 두 종류로 분류된다.

System call

운영체제가 운영체제 각 기능을 사용할 수 있도록 명령 또는 함수를 제공
API 내부에는 필요시 해당 운영체제의 시스템 콜을 호출하는 형태로 만들어짐.

이중 모드 (dual mode)

운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호한다.
CPU가 명령어를 실행하는 모드를 크게 사용자 모드커널 모드로 구분하는 방식이다.

사용자 모드

운영체제 서비스를 제공받을 수 없는 실행 모드 즉, 커널 영역의 코드를 실행할 수 없는 모드이다. 사용자 모드로 실행 중인 CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행할 수 없다. 그래서 사용자 모드로 실행되는 일반적인 응용 프로그램은 자원에 접근할 수 없다.

커널 모드

커널 모드에서만 실행 가능한 기능이 있고, 커널 모드로 실행하려면 반드시 System call을 사용해야 한다.

CPU가 시스템 호출을 처리하는 순서는 인터럽트 처리 순서와 유사. 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드를 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속한다.

일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 이용한다. 그 과정에서 빈번하게 시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행된다.

운영체제 역할

  1. 시스템 자원 관리자
    시스템 자원 = 컴퓨터 하드웨어 (CPU, Memory, I/O devices, 저장매체)

  2. 사용자와 컴퓨터 간 커뮤니케이션 지원

  3. 응용 프로그램 제어

프로세스

실행 중인 프로그램 (!= 응용 프로그램) 즉, 메모리에 올려져서 실행 중인 프로그램이다.
일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있기에 CPU는 한 프로세스를 실행하다가 다른 프로세스로 실행을 전환하고, 그 프로세스를 실행하다가 또 다른 프로세스로 실행을 전환하는 것을 반복한다.

Batch Processing

여러 프로그램을 순차적으로 실행시킨다. 어떤 프로그램은 실행시간이 너무 많이 걸려서, 다른 프로그램을 실행하는 데 많이 기다려야 한다. -> 현재 운영체제에서 적합하지 않음.

운영체제 스케쥴링

Time Sharing (시분할)

다중 사용자 지원을 위해 컴퓨터 응답 시간을 최소화하는 시스템.

멀티 태스킹

단일 CPU에서 여러 응용 프로그램이 동시에 실행되는 것처럼 보이도록 하는 시스템

멀티 프로세싱

여러 CPU에 하나의 프로그램을 병렬로 실행해서 실행 속도를 극대화하는 시스템

멀티 프로그래밍

최대한 CPU를 많이 활용하도록 하는 시스템

메모리 계층 구조

하드 디스크와 메인 메모리 중 어느 곳에 데이터가 존재하는 가에 따라 속도가 매우 크게 차이난다. 즉, 사용할 데이터가 메인 메모리에 존재하도록 하는 것이 속도를 높이는 1순위 방법.

스케쥴링 알고리즘

FCFS (First Come First Served)

프로세스는 준비 큐에서 도착순서에 따라 디스패치되며, 일단 한 프로세스가 CPU를 차지하면 그 프로세스의 수행이 완료된 후에 그 다음 프로세스가 CPU 차지하고 수행된다.

겉보기에는 공정하지만, 짧은 작업이 긴 작업을 기다리게 되기도 하고 중요한 프로세스가 나중에 수행될 수 있는 불합리함이 있어 대화식 시스템에 부적합.

SJF(Shortest Job First)

준비 큐에서 기다리는 프로세스 중 실행시간이 가장 짧다고 예상된 것을 먼저 디스패치하여 실행하는 비선점 스케줄링 알고리즘

Priority-based 스케쥴러

  • 정적 우선순위 : 프로세스마다 우선순위를 미리 지정
  • 동적 우선순위 : 스케쥴러가 상황에 따라 우선순위를 동적으로 변경

우선순위가 낮은 프로세스는 계속해서 우선순위가 높은 프로세스에게 밀려 실행될 수 없음 (Starvation)
우선순위가 높은 프로세스가 Blocking 되어있어 CPU가 계속해서 대기해야하는 상황 (Indefinite blocking)

SRT(Shortest Remaining Time)

SJF 알고리즘의 선점 알고리즘 버전. 새로 들어오는 프로세스를 포함하여 실행이 끝날때까지 남은 시간 추정치가 가장 짧은 프로세스를 먼저 디스패치하여 실행한다. 대화형 운영체제에 유용하다.

SRT는 실행되는 각 작업의 실행시간을 추적하여 각 프로세스가 서비스를 받은 시간이 기록되어야 하며 때로는 선점을 위한 문맥 교환해야 하므로 SJF보다 오버헤드가 더 크다.

HRN(Highest Response Ratio Next)

준비 큐에서 기다리는 프로세스 중 응답비율이 가장 큰 것을 먼저 디스패치하여 실행하는 비선점 스케줄링 알고리즘. 예상 실행시간이 짧을수록, 대기시간이 길수록 응답비율이 커진다.

SJF의 예상 실행시간이 긴 프로세스가 먼저 들어왔더라도 이후에 실행시간이 짧은 프로세스가 계속해서 들어오면 우선순위에서 계속 밀렸던 단점을 보완

RR(Round Robin)

프로세스가 도착한 순서대로 프로세스를 디스패치하지만 정해진 시간 할당량에 의해 실행을 제한한다. 시간 할당량을 매 프로세스에 주고 할당된 시간 안에 완료하지 못한 프로세스는 준비 큐의 맨 뒤에 배치되도록 하여 CPU 독접하지 않고 공평하게 이용이 가능하다.

time quantum이 너무 커지면 FCFS와 같아지고, 너무 작아지면 Context Switching으로 인한 Overhead가 증가한다.

프로세스 구조

Context Switching

CPU에 실행할 프로세스를 교체하는 기술, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업이다.
프로세스의 상태는 Process Control Block(PCB)에 저장된다.
Context Switching이 자주 일어나게 되면 성능은 저하된다.

IPC (InterProcess Communication)

프로세스는 다른 프로세스의 공간을 접근할 수 없다. 성능을 높이기 위해 멀티 프로세싱을 하게 되고, 이 때 프로세스 간 상태 확인 및 데이터 송수신이 필요하다.

프로세스는 커널 공간을 공유한다. 중복되는 커널 공간을 각자 가지고 있는 것은 자원 낭비이기 때문이다. 그래서 대부분의 IPC기법은 커널 공간을 활용해서 프로세스간 값을 전달하고 전달받는다.

file (커널 공간 X)

직접 파일에 접근해서 Write 하고 다른 프로세스에서 수정된 파일에 접근, Read하는 방식.
값을 전달 받는 프로세스는 값이 변경 됐는지 알 수 있는 방법이 없고 Storage에 접근이 필요해 속도가 느리다.

Message Queue

메시지 큐는 데이터를 메시지 단위로 큐에 저장하고, 프로세스가 해당 메시지를 읽거나 쓸 수 있도록 하는 방식으로 작동한다. 즉, 프로세스가 직접적으로 메모리를 공유하지 않고도 서로 데이터를 주고받을 수 있다.

pipe

통신을 위한 메모리 공간(버퍼)를 생성하여 프로세스가 데이터를 주고 받는다.
하나의 프로세스가 데이터를 쓰면 다른 프로세스가 그 데이터를 읽는 구조 즉,반이중 통신이라 송/수신 모두를 위해서는 pipe가 2개가 필요하다.

shared memory

커널 공간에 메모리 공간을 만들고 해당 공간을 변수처럼 사용
공유 메모리가 각 프로세스에게 첨부되는 방식으로 작동한다. 대량의 정보를 대량의 프로세스에게 전달할 수 있고, 중개자 없이 곧바로 메모리에 접근 가능해 IPC 중 가장 빠르다.

Thread (스레드)

할당 받은 자원을 이용하는 실행 단위, Light Weight Process라고도 한다. 하나의 프로세스에 여러 개의 스레드를 생성 할 수 있다. 동시에 실행이 가능하고, 프로세스 안에 있으므로 프로세스의 데이터를 모두 접근 가능하다.

하나의 프로세스안에 다수의 스레드가 있을 때, 스레드는 프로세스처럼 모든 영역들을 다 빼고 넣고 하지않아도 된다. 각 스레드는 스택 부분만을 따로 가지고, 코드, 데이터, 힙 영역은 공유하기 때문이다. 메모리 사용이 훨씬 효율적이게 된다.

멀티 프로세스와 멀티 스레드


멀티 스레드의 경우 여러 스레드가 하나의 프로세스 내에서 같은 메모리를 사용한다. 반면 멀티 프로세스각 프로세스가 별도의 메모리 공간을 가진다.
멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 사용하며 스레드간 Context Switching도 빠르다. 하지만 스레드간 다 연결되어 있기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향이 가게 된다. 또한, 같은 메모리 자원을 사용하기 때문에 각 스레드에서 자원 관리에 주의해야 한다. (동기화 문제 발생)

메모리 공유가 필요하고 간단한 작업일 경우, I/O Bound 작업 - 멀티 스레딩
독립적 메모리와 안정적 운영이 필요한 경우, CPU Bound 작업- 멀티 프로세싱

동기화

작업들 사이에 실행 시기를 맞추는 것을 동기화라고 한다.
여러 스레드가 동일한 데이터 접근시 동기화 이슈가 발생한다. 동일 자원을 여러 스레드가 동시 수정 시에 각 스레드 결과에 영향을 준다.


sum = sum+10의 경우 데이터를 읽기 / 덧셈 / 덮어씌우기 과정이 필요하다. 과정 도중에 context switching이 발생할 경우 문제가 발생할 수 있게 되는 것이다.

동기화 이슈 해결

Mutual exclusion (상호 배제)

스레드는 프로세스 모든 데이터를 접근할 수 있으므로, 여러 스레드가 변경하는 공유 변수에 대해 Exclusive Access가 필요하다. 즉, 어느 한 스레드가 공유 변수를 갱신하는 동안 다른 스레드가 접근하지 못하도록 막는다.

Mutex와 세마포어

임계 구역에 대한 접근을 막기 위해 Locking 메커니즘이 필요

Mutex : 임계구역에 하나의 스레드만 들어갈 수 있음

세마포어 : 임계구역에 여러 스레드가 들어갈 수 있음. counter를 두어 동시에 리소스에 접근할 수 있는 허용 가능한 스레드 수를 제어

교착상태 (Deadlock)

무한 대기 상태, 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있어 다음 단계로 진행하지 못하는 상태

Starvation

특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태

가상 메모리

실제 각 프로세스마다 충분한 메모리를 할당하기에는 메모리 크기가 한계가 있다.
배치 처리 시스템에서는 가상 메모리가 필요 없지만, 여러 프로세스를 동시 실행하는 시스템에서는 메모리 용량 부족 문제와 프로세스 메모리 영역간에 침범 문제가 발생하게 된다.

가상 메모리는 메모리가 실제 메모리보다 많아 보이게 하는 기술로, 실제 사용하는 메모리는 작다는 점을 착안해서 고안된 기술이다. 프로세스간 공간 분리로 프로세스 이슈가 전체 시스템에 영향을 주지 않게 된다.

프로세스는 가상 주소를 사용하고 실제 해당 주소에서 데이터를 읽고/쓸 때만 물리 주소로 바꿔준다. CPU에서는 MMU(Memory Management Unit)이 이 역할을 담당한다.

Main Memory에는 실제 각 프로세스의 데이터가 조각으로 담겨있다. (모든 데이터가 담겨있지 않음) 이를 Paging 시스템을 이용해 필요한 데이터를 Memory에 올리고 내려준다.

페이징

크기가 동일한 페이지로 가상 주소와 이에 매칭하는 물리 주소 공간을 관리한다. 페이지 번호를 기반으로 가상 주소/물리 주소 매핑 정보를 기록하고 사용한다.
가상 주소 v = (p, d) (p = 가상 메모리 페이지, d = p 안에서 참조하는 위치)

미리 페이징 정보를 만들어놓지 않고, 특정 페이지 주소 영역에 대해서만 만들어놓는다. (필요없는 페이지는 생성하지 않으면 공간 절약)

TLB

MMU에서 Memory에 직접 접근해 데이터를 가져오게 되면 시간이 오래걸린다. TLB는 페이지 정보 캐쉬로 최근 접근한 데이터의 물리 주소가 담겨있다. TLB를 통해 접근하면 속도가 빨라진다.

Demand Paging (요구 페이징)

프로세스 모든 데이터를 메모리로 적재하지 않고, 실행 중 필요한 시점에만 메모리로 적재한다. 더이상 필요하지 않은 페이지 프레임은 다시 저장 매체에 저장한다.

Page Fault

어떤 페이지가 실제 물리 메모리에 없을 때 일어나는 인터럽트로 page fault가 발생하면 물리 메모리로 페이지를 올린다.

보조기억장치는 읽기/쓰기가 매우 느리다. SDD에서 RAM으로 데이터를 적재하는 과정 자체도 오버헤드가 크다. 즉, Page Fault가 많이 일어날수록 성능이 저하된다. 성능을 좋게 하기 위해서는 Page Fault가 적게 일어나도록 해야한다. 그를 위해 Page Fault 알고리즘이 존재한다.

1. OPT(Optimal Algorithm)
가장 먼 미래에 참조되는 page를 대체하는 방법이다. 이 방법은 항상 최적의 결과를 갖는다.
다만, 미래의 참조를 모두 알고 있어야 하므로 실제로 사용하기는 어렵고, 다른 알고리즘의 성능에 대한 upper bound를 제공하는 역할을 한다.

2. FIFO(First In First Out)
제일 먼저 들어온 것을 먼저 내쫓는 방법이다. 모든 page가 평등하게 frame에 거주하며, 구현하기 쉽다는 장점이 있다. 다만, 어떤 page는 항상 필요할 수 있어도 replace를 시킨다는 단점이 있다.

Belady's anomaly 현상(frame이 늘어나도 page fault가 감소하지 않고 오히려 늘어나는 경우가 존재)이 발생할 수 있다.

3. LRU (Least Recently Used)
가장 오래전에 참조된 것을 지우는 방법이다. Optimal에 근접한 방법이며, Belady's anomaly가 발생하지 않는다. 다만, 구현하기가 어렵고 접근되는 빈도를 고려하지 않는다는 단점이 있다. 

4. LFU(Least Frequently Used)
참조 횟수가 가장 적은 page를 지우는 방법이다. LRU에 비해 장기적인 시간 규모를 보기 때문에 page의 인기도를 조금 더 정확히 반영할 수 있다. 하지만 최근성은 반영하지 못한다.

5. NUR(Not Used Recently)
LRU처럼 가장 최근에 참조되지 않은 페이지를 대상으로 선정한다는 점에서 LRU와 근사하지만 교체되는 페이지의 참조 시점이 가장 오래되었다는 것을 보장하지는 않는다. 운영체제가 자료구조를 변경하고 유지하는 작업을 수행해야 하는데, 이미 메모리에 page가 올라가 있는 경우에는 CPU가 운영체제에 넘어가지 않는다. page fault가 발생해야 CPU가 운영체제에 넘어가고, 디스크에서 메모리로 page를 로드할 때 해당 page에 대한 정보를 얻고 갱신할 수 있다. 따라서 운영체제가 참조한 지 오래되거나 참조 횟수가 적은 페이지를 정확하게 알 수 없다. 

NUR 페이지 교체 알고리즘에서는 페이지마다 참조 비트와 변경 비트를 가지므로 페이지마다 추가되는 메모리 공간이 2비트뿐이다. 우선순위: 참조비트 > 변형비트

참조 비트: 페이지에 접근(read/execute)하면 1이 된다.
변경 비트: 페이지가 변경(write/append)되면 1이 된다.

모든 페이지의 초기 상태는 (0,0)이다. 이 상태에서 페이지에 읽기 또는 실행과 같은 '접근'이 발생하면 (1,0)으로 바뀐다. 만약 페이지에 쓰기 또는 추가 같은 '변경'이 일어나면 (0,1)이 된다. 또한 접근과 변경, 두 가지 연산이 다 발생하면 (1,1)이 된다. 흔한 경우는 아니지만 모든 페이지의 비트가 (1,1)일 때는 어떤 페이지가 더 자주 사용되는 지를 알 수 없어 NUR 페이지 교체 알고리즘을 정상적으로 적용할 수 없다. 그러므로 NUR 페이지 교체 알고리즘에서 모든 페이지가 (1,1)이 되면 모든 페이지 비트를 (0,0)으로 초기화한다.

Thrashing

반복적으로 Page Fault가 발생해 과도하게 페이지 교체 작업이 일어나 실제로는 아무런 일도 하지 못하는 상황 (실행보다 Swapping 하는데 더 많은 시간을 소모하는 현상)

파일시스템

운영체제가 저장매체에 파일을 쓰기 위한 자료구조 또는 알고리즘
0과 1의 데이터를 비트로 관리하기에는 오버헤드가 너무 커 블록 단위로 고유 번호를 부여해 관리한다. 사용자가 각 블록 고유 번호를 관리하기에는 어려워 추상적 객체인 파일 단위로 관리한다.

효율적으로 파일을 저장하기 위해서는 가능한 연속적인 공간에 파일을 저장하는 것이 좋다. 하지만, 이 경우 외부 단편화/파일 사이즈 변경 문제로 불연속 공간에 파일 저장 기능 지원이 필요하다.

블록 체인 : 블록을 Linked List로 연결 (단, 끝에 있는 블록을 찾기 위해 맨 처음 블록부터 주소를 따라가야 한다.)
index 블록 : 각 블록에 대한 위치 정보를 기록해 한번에 끝 블록을 찾아갈 수 있도록 한다.

inode 파일 구조

inode 고유값과 자료구조에 의해 주요 정보를 관리한다.

super 블록 : 파일 시스템 정보
inode 블록 : 파일 상세 정보

데이터 블록 : 실제 데이터

가상 파일 시스템

모든 것은 파일이라는 철학을 따른다. 모든 인터렉션은 파일을 읽고 쓰는 것처럼 이루어진다.
마우스, 키보드와 같은 디바이스 관련 기술도 파일과 같이 다루어진다.
모든 자원에 대한 추상화 인터페이스로 파일 인터페이스를 활용한다.

웹 서버 프로그램이 시스템 자원을 요청할 때, 시스템 콜을 호출하게 되며 (open, read, write) 이러한 자원은 가상 파일 시스템를 통해서 자원에 접근하게 된다.

참고자료

[운영체제란?] 커널의 개념, 응용 프로그램 실행을 위한 이중 모드와 시스템 호출
[운영체제 03] 스케줄링 알고리즘

profile
Frontend🍓

0개의 댓글