본문 바로가기
[ Computer Science ]/Computer Network

[운영체제] 혼자 공부하는 컴퓨터구조 + 운영체제 연습문제 9장~12장

by dev charlotte 2023. 10. 30.

혼자 공부하는 컴퓨터구조 + 운영체제 연습문제

 

# 1. 운영체제를 알아야 하는 이유

* 운영체제는 실행할 프로그램에 자원을 할당하고 프로그램이 올바르게 실행되도록 돕는 프로그램

 

* 운영체제에 대한 설명

- 운영체제를 이해하면 하드웨어와 프로그램을 더 깊이 이해

- 운영체제는 메모리 내 커널 영역에 적재

- 운영체제는 시스템 자원을 관리하는 프로그램

- 운영체제는 사용자가 실행하는 프로그램이 올바르게 실행되도록 도움

 

# 2. 운영체제의 큰 그림 

* 커널은 운영체제의 핵심 기능을 담당하는 부분을 의미

 

* 이중모드와 시스템 호출

- 운영체제의 핵심 서비스는 커널 모드로 실행

- 일반적인 응용 프로그램은 사용자 모드로 실행

- 시스템 호출을 통해 사용자 모드에서 커널 모드로 전환 -> 운영체제 서비스 제공받기 위해

- 시스템 호출은 일종의 인터럽트. 소프트웨어적인 인터럽트 -> 입출력장치에 의해 발생 / 특정 명령어에 의해 발생

 

* 운영체제의 핵심 서비스

- 프로세스 관리

- 자원 접근 및 할당

- 파일 시스템 관리

 

# 3. 프로세스와 스레드

* CPU를 정해진 시간 만큼만 사용하고 시간이 끝났음을 알리는 타이머 인터럽트 (하드웨어 인터럽트) 발생

 

* PCB 프로세스 제어 블록 - OS는 PCB를 통해 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고 프로세스에 자원을 배분 

 

* 프로세스

- 프로세스 : 실행되는 프로그램

- 프로세스가 생성되면 커널 영역에 PCB가 생성됨

- 프로세스들은 문맥 교환을 통해 번갈아 가면서 수행

- 프로세스는 반드시 사용자와 상호작용할 수 있어야 하는 것은 아님 -> 사용자 상호작용 없이도 백그라운드에서 시스템 리소스 사용 및 실행 가능. 

 

* 문맥 교환

- 빠르게 자주 수행되는 것이 좋은 것만은 아님 -> 오버헤드 우려

- 직전에 수행되던 프로세스의 문맥이 백업되고 다음에 수행할 프로세스의 문맥이 복구됨

- 문맥은 PBC 에 기록됨 

 

# 4. 프로세스 상태와 계층 구조

* 프로세스 상태

- 생성상태 -> 준비상태 -> (디스패치) -> 실행상태 -> 종료상태

- 실행상태 -> (타이머 인터럽트) -> 준비상태

- 실행상태 -> (입출력 요청) -> 대기상태 -> (입출력 완료) -> 준비상태

 

* fork() exec()

- fork 시스템 호출을 하면 새로운 폴더가 아닌 프로세스를 생성

- fork 시스템 호출을 하면 부모 프로세스의 복제본이 자식 프로세스로서 생성

- exec 시스템 호출을 하면 프로세스의 메모리 공간이 다른 프로세스의 내용으로 변경 (덮어쓰기)

- 많은 운영체제는 fork exec를 통해 프로세스 계층 구조 형성

 

* 프로세스 상태

- 생성 상태는 프로세스를 생성중인 상태

- 준비 상태는 CPU를 할당받아 실행할 수 있으나 본인 차례를 기다리다가 할당 받고 실행할 준비

- 실행 상태는 프로세스 실행중

- 종료 상태는 프로세스 종료중

 

# 5. 스레드 

* 스레드

- 프로세스 내의 실행의 흐름 단위

- 프로세스 내의 스레드들은 각기 다른 코드/데이터/힙 영역을 가지고 있지 않음 

- 프로세스 내의 스레드들은 각기 다른 프로그램 카운터 값을 가지고 있음

- 프로세스 내의 스레드들은 각기 다른 스택을 가지고 있음 -> 스레드 id, pc 값, 레지스터 값, 스택을 각각 가지고 있음

 

-> 코드와 데이터, 파일, 힙은 스레드가 공유하는 자원

-> 레지스터, 스택, 프로그램 카운터는 스레드가 공유하지 않는 자원

 

* 멀티프로세스와 멀티스레드의 차이

- 프로세스끼리는 기본적으로 자원을 공유하지 않지만 프로세스 내의 스레드끼리는 같은 프로세스 내의 자원을 공유함

 

# 6. CPU 스케쥴링

* 프로세스 스케쥴링

- 운영체제는 우선순위를 토대로 프로세스 스케쥴링

- 스케쥴링 큐를 사용해 스케쥴링할 프로세스 관리

- 준비 큐에는 준비 상태인 프로세스들이 , 대기 큐에는 대기 상태인 프로세스들이 삽입

- 선점형 스케쥴링은 프로세스가 이용 중인 자원을 강제로 뺏을 수 있는 방식

 

* 선점형 스케쥴링과 비선점형 스케쥴링

- 선점형 스케쥴링은 어느 한 프로세스가 자원을 독점할 수 없는 스케쥴링 방식

- 선점형 스케쥴링은 문맥 교환 과정의 오버헤드가 비선점형 스케쥴링에 비해 많음

- 비선점형 스케쥴링은 어느 한 프로세스가 자원을 독점할 수 있는 스케쥴링 방식

- 비선점형 스케쥴링은 문맥 교환 과정의 오버헤드가 선점형 스케쥴링에 비해 적음

 

# 7. CPU 스케쥴링 알고리즘

* 준비 큐에 A, B, C, D 순으로 프로세스를 삽입한다면 선입 선처리 스케쥴링 알고리즘을 적용하면 A-B-C-D 순서대로 CPU 할당 받음 

* 우선순위가 낮아 실행이 계속 연기되는 문제 - 기아문제

* 기아문제 해결을 위해 점차 우선순위를 높이는 기법 - 에이징

 

# 8. 동기화

* 실행 순서를 위한 동기화 - 프로세스를 올바른 순서대로 실행하기

* 상호 배제를 위한 동기화 - 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하도록 하기

* 임계 구역

- 임계 구역에서는 반드시 하나의 프로세스만 실행되도록 해야함

- 여러 프로세스가 동시에 실행될 경우 레이스 컨디션 발생

- 임계 구역에서 실행되는 프로세스가 있다면 다른 프로세스는 기다려야함  -> 무한정 대기는 아님. 유한대기

- 운영체제는 임계 구역을 관리

 

# 9. 동기화 기법

* 뮤텍스 락과 세마포

- 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호배제를 위한 동기화를 이룸

- 세마포는 공유 자원이 여러 개 있는 상황에서도 이용 가능

- 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있음

- 세마포를 이용하면 반드시 바쁜 대기를 할 필요는 없음

 

* 조건변수 x, y가 있다고 가정할 때 스레드 a는 실행과정에서 x.wait 호출, 스레드 b는 y.wait 호출함. 스레드 c가 y.signal 을 호출하면 스레드 a와 b 중 실행이 재개되는 스레드는 b 이다

-> y.wait 에서 블록이 해제되어 y 조건 변수의 대기 큐에서 먼저 대기 중이던 스레드가 재개됨

여전히 x.wait를 호출한 a 는 블록된 상태이므로 재개되지 않음

 

* 세마포를 이용하면 동시에 실행되는 프로세스 혹은 스레드 간에 실행 순서 제어를 위한 동기화(특정 조건이 만족되어야만 실행할 수 있는 상황에서 올바른 순서대로 실행하게 하는 것)와 상호 배제를 위한 동기화(동시에 접근해서는 안되는 자원에 동시에 접근하지 않도록 제어하는 것)를 할 수 있음