독학/컴퓨터구조 + 운영체제

[혼공학습단 11기 혼공컴운] 컴퓨터구조+운영체제 week4

최연재 2024. 1. 22. 17:23

✍️ 기본 미션

p. 304의 확인 문제 1번 풀고 인증하기

 

✍️ 선택미션

Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기

선입 선처리 스케줄링 알고리즘을 적용하면 준비 큐에 삽입된 순으로 CPU를 할당받는다.
 
따라서 답은 A → B → C →D 이다.


🗒️내용 정리

Chap09. 운영체제 시작하기

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

(1) 운영체제(Operating System)
- 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램
- 자원 : 프로그램 실행에 마땅히 필요한 요소
- 메모리

  • 부팅될 때 메모리 내 커널 영역(kernal space)이라는 공간에 따로 적재되어 실행된다.
  • 사용자 영역 : 커널 영역을 제외한 나머지 영역으로 사용자가 이용하는 응용 프로그램이 적재되는 영역
  • 응용 프로그램(application software) : 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램 


(2) 운영체제를 알아야 하는 이유 : 문제 해결의 실마리를 찾을 수 있다.
 

2) 운영체제의 큰 그림

(1) 운영체제의 심장, 커널(kernal)
- 운영체제의 핵심 서비스를 담당하는 영역
- 운영체제가 제공하는 서비스 중 커널에 표함되지 않는 서비스

  • ex. 사용자 인터페이스 (UI; User Interface) : 사용자가 컴퓨터와 상호작용할 수있는 통로
  • 그래픽 유저 인터페이스 (GUI : Graphic User Interface), 커맨드 라인 인터페이스(CLI : Command Line Interface)

(2) 이중 모드와 시스템 호출
- 운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는것을 방지하여 자원을 보호한다.
- 이중 모드(dual mode)

  • CPU가 명령어를 실행하는 모드를 사용자 모드와 커널 모드로 구분하는 방식
  • CPU는 명령어를 사용자 모드로써, 혹은 커널 모드로써 실행 가능.
  • 플래그 레지스터 속 슈퍼바이저 플래그를 통해 현재 CPU가 어떤 모드로 실행되는지 알 수 있다. 

 - 사용자 모드 (user mode)

  • 운영체제 서비스를 제공받을 수 없는 실행 모드
  • 커널 영역의 코드 실행 불가
  • 일반적인 응용 프로그램은 사용자 모드로 실행된다.
  • 사용자 모드로 실행 중인 CPU는 하드웨어 자원에 접근하는 명령어 실행 불가
  • 사용자 모드로 실행되는 일반적인 응용 프로그램은 자원에 접근할 수 없다.

- 커널 모드 (kernal mode)

  • 운영체제 서비스를 제공받을 수 있는 실행 모드
  • 커널 영역의 코드를 실행할 수 있는 모드
  • CPU가 커널모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다. 
  • 운영체제는 커널 모드로 실행되기 때문에 자원에 접근할 수 있다.

- 시스템 호출 (System call)

  • 사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받기 위해 운영체제에 요청을 보내 커널 모드로 전환되어야 한다.
  • 시스템 호출 : 운영체제 서비스를 제공받기 위한 요청
  • 시스템 호출은 일종의 인터럽트이다.
    • 소프트웨어 인터럽트 : 인터럽트를 발생시키는 특정 명령어에 의해 발생하는 인터럽트
    • 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해 나간다.
  • 일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스를 매우 빈번하게 이용한다. → 빈번한 시스템 호출

* 가상 머신과 이중 모드의 발전


* 시스템 호출의 종류

종류시스템 호출설명
프로세스 관리fork()새 자식 프로세스 생성
execute()프로세스 실행 (메모리 공간을 새 프로그램 내용으로 덮어씌움)
exit()프로세스 종료
waitpid()자식 프로세스가 종료할 때까지 대기
파일 관리open()파일 열기
close()파일 닫기
read()파일 읽기
write()파일 쓰기
stat()파일 정보 획득
디렉터리 관리chdir()작업 디렉터리 변경
mkdir()디렉터리 생성
rmdir()비어 있는 디렉터리 삭제
파일 시스템 관리mount()파일 시스템 마운트
unmount()파일 시스템 마운트 해제

 
 
(3) 운영체제의 핵심 서비스
- 프로세스 관리

  • 프로세스 (process) : 실행 중인 프로그램
  • 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있다.
  • CPU는 프로세스들을 번갈아가며 실행한다. 
  • 운영체제는 다양한 프로세스들을 일목요연하게 관리하고 실행할 수 있어야 한다.
  • 여러 프로세스가 동시에 실행되는 환경에서는 프로세스 동기화가 필수적이고, 교착 상태를 해결할 수 있어야 한다.

- 자원 접근 및 할당

  • 모든 프로세스는 실행을 위해 자원을 필요로 한다.
  • 운영체제는 프로세스들이 사용할 자원에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당한다.
  • CPU
    • CPU 스케줄링 : 운영체제는 프로세스들에게 공정하게 CPU를 할당하기 위해 어떤 프로세스부터 CPU를 이용하게 할 것인지, 얼마나 오래 CPU를 이용하게 할 것인지를 결정해야 한다.
  • 메모리
    • 운영체제는 새로운 프로세스가 적재될 때마다 어느 주소에 적재해야 할 지 결정해야 한다.
  • 입출력장치
    • 입출력장치가 발생시키는 하드웨어 인터럽트도 인터럽트 서비스 루틴이 커널 영역에 있다.
    • 입출력 장치가 CPU에 하드웨어 인터럽트 요청 신호를 보내면 CPU는 하던 일을 백업하고 커널 영역에 있는 인터럽트 서비스 루틴을 실행한다.
    • 운영체제는 인터럽트 서비스 루틴을 제공함으로써 입출력 작업을 수행한다.

- 파일 시스템 관리
 
 
 

Chap10. 프로세스와 스레드

1) 프로세스 개요

(1) 프로세스 직접 확인하기
- ps 명령어
- 포그라운드 프로세스 (foreground process) : 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스 (background process) : 사용자가 보지 못하는 뒤편에서 실행되는 프로세스

  • 사용자와 상효작용하지 않는 백그라운드 프로세스
    • 유닉스 체계 운영체제 : 데몬(daemon)
    • 윈도우 운영체제 : 서비스(service)

 
(2) 프로세스 제어 블록 (PCB : Process Control Block)
- 프로세스들은 돌아가며 한정된 시간만큼 CPU를 이용한다.

  • 타이머 인터럽트가 발생하면 차례를 양보하고 다음 차례가 올 때까지 기다린다.
  • 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다.
  • 이를 위해 프로세스 제어 블록을 이용한다. 

- 프로세스 제어 블록

  • 프로세스와 관련된 정보를 저장하는 자료 구조
  • 커널 영역에 생성된다.
  • 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다.

- 프로세스 제어 블록에 포함되는 정보

  • 프로세스 ID(PID : Process ID) : 특정 프로세스를 식별하기 위해 부여하는 고유한 번호 
  • 레지스터 값
    • 해당 프로세스가 실행했던 프로그램 카운터를 비롯한 레지스터 값이 저장된다.
    • 자신의 실행 차례가 되면 이전까지 사용했던 레지스터의 중간값을 모두 복원해 이전의 작업을 이어 실행한다.
  • 프로세스 상태
  • CPU 스케줄링 정보
  • 메모리 관리 정보 : 베이스 레지스터, 한계 레지스터 값과 같은 정보, 페이지 테이블 정보 등이 담긴다.
  • 사용한 파일과 입출력장치 목록

 
(3) 문맥 교환
- 문맥 (context)

  • 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
  • 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현된다.
  • 프로세스가 CPU를 사용할 수 있는 시간이 다 되거나 예기치 못한 상황이 발생하여 인터럽트가 발생하면 운영체제는 해당 프로세스의 PCB에 문맥을 백업한다. 

- 문맥 교환 (context switching)

  • 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는것
  • 여러 프로세스가 끊임없이 빠르게 번갈아가며 실행되는 원리 → 프로세스가 동시에 실행되는 것 처럼 보인다.
  • 문맥 교환을 너무 자주 하면 오버헤드가 발생할 수 있다.

 
(4) 프로세스의 메모리 영역
- 하나의 프로세스는 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.
- 코드 영역 (code segment)

  • 텍스트 영역(text segment)이라고도 한다.
  • 기계어로 이루어진 명령어가 저장된다.
  • CPU가 실행할 명령어가 담겨 있으므로 읽기 전용(read-only) 공간이다. (쓰기가 금지됨.)
  • 정적 할당 영역 : 크기가 변하지 않는다.

- 데이터 영역 (data segment)

  • 프로그램이 실행되는 동안 유지할 데이터(ex. 전역변수)가 저장되는 공간
  • 정적 할당 영역 : 크기가 변하지 않는다.

- 힙 영역 (heap segment)

  • 프로그래머가 직접 할당할 수 있는 저장 공간
  • 프로그래밍 과정에서 메모리 공간을 힙 영역에 할당했다면 사용 후에 해당 공간을 반환해야 한다.
  • 메모리 공간을 반환하지 않으면 메모리 누수(memory leak) 문제가 발생한다.
  • 메모리의 낮은 주소에서 높은 주소로 할당된다.

- 스택 영역 (stack segment)

  • 데이터를 일시적으로 저장하는 공간
  • 함수의 실행이 끝나면 사라지는 매개변수, 지역변수가 저장된다.
  • 일시적으로 저장할 데이터는 스택영역에 PUSH되고 더이상 필요하지 않은 데이터는 POP된다.
  • 메모리의 높은 주소에서 낮은주소로 할당된다.

2) 프로세스 상태와 계층 구조

(1) 프로세스 상태
: 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다.
- 생성 상태 (new)

  • 프로세스를 생성 중인 상태
  • 막 메모리에 적재되어 PCB를 할당받은 상태

- 준비 상태 (ready)

  • 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 준비 상태가 된다.
  • CPU를 할당받으면 실행할 수 있는 상태이지만 자신의 차례가 아니라 기다리고 있다.
  • 디스패치 (dispatch) : 준비 상태가 실행 상태로 전환되는 것

- 실행 상태 (running)

  • CPU를 할당받아 실행 중인 상태
  • 실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU를 사용할 수 있다.
  • 이때 프로세스가 할당된 시간을 모두 사용한다면(타이머 인터럽트가 발생) 준비 상태가 된다.
  • 실행 도중 입출력 장치를 사용하여 입출력장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.

- 대기 상태 (blocked)

  • 입출력 작업은 CPU에 비해 처리 속도가 느리기 때문에 입출력 작업을 요청한 프로세스는 입출력장치가 입출력을 끝낼 때까지(입출력 완료 인터럽트를 받을 때까지) 기다려야 한다.
  • 입출력장치의 작업을 기다리는 상태

- 종료 상태 (terminated)

  • 프로세스가 종료된 상태
  • 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.

- 프로세스 상태 다이어그램 (process state diagram)


 
(2) 프로세스 계층 구조


- 프로세스는 실행 도중 시스템호출을 통해 다른 프로세스를 생성할 수 있다.

  • 부모 프로세스 (parent process) : 새 프로세스를 생성한 프로세스
  • 자식 프로세스 (child process) : 부모 프로세스에 의해 생성된 프로세스

- 부모 프로세스와 자식 프로세스는 각기 다른 PID를 가진다.
- 많은 운영체제는 프로세스가 프로세스를 낳는 계층형 구조로 프로세스를 관리한다.
 
(3) 프로세스 생성 기법
- 시스템 호출: exec, fork
- fork

  • 자기 자신 프로세스의 복사본을 만드는 시스템 호출
  • 부모 프로세스의 자원들이 상속된다.

- exec

  • fork를 통해 만들어진 자식 프로세스를 새로운 프로그램으로 전환하는 시스템 호출
  • 코드 영역과 데이터영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화된다.

 

3) 스레드

(1) 프로세스와 스레드
- 단일 스레드 프로세스

  • 전통적인 관점에서 하나의 프로세스는 한 번에 하나의 일만을 처리한다.
  • 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스

- 스레드 : 프로세스를 구성하는 실행 단위

  • 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있다.
  • 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있다.
  • 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 ㅍ로세스 자원을 공유하며 실행된다.

- 리눅스

  • 프로세스와 스레드 모두 실행의 문맥(context of execution)이라는 점에서 동등하게 간주
  • 테스크(task)라는 이름으로 통일해 명명한다. 

 
(2) 멀티프로세스와 멀티스레드
- 멀티프로세스 (multiprocess) : 여러 프로세스를 동시에 실행
- 멀티스레드 (multithread) : 여러 스레드로 프로세스를 동시에 실행하는 것

  • 스레드들은 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가진 자원을 공유한다. → 메모리를 더욱 효율적으로 사용할 수 있다.
  • 스레드는 프로세스의 자원을 공유하기 때문에 서로 협력과 통신에 유리하다.
  • 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.

 
* 프로세스 간 통신 (IPC:Inter-Process Communication)
- 프로세스 간의 자원을 공유하고 데이터를 주고받는 것
- 같은 컴퓨터내의 서로 다른 프로세스나 스레드끼리데이터를 주고받는 것도 통신으로 간주한다.
- 공유 메모리(shared memory) : 프로세스들이 서로 공유할 수 있는 메모리 영역 
 
 

Chap11. CPU 스케줄링

1) CPU 스케줄링 (CPU scheduling)

: 운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것
 
(1) 프로세스 우선순위
- 프로세스 구분

  • 입출력 집중 프로세스 (I/O bound process)
    • 입출력 작업이 많은 프로세스
    • 실행 상태보다는 실행을 위한 대기 상태에 더 많이 머물게된다.
  • CPU 집중 프로세스 (CPU bound process)
    • CPU 작업이 많은 프로세스
    • 대기 상태보다 실행 상태에 더 많이 머무르게 된다.

-  프로세스는 CPU 버스트와 입출력 버스트를 반복하며 실행된다.

  • CPU 버스트 (CPU burst) : CPU를 이용하는 작업
  • 입출력 버스트 (I/O burst) : 입출력장치를 기다리는 작업

- 프로세스 우선순위

  • 상황, 프로세스의 중요도에 맞게 프로세스가 CPU를 이용할 수 있도록 하기 위해 운영체제는 프로세스마다 우선순위(priority)를 부여한다.
  • 운영체제는 각 프로세스의 PCB에 우선순윌ㄹ 명시하고, PCB에 적힌 우선순위를 기준으로 먼저 처리할 프로세스를 결정한다.

 
(2) 스케줄링 큐 (scheduling queue)
- 운영체제는 CPU를 사용하고 싶은 프로세스, 메모리에 적재되고 싶은 프로세스, 특정 입출력 장치를 사용하고 싶은 프로세스들을 모두 줄세운다. → 스케줄링 큐로 구현하고 관리
- 대표적인 큐

  • 준비 큐 (ready queue) : CPU를 사용하고 싶은 프로세스이 서는 줄
  • 대기 큐(waiting queue) : 입출력 장치를 사용하고 싶은 프로세스들이 서는 줄

 
(3) 선점형과 비선점형 스케줄링
- 선점형 스케줄링 (preemptive schdeduling)

  • 프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식
  • 어느 한 프로세스의 자원 독점을 막고 프로세스들에 골고루 자원을 배분할 수 있다.
  • 문맥 교환 과정에서 오버헤드가 발생할 수 있다.

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

  • 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까진 다른 프로세스가 끼어들 수 없는 스케줄링 방식
  • 문맥 교환에서 발생하는 오버헤드가 선점형 스케줄링보다 적다.
  • 모든 프로세스가 골고루 자원을 사용할 수 없다.

 

2) CPU 스케줄링 알고리즘

(1) 선입 선처리 스케줄링 (FCFS 스케줄링 ; First Come For Scheduling)
- 준비 큐에 삽입된 순서대로 프로세스를 처리하는 비선점형 스케줄링
- 호위 효과 (convey effect) : 때때로 프로세스들이 기다리는 시간이 매우 길어진다.
 
(2) 최단 작업 우선 스케줄링 (SJF 스케줄링 ; Shortest Job First Scheduling)
- 준비 큐에 삽입된 프로세스 중 CPU 이용 시간의 길이가 가장 짧은 프로세스부터 실행하는 스케줄링 방식
- 기본적으로 비선점형 스케줄링 알고리즘으로 분류되지만, 선점형으로 구현될 수 있다.
- 선점형 최단 작업 우선 스케줄링 : 최소 잔여 시간 우선 스케줄링
 
(3) 라운드 로빈 스케줄링 (round-robin scheduling)
- 선입 선처리 스케줄링 + 타임 슬라이스
- 타임 슬라이스

  • 각 프로세스가 CPU를 사용할 수 있는 정해진 시간
  • 크기가 매우 중요하다.

- 정해진 타임 슬라이스만큼의 시간 동안 돌아가며 CPU를 이용하는 선점형 스케줄링
-정해진 시간을 다 사용하였음에도 불구하고 아직 프로세스가 완료되지 않았다면 다시 큐의 맨 뒤에 삽입된다.
 
(4) 최소 잔여 시간 우선 스케줄링 (SRT(Shortest Remaining Time) 스케줄링)
- 최단 작업 우선 스케줄링 알고리즘 + 라운드 로빈 알고리즘
- 프로세스들은 정해진 타임 슬라이스만큼 CPU를 사용하되, CPU를 사용할 다음 프로세스로는 남아있는 작업 시간이 가장 적은 프로세스가 선택된다.
 
(5) 우선순위 스케줄링 (priority scheduling)
- 프로세스들에 우선순위를 부여하고, 우선순위가 가장 높은 프로세스부터 실행하는 스케줄링 알고리즘
- 우선순위가 같을 시 선입 선처리로 스케줄링된다.
- 기아 현상(starvation) 현상

  • 우선순위 스케줄링의 근본적인 문제
  • 우선순위가 높은 프로세스를 우선하여 처리하므로 우선순위가 낮은 프로세스는 (준비 큐에 먼저 삽입되었더라도) 우선순위가 높은 프로세스에 의해 계속 실행이 연기될 수 있다. 

- 에이징(aging)

  • 기아현상을 방지하는 대표적인 기법
  • 오랫동안 대기한 프로세스의 우선순위를 점차 높인다.

 
(6) 다단계 큐 스케줄링 (multilevel queue scheduling)
- 우선순위 스케줄링의 발전된 형태
- 우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식
- 우선순위가 가장 높은 큐에 있는프로세스를 먼저처리하고, 우선순위가 높은 큐가 비어 있으면 그 다음 우선순위에 있는 프로세스들을 처리한다.
- 프로세스 유형별로 우서순위를 구분하여 실행하는 것이 편리해진다. 
- 큐별로 타임 슬라이스를 여러 개 지정할 수 있고, 큐마다 다른 스케줄링 알고리즘을 사용할 수 있다.
 
(7) 다단계 피드백 큐 스케줄링 (multilevel feedback queue scheduling)
- 다단계 큐 스케줄링의 발전된 형태

  • 다단계 큐 스케줄링에서는 프로세스들이 큐 사이를 이동할 수 없다.
  • 우선순위가 낮은 큐는 계속 연기될 여지가 있다.  → 기아 현상

- 다단계 큐 스케줄링과 비슷하지만 프로세스들이 큐 사이를 이동할 수 있다.
- 만약 프로세스가 해당 큐에서 실행이 끝나지 않는다면 다음 우선순위 큐에 삽입되어 실행된다.
- CPU를 비교적 오래 사용해야 하는 CPU 집중 프로세스들은 자연스럽게 우선순위가 낮아지고, CPU를 비교적 적게 사용하는 입출력 집중 프로세스는 자연스레 우선순위가 높은 큐에서 실행이 끝난다.
- 에이징 기법을 적용해 기아 현상을 예방한다.
- 구현이 복잡하지만, 가장 일반적인 CPU 스케줄링 알고리즘으로 알려져 있다.


🤔느낀 점

프로세스 상태와 계층구조는 지난 학기 전공이었던 리눅스시스템으로 배웠던 내용이라 반가웠습니다!  CPU 스케줄링 방식은 들어본 것도 있었지만 전반적으로 새로운 내용이라 특히 집중해서 공부했던 것 같습니다.