본문 바로가기
cs공부/총 정리

운영체제 총 정리

by 코딩하는 돼징 2024. 5. 3.
반응형

운영체제란?

컴퓨터 시스템의 핵심 부분으로 컴퓨터의 자원을 효율적으로 관리하고 응용 프로그램이 원할하게 실행되도록 하는 특별한 프로그램이다. 모든 프로그램은 운영체제의 지원하에 실행된다.

1) CPU 관리 - CPU 스케줄링

2) 프로세스 관리 - 다중 프로세스 관리, 프로세스 상태 관리

3) 메모리 관리 - 새로운 프로세스가 시작될때 해당 프로세슬르 어느 주소로 메모리에 할당할지

4) 파일시스템 관리 - 파일 정의 및 디렉터리 관리

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

운영체제는 크게 커널 영역과 사용자 영역으로 나뉜다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

커널 영역

항상 컴퓨터가 부팅될 때 메모리 내에 따로 적재되어 실행되는 공간이다. 커널은 운영체제의 핵심 부분으로 시스템의 핵심 기능과 자원을 관리한다.

사용자 영역

커널 영역을 제외한 나머지 영역으로 사용자가 이용하는 응용프로그램이 적재되는 영역을 사용자 영역이라고 한다. 여기에는 응용프로그램 코드, 데이터, 스택등이 위치한다.


커널이란?

운영체제의 핵심 부분으로 자원에 접근하고 조작하며 프로그램이 안전하게 실행되도록하는 기능을 제공한다. 여기에는 메모리관리, 프로세스 스케줄링, 입출력관리 등이 초함된다. 운영체제가 설치된 모든 기기에는 커널이 있다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

운영체제에 속하는데 커널에 속하지 않는 기능

사용자 인터페이스(UI, User Interface)는 윈도우의 바탕화면과 같이 사용자가 컴퓨터와 상호작용할 수 있는 통로일뿐 커널은아니다.


시스템 호출

커널 모드로 전환하여 실행하기 위한 호출이다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

Q : 사용자가 응용프로그램이 실행되는 과정을 간단하게 설명해주세요
A : 사용자가 실행하려는 응용프로그램을 실행하면(시스템 콜) 해당 프로그램을 메모리에 로드하고 실행을 시작한다. 운영체제는 실행하려는 프로그램을 메모리에 로드한다. 이때 프로그램의 코드,데이터, 그리고 실행에 필요한 모든 리소스가 메모리에 로드된다. 프로그램이 로드되면 운영체제는 프로그램의 제어를 넘겨주고(사용자 모드) 실행을 시작한다.

프로세스

컴퓨터에서 실행중인 프로그램이다. 각각의 프로세스는 독립된 메모리공간을 할당 받는다. 

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

01 코드 영역

텍스트 영역이라고도 불린다. 기계어로 이루어진 명령어가 저장된다. 코드 영역에는 데이터가 아닌 CPU가 실행할 명령어가 담기기 때문에 쓰기가 금지된 read-only공간이다. 실행되는 프로그램의 코드가 저장되는 메모리 영역

02 데이터 영역

프로그램이 실행되는 동안 유지되어야 하는 데이터가 저장되는 공간이다. 대표적으로 전역변수와 정적 변수 등이 이영역에 해당된다. 이 변수들은 프로그램이 시작될때 할당되고 프로그램 종료시 소멸된다.

03 힙 영역

프로그래머가 직접 공간을 할당/해제하는 메모리 영역이다. 프로그램 동작(런타임)시에 크기가 결정된다. 힙 영역에서 할당된 메모리는 프로그래머가 명시적으로 반환해주어야 하며 반환하지 않는 경우 메모리 누수가 발생할 수 있다. 런타임시에 크기가 결정한다. 

04 스택 영역

함수나 메서드의 지역 변수와 매개 변수가 저장된다. 함수나 메서드가 호출될 때마다 스택프레임에 쌓인다.


단일 프로세스

하나의 프로세스만 실행되는 형태이다. 단점으로는 CPU 사용량이 좋지 않다.


멀티 프로그래밍

여러개의 프로그램을 메모리에 올려놓고 동시에 실행시킨다. IO작업을 하는 동안 다른 프로세스가 CPU에서 실행된다. CPU사용률을 극대화 시키는데 목적이 있지만 CPU 사용시간이 길어지게 되면 다른 프로세스가 무기한 대기하게 된다.


멀티태스팅

프로세스는 한 번 CPU를 사용할때 아주 짧은 시간(=quantum)만 CPU에서 실행되도록 하자! 프로세스의 응답시간을 최소화시키는데 목적이있다.

하지만 하나의 프로세스가 동시에 여러 작업을 수행할 수 없다. 그리고 프로세스의 컨텍스트 스위칭은 무겁고 프로세스끼리 데이터 공유가 까다롭다.


스레드

프로세스는 한 개 이상의 스레드를 가질 수 있다. 이는 CPU에서 실행되는 단위(unit of exectuion)이다. 같은 프로세스의 스레드들끼리는 컨텍스트 스위칭이 가볍다. 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유한다. 그러므로 다수의 작업을 동시에 처리하는데 좋다.

Q : 스레드를 많이 쓸수록 항상 성능이 좋아질까?
A : 스레드가 많다면 그만큼 context switching이 빈번히 발생하게 되는데 이것이 작업될 때는 코어에서 스위칭 작업을 처리하는 동안에는 애플리케이션 코드가 실행되지 않는다. 이때 스위칭 작업을 위해 소비되는 CPU time은 애플리케이션과 직접적인 관련은 없지만 멀티스레딩으로 동작하기 위해 필요하기 때문에 이런 것을 over-head 간접비용이라고 부른다.
그러므로 CPU의 코어수는 고정되어 있는데 스레드 수를 계속 늘리면 각 코어에서 경합하는 스레드수는 점점 많아 질 것이고 그렇다면 over-head도 더 많아 질 것 이다.

멀티 스레딩

하나의 프로세스가 동시에 여러 작업을 실행하는데 목적이다.

Q : 멀티 프로세스와 멀티 스레드의 차이점은?
A : 멀티 프로세스는 같은 프로세스 내의 자원을 공유하지 않는다. 그러므로 안전성이 높고 독립성이 보장된다. 하지만 자원 소모가 크고 통신 오버헤드가 발생할 수 있다. 멀티 쓰레드는 프로세스끼리는 기본적으로 자원을 공유하지 않지만 Thread끼리는 같은 프로그램내에서 자원(코드,데이터,)을 공유하면서 실행된다. 그러므로 자원을 효율적으로 활용할 수 있지만 동기화 문제에 주의해야 한다.

멀티 프로세싱

두 개이상의 CPU(프로세스)나 코어를 활용하는 시스템이다. 이를 통해 병렬로 작업을 처리하여 성능을 향상 시킬 수 있다.


프로세스 제어 블록(PCB, Process Control Block) 

프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료 구조이다. 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장된다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

커널 영역에 생성되며 운영체제도 수 많은 프로세스들 사이에서 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는데 필요한 정보를 판단한다. PCB는 프로세스 생성시에 만들어지고 실행이 끝나면 폐기된다.

Q : 한 프로세스 A에서 다른 프로세스 B로 실행 순서가 넘어가면 어떤 일이 일어날까?
A : 기존에 실행되던 프로세스 A는 프로그램 카운터를 비롯한 각종 레지스터값, 메모리 정보, 열었던 파일, 사용한 입출력 장치 등 지금까지의 중간 정보를 백업한다. 

문맥(Context)

이러한 중간 정보 즉 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥이라고 한다. 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어있다. 그러므로 PCB에 기록되는 정보들을 문맥이라고 봐도 된다.

그러므로 실행 문맥을 잘 기억해 두면 언제든 해당 프로세스의 실행을 재개할 수 있다.


컨텍스트 스위칭(Context Switching)

이처럼 기존의 실행 중인 프로세스 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥교환이라고 한다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

Q : 컨텍스트 스위칭은 언제 발생하는가?
A :  주어진 time slice(quantum)를 다 사용했거나 IO작업을 할 경우 혹은 다른 리소스를 기다려야 할 경우 등이다.
Q : 왜 프로세스 컨텍스트 스위칭이 스레드 컨테스트 스위칭 보다 느린가?
A : 프로세스 컨텍스트 스위칭이 일어날 경우 단위가 프로세스이므로 스위칭이 발생할 때마다 메모리 주소 공간을 변경해야 한다. 이는 주소 공간 변경 및 메모리 보호 기법에 따른 처리를 수반하게 된다. 또한 프로세스는 고유한 메모리 주소 공간을 가지므로 캐시에 저장된 데이터는 다음 프로세스에 적용되지 않을 수 있다. 그러므로 다시 메모리에서 데이터를 읽어와야 한다.

burst

어떤 현상이 짧은 시간안에 집중적으로 일어나는 일


CPU 버스트(CPU burst)

프로세스가 CPU에서 한번에 연속적으로 실행되는 시간이다.


IO

파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 것 혹은 입출력 자이치와 데이터를 주고 받는 것을 말한다.

IO 버스트(IO burst)

프로세스가 IO작업을 요청하고 결과를 기다리는 시간이다. 

 

프로세스의 인생은 CPU버스트와 IO버스트의 연속이다.


CPU bound process

CPU 연산이 많이 필요한 작업(burst)이 많은 프로세스이다. 예를들어 동영상 편집 프로그램, 머신러닝 프로그램이 있다.

Q : 듀얼 코어 CPU에서 동작할시 CPU bound 프로그램을 구현한다면 몇개의 스레드를 쓰는게 좋을까?
A : CPU-bound 애플리케이션인 경우 CPU를 많이 쓰기 때문에 코어 수와 비슷한 수준 이상으로 스레드 수를 늘려봤자 별 이점이 없다. 오히려 각 코어에서 경합하는 스레드 수가 많아질수록 context switching 때문에 over-head만 더 많아져서 성능에 안 좋은 영향을 주게 된다.

IO bound process

IO burst가 많은 프로세스이다. 예를 들어 일반적인 백엔드 API서버가 있다.

Q : 듀얼 코어 CPU에서 동작할시 IO bound 프로그램을 구현한다면 몇개의 스레드를 쓰는게 좋을까?
A : I/O bound 애플리케이션은 I/O 작업이 많기 때문에 CPU가 놀고 있는 시간이 많다. 이런 상황에서는 코어수보다 두 배, 세 배 혹은 그 이상으로 스레드 수를 늘려주는 것이 overhead가 좀 더 늘긴 해도 코어들을 더 효율적으로 쓸 수 있기 때문에 하지만 이 경우에도 너무 많은 스레드를 쓰게 되면 오히려 성능에 악영향을 줄 수 있다. 그러므로 여러 상황에 맞춰서 적절한 스레드 수를 찾아야한다.

동시다발적으로 실행되는 프로세스들은 서로 협력하며 영향을 주고 받는다. 이 과정에서 자원의 일관성을 보장해야 한다.

이렇게 하기 위해서는 반드시 동기화(synchronization)되어야 한다.

동기화란?

특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나 프로세스를 올바른 순서대로 실행하게 하는 것을 의미한다. 공유 데이터의 일관성을 유지하는 것을 말한다.

공유 자원이란?

동시에 접근해서는 안되는 자원이 공유 자원이다. 공유 자원은 여러 프로세스 혹은 스레드가 공유하는 자원이다. 전역변수 뿐만 아니라 파일, 입출력 장치, 보조 기억장치가 공유자원이 될 수 있다.

임계 구역(critrical section)

동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계구역이라고 한다. 임계 구역에 집입하고자 하면 진입한 프로세스 이외에는 대기해야 한다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

Race Condition

임계 구역에 동시에 접근하면 자원의 일관성이 깨질 수 있다. 앞서 공유 자원에 동시제 접근하는 경우가 레이스 컨디션에 해당된다.

Q : Race Condition이 왜 발생할까요 컴퓨터 언어적 관점에서 설명해주세요.
A : 고급 언어는 한줄로 적혀 있지만 컴퓨터 내부에서는 여러줄의 저급언어로 변환되어 실행된다.
그러므로 컴퓨터는 고급 언어가 아닌 저급 언어를 실행하기 때문에 여러 줄의 저급 언어로 변환된 고급 언어 한 줄을 실행하는 과정에서 문맥 교환이 일어날 수 있다. 저급 언어를 실행하 과정에서 문맥 교환이 일어난다면 아래와 같은 문제가 발생한다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

 

 

임계 구역 문제를 해결하는 세 가지 원칙

01 상호 배제(mutal exclusion)

한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없다.

02 진행(progress)

임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.

03 유한 대기(bounded waiting)

한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계구역에 들어올 수 있어야 한다.(임계 구역에 들어오기 위해 무한정 대기해서는 안된다.)


SpinLock

Lock을 받을 때까지 계속 기다린다. 단점은 lock을 기다리는 동안 cpu를 낭비하게 된다.

Mutex(Mutual Exclusion object)

SpinLock과 달리 Lock을 가지면 휴식한다. 

Q : 뮤텍스가 항상 스핀락보다 좋을까?
A : 스핀락이 더 좋은 경우도 있다. 멀티 코어 환경이고, critical section에서의 작업이 context switching(락을 기다리느라 잠들고 깨는 경우)보다 더 빨리 끝난다면 스핀락이 뮤텍스보다 더 이점이 있다. 왜냐하면 뮤텍스의 경우 락을 해제할때까지 다른 스레드가 대기해야 하지만 스핀락은 대기 하지 않고 계속 락을 시도하기 때문에 락을 획득하고자 하는 스레드는 바로 락을 얻을 수 있기 때문이다.

Semaphore

Mutex가 개인키를 가지고 있다고 생각하면 Semaphore는 공유키를 가지고 있다고 생각하면 된다. signal mechanism(카운터)을 가진 하나 이상의 프로세스스레드가 critical section에 접근하도록 하는 장치이다. 세마포어는 순서를 정해줄수도 있다.

Binary Semaphore인 경우 최대 1개의 프로세스만 접근 가능하다.

Q : 뮤텍스와 바이너리 세마포어는 같은 거 아닌가?
A : 뮤텍스는 락을 가진자만 락을 해제할 수 있지만 세마포는 그렇지 않다. wait하는 존재와 release하는 존재가 다를 수 있다.

세마포어의 단점

세마포어는 순서를 지정해줄 수 있기 때문에 개발자가 실수하는 순간 발견하기 어려운 타이밍 오류가 발생할 가능성이 존재한다. 예를 들어 release() → wait()인경우 Race Condition이 발생할 수 있고 wait() → wait()인 경우 DeadLock과 Starvation이 발생가능하다.

Monitor

mutal exclusion(Mutex)을 보장, 조건 변수를 사용한다. waiting queue를 가진다. 여기에는 조건이 충족되길 기다리는 스레드들이 대기 상태로 머무는 곳이다. 그러므로 조건에 따라 스레드가 대기 상태로 전환이 가능하다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

Q : 모니터는 언제 사용하는 것이 좋을까?
A : 한 번에 하나의 스레드만 실행되어야 할때, 여러 스레드와 협업이 필요할 때

DeadLock(교착상태)

두개이상의 프로세스 혹은 스레드가 서로가 가진 리소스를 기다리는 상태

발생하는 이유

01 상호 배제(Mutal exclusion)

한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상태

02 점유와 대기(Hold and wait)

자원을 할당 받은 상태에서 다른 자원을 할당 받기를 기다리는 상태

03 비선점(No preemption)

어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못하는 상태

04 원형대기(Circular wait)

프로세스들이 순환 형태로 자원을 대기하는 상태


교착 상태 예방

교착 상태 발생 조건(상호 배제, 점유와 대기, 비선점, 원형 대기)중 하나를 없애기

01 상호 배제 없애는 경우

모든 자원을 공유 가능하게 만든다는 말과 같다. 이는 현실적으로 사용하기에는 무리가 있다.

02 점유와 대기를 없애는 경우

만약 점유와 대기를 없앤 다면 특정 프로세스에 자원을 모두 할당하거나 아예 할당하지 않는 방식으로 배분된다. 이론적으로는 해결할 수 있지만 자원의 활용률이 낮아지는 문제가 생긴다.

03 비선점 조건을 없애는 경우

비선점 조건을 없애면 자원을 이용 중인 프로세스로부터 해당 자원을 빼앗을 수 있게된다. 선점이 가능한 자원(e.g. CPU)에 한해 효과적이다. 그러므로 모든 자원이 선점 가능한 것이 아니다.

04 원형 대기 조건을 없애는 경우

모든 자원에 번호를 붙이고 오름차순으로 자원을 할당하면 원형대기는 발생하지 않는다.  하지만 자원에 번호를 붙이는 것은 어려운 작업이다. 그리고 어떤 자원에 어떤 번호를 붙이느냐에 따라 활용률이 달라질 수 있다.


교착 상태 회피

교착 상태는 여러 프로세스가 서로 필요로 하는 자원을 소유한 채 대기하고 있는 상태로 각 프로세스가 다른 프로세스가 점유한 자원을 기다리며 자원을 해제하지 않는 상황이다. 이를 무분별한 자원할당으로 인한 문제로 간주하는 것이 일반적이다. 무분별한 자원 할당을 피하기 위해서는 프로세스가 필요로 하는 자원을 미리 예약하거나 안전상태(필요로 자원을 모두 할당할 수 있는지 미리 확인)해야하고 자원 할당 시에는 배분할 수 있는 자원의 양을 고려하여 교착 상태가 발생하지 않을 만큼만 자원을 배분해야 한다. 이를 통해 모든 프로세스가 필요한 자원을 얻을 수 있고 교착 상태를 피할 수 있다.

 

은행원 알고리즘 - 리소스 요청을 허락해 주었을때 데드락이 발생할 가능성이 있으면 리소스를 할당해도 안전할때까지 계속 청을 거절하는 알고리즘


교착 상태 검출 후 회복

교착 상태와 발생을 인정하고 사후에 조치하는 방식이다. 프로세스가 자원을 요구하면 일단 할당하고 교착 상태가 검출되면 회복, 선점을 통한 회복, 프로세스가 강제 종료를 통한 회복이 있다.

01 선점을 통한 회복

교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식이다. 교착 상태에 놓인 프로세스 중 하나를 선택하고 해당 프로세스가 점유한 자원을 강제로 해제하여 다른 프로세스에 할당한다.

02 프로세스가 강제 종료를 통한 회복

교착 상태에 놓인 프로세스가 모두 강제 종료한다. 교착 상태가 해결될 때까지 한 프로세스씩 강제로 종료하는 방식도 있다. 하지만 이 방법은 해당 프로세스가 실행 중이던 작업을 중단시키므로 작업 내역을 손실할 위험이 있다. 또한 프로세스를 강제로 종료하는 과정은 시스템에 오버헤드를 발생시키기 때문에 효율적이지 않을 수 있다.

 

CPU 스케줄링이란?

운영체제가 프로세스들에게 공정하고 합리적으로 CPU자원을 배분하는 것이다.

 

CPU 스케줄링은 스케줄링 방식에 따라 선점형과 비선점형으로 나눌 수 있다.


선점형 스케줄링(preemptive scheduling)

프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식이다. 즉 운영체제는 현재 실행 중인 프로세스의 실행을 중단하고 다른 프로세스에게 CPU를 할당할 수 있다. 이는 여러 프로세스 간의 경쟁에서 더 높은 우선 순위의 프로세스가 먼저 실행되도록 할 수 있다.

장점 

1) 자원 공정 분배 : 높은 우선 순위를 가진 프로세스에게 빠르게 CPU를 할당함으로써 자원 독점을 방지하고 시스템 전체에 자원이 공정하게 분배된다.

2) 응답 시간 감소 : 빠른 문맥 교환으로 높은 우선순위 프로세스가 빠르게 응답하게 할 수 있다.

단점

1) 오버헤드 발생 : 빈번한 문맥교환때문에 오버헤드가 발생할 수 있다.

2) 좀비 프로세스 문제 : 무한 루프에 빠진 프로세스가 높은 우선순위로 계속해서 CPU를 선점하게 되면 시스템에 문제를 발생시킬 수 있다.

 

01 라운드 로빈 스케줄링(RR, Round Robin)

선입 선처리 스케줄링 + 타임 슬라이스(Time Slice)

타임 슬라이스는 각 프로세스가 CPU를 사용할 수 있는 정해진 시간을 의미한다. 즉 정해진 타임 슬라이스만큼의 시간 동안 돌아가며 CPU를 이용하는 선점형 스케줄링이다.


02 최소 잔여 시간 우선 스케줄링(SRT, Shortest Remaining Time)

최단 작업 우선 스케줄링 + 라운드 로빈 스케줄

정해진 시간만큼 CPU를 이용하되 다음으로 CPU를 사용할 프로세스로는 남은 작업 시간이 가장 적은 프로세스를 선택한다.


03 다단계 큐 스케줄링(Multilevel Queue)

우선순위 스케줄링의 발전된 형태이다. 우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식이다.

우선순위가 가장 높은 큐에 있는 프로세스들을 먼저 처리하고 우선순위가 가장 높은 큐가 비어있으면 그 다음 우선순위 큐에 있는 프로세스를 처리한다.

 

각 큐는 서로다른 우선순위를 가지며 다른 스케줄링 알고리즘을 가질 수 있다. 그러므로 다양한 프로세스 유형에 대해 다양한 스케줄링 전략을 적용할 수 있어 효율적인 시스템 운영이 가능하다.

 

기아 현상

프로세스가 한 번 큐에 들어가면 해당 큐에서의 실행을 마칠 때까지 큐를 빠져나오지 않는다. 그러므로 우선순위가 낮은 프로세스는 우선순위가 낮은 큐에 머무르게 되며 기아현상이 발생할 수 있다. 


04 다단계 피드백 큐 스케줄링(Multilevel feedback queue)

여러개의 우선순위 큐를 사용하면서 프로세스가 큐 사이를 이동할 수 있는 스케줄링 방식이다.

즉 어떤 프로세스의 CPU 이용 시간이 길면 낮은 우선순위큐로 이동시키고 어떤 프로세스가 낮은 우선순위 큐에서 너무 오래 기다린다면 높은 우선순위 큐로 이동한다.

 

다단계 피드백 큐 스케줄링은 구현이 복잡하지만 가장 일반적인 CPU 스케줄링 알고리즘으로 알려져 있다.

 


비선점형 스케줄링(non-preemptive scheduling)

하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까진 다른 프로세스가 끼어들 수 없는 스케줄링 방식이다. 그러므로 한 번 CPU를 할당받은 프로세스는 해당 작업이 완료될 때까지 계속해서 CPU를 보유한다.

장점 

1) 문맥 교환 오버헤드 감소 : 선점형 스케줄링에 비해 문맥교환 오버헤드가 적다.

2) 쉬운 구현 : 선점형에 비해 구현이 간단하다.

단점

1) 자원 효율 성 감소 : 현재 실행중인 프로세스가 CPU를 계속해서 보유하면서 다른 프로세스들이 대기해야 하는 경우 발생할 수 있어 자원 효율성이 감소할 수 있다.

2) 응답 시간 증가 : 높은 우선순위의 프로세스가 대기해야 할 경우 해당 프로세스의 응답시간이 증가할 수 있다.


01 선입 선처리 스케줄링(FCFS, First Come First Served)

단순히 준비 큐에 삽입된 순서대로 처리하는 비선점 스케줄링 방식이다. 즉 먼저 CPU를 요청한 프로세스부터 CPU를 할당한다. 호위 효과가 발생할 수 있다.


호위 효과(Convoy Effect)

CPU 버스트 시간이 긴 프로세스가 준비 큐 앞에 위치하게 되면 그 뒤에 있는 짧은 CPU버스트를 가지는 프로세스들도 해당 프로세스의 끝을 기다려야 하는 현상이다.


02 최단 작업 우선 스케줄링(SJF, Shortest Job First)

호위 효과를 방지하려면 CPU 사용이 긴 프로세스는 나중에 실행하고 CPU 사용시간이 짧은 프로세스는 먼저 실행하도록 한다.

 

최단 작업 우선 스케줄링은 기본적으로 비선점형 스케줄링 알고리즘으로 분류되지만 선점형으로 구현될 수도 있다. 선점형 최단 작업 우선 스케줄링은 최소 잔여 시간 우선 스케줄링이다.


메모리 관리

01 연속 메모리 할당

프로세스를 메모리에 연속적으로 할당하는 기법, 할당과 제거를 반복하다보면 Scattered Holes가 생겨나고 이로 인한 외부단편화가 발생한다.

외부 단편화를 줄이기 위해 최초 적합, 최적 접합, 최악 접합을 사용할 수 있다.


02 페이징

프로세스를 일정한 고정 크기의 page로 나누고 메모리는 일정간 고정 크기의 frame으로 나눈다. 하지만 내부 단편화가 발생할 수 있다.

Q : 페이징의 단점과 왜 페이지 테이블이 필요한지 설명해주세요
A : 프로세스를 이루는 페이지가 어느 프레임에 적재되어 있는지 CPU가 일일이 알기 어렵다. 그리고 프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU입장에서 이를 순차적으로 실행할 수가 없다. 또한 CPU입장에서 '다음에 실행할 명령어 위치'를 찾기가 어려워진다. 그러므로 페이지 테이블이 필요하다. (실제 메모리 내의 주소인)물리 주소에 불연속적으로 배치되더라도 (CPU가 바라보는 주소인)논리 주소에는 연속적으로 배치되도록 하는 방법이다. 페이지 번호와 프레임 번호를 짝지어 일종의 이정표 역할을 한다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

페이징 기법에서는 주소 변환하는 것이 필요하다. 여러 개로 흩어진 페이지에 CPU가 접근하기 위해서 페이지 테이블을 통해 논리 주소를 물리주소로 변환해야하기 때문이다. PCB에는 페이지 테이블의 첫번째 주소, 물리 주소에 페이지가 적재되어 있는지 각종 프로세스의 정보가 담겨있다. 이때 CPU는 가상 주소를 요청한다. 중간에 있는 MMU칩을 확인해서 물리주소를 구한다.

Q : 내부 단편화란?
A : 페이징은 프로세스의 논리 주소 공간을 페이지라는 일정한 크기 단위로 자른다. 근데 모든 프로세스가 페이지 크기에 딱 맞게 잘리지 않는다. 그러므로 모든 프로세스 크기가 페이지의 배수가 아니다. 페이지 크기가 10KB인데 프로세스의 크기가 108KB라면 마지막 페이지는 2KB가 남는다. 이 메모리 낭비가 내부 단편화이다. 

MMU가 페이지 테이블을 확인했을때 invaild라면 page fault trap이 발생한다. 이때 운영체제는 backing store에 가서 페이지가 있는지 확인한 후 있다면 비어있는 frame에 페이지를 올린다.

Q : 만약 비어있는 프레임이 없다면?
A : 메모리는 한정된 자원이므로 기존 페이지들을 삭제해야 한다. 하지만 여기에서 중요한 부분은 잘 삭제해야 한다는 점이다. 향후에도 쓸 페이지를 삭제하면 또 page fault trap이 발생되기 때문이다. 그러므로 어떤 페이지들을 삭제하고 올려야 하는지에 대한 게 바로 페이지 교체 알고리즘이다.

1) FIFO 페이징 교체 알고리즘 : 메모리에 가장 먼저 올라온 페이지부터 내쫓는 방식으로 "오래 머물렀다면 나가라"는 알고리즘이다.

2) 최적 페이지 알고리즘 : CPU에 의해 참조되는 횟수를 고려하는 페이지 교체 알고리즘이다. 보조기억장치로 내보내야 할 페이지는 앞으로 사용 빈도가 가장 낮은 페이지이므로 앞으로의 사용빈도가 가장 낮은 페이지를 교체하는 알고리즘을 페이지 교체 알고리즘으로 삼는 것이 가장 합리적이다.

3) LRU(Least - Recently - Used) 페이지 교체 알고리즘 : 가장 오랫동안 사용되지 않는 페이지를 교체한다.

Q : 스래싱이란?
A : 프로세스가 실행되는 시간보다 페이징에 더 많은 시간을 소모하여 성능(CPU 이용률)이 저해되는 문제이다.

03 세그맨테이션

프로세스를 논리적인 내용의 단위인 세그멘트로 분할하는 것이다. 페이징 기법의 테이블과 유사한 세그먼트 테이블이 존재한다. 프로세스를 논리적인 단위로 나누기 때문에 세그먼트의 크기가 다양하므로 외부 단편화 문제가 발생한다. 따라서 오늘날에는 세그멘티이션보다는 페이징 기버를 주로 사용한다.

Q : 외부 단편화란?
A : 프로세스를 논리적인 단위로 나누기 때문에 세그먼트의 크기가 다양하므로 발생하는 문제이다.

 

 

 

 

 

 

반응형

댓글