본문 바로가기
  • 실행력이 모든걸 결정한다
IT 상식/CS

[CS] 운영체제 요약

by 김코더 김주역 2022. 11. 10.
반응형

1. 운영체제의 개념

1) 운영체제란?

- 사용자가 컴퓨터를 쉽게 다룰 수 있는 환경을 제공해주고 시스템 자원들을 효율적으로 관리해주는 소프트웨어

- 유사한 개념으로 펌웨어가 있다. 펌웨어는 특정 하드웨어 장치에 포함되어 하드웨어의 제어와 구동을 담당하는 일종의 운영체제로, 소프트웨어를 추가로 설치할 수 없다는 특징이 있다.

 

 

2) 운영체제의 역할

  • 편리한 User Interface(GUI, CUI) 제공
  • 효율적인 HW, SW 자원 관리
  • 프로세스 관리(스케쥴링)와 쓰레드 관리
  • 시스템 보호

※ GUI(Grapic User Interface) : 그래픽을 통해 작업

※ CLI(Command Line Interface) : 명령어를 통해 작업

 

 

3) 운영체제의 구조

깊은 순서대로 [하드웨어 -> 드라이버 -> Kernel -> System Call Interface -> Shell -> 응용 프로그램]이다. 여기서 드라이버 -> Kernel -> System Call Interface -> Shell 부분이 운영체제다.

 

(1) 드라이버

- 하드웨어를 제어한다.

 

(2) Kernel

- 운영체제의 핵심이 되는 프로그램들중 하나로 시스템의 모든 것을 통제한다.

※ 커널은 단일 구조, 계층 구조, 마이크로 커널 구조가 있다. 마이크로 커널 구조란 커널에 필수 기능만 포함하고 기타 기능은 사용자 영역에서 수행하는 구조이다.

 

(3) System Call Interface

- 운영체제가 제공하는 서비스에 대한 추상화 계층이며, 응용프로그램과 Kernel의 통로 역할을 한다. 이로써 컴퓨터 자원에 대한 직접 접근을 차단해준다.

※ modebit : System Call이 동작할 때 커널 모드(0)와 유저 모드(1)를 구분하기 위한 비트다. 유저 모드는 컴퓨터 자원에 함부로 침범하지 못하는 모드고, 커널 모드는 모든 컴퓨터 자원에 접근할 수 있는 모드다. 예를 들어, 파일 시스템의 파일에 접근할 때는 반드시 시스템콜을 통해 커널 모드로 들어가서 파일을 읽고 그 이후에는 유저 모드로 나와서 이후 로직을 수행한다.

 

(4) Shell

- Kernel을 감싸고 있는 층이며, 바로 위에 언급한 System Call Interface를 제공하는 역할을 한다.

 

 

 

2. 컴퓨터를 이루는 요소

1) CPU

- 중앙처리장치

- 메모리에 올라와 있는 프로세스(실행중인 프로그램)의 연산을 처리해준다.

- CU, Register, ALU로 구성된다.

  • CU(Control Unit) : 제어 장치라고 한다. 명령어를 해석해주고 데이터 처리 순서를 지시한다.
  • Register : CPU에 있는 매우 빠른 임시기억장치다.
  • ALU(Arithmetic Logic Unit) : 산술논리연산장치다. 말 그대로 산술 연산과 논리 연산을 계산한다.

- CPU의 동작 : CU가 메모리와 Register에 계산할 값을 로드하고 ALU에 계산을 명령한다. 계산된 값은 CU가 Register를 거쳐 메모리에 저장한다.

- 인터럽트 : CPU를 잠시 정지시키는 것이다. 인터럽트 간에는 우선순위가 있으며 핸들러 함수에 의해 처리된다. IO 장치에 의해 발생하는 하드웨어 인터럽트와 프로세스 오류 등에 의해 발생하는 소프트웨어 인터럽트(트랩)로 나뉜다.

 

 

2) DMA 컨트롤러

- IO 장치가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치

- 수많은 인터럽트 요청이 들어오는 CPU의 일을 부담해준다. 하나의 작업을 CPU와 DMA 컨트롤러가 동시에 하지는 않는다.

 

3) 메모리

- 데이터, 상태, 명령어 등을 기록하는 장치

 

4) 타이머

- 특정 프로그램에 시간 제한을 거는 장치

 

5) 디바이스 컨트롤러

- 컴퓨터와 연결되어 있는 IO 장치들을 제어하는 장치

 

 

 

3. 메모리

1) 메모리 계층

이미지 출처 : https://velog.io/@yu-jin-song/CS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B3%84%EC%B8%B5-%EA%B5%AC%EC%A1%B0

※ 메모리는 RAM, 주기억장치를 가리킨다.

※ 하드 디스크는 HDD, SDD같은 보조기억장치를 가리킨다.

 

(1) RAM

- 하드 디스크의 일부 데이터를 임시 저장해두고 필요할 때마다 CPU에 전달하는 장치

- 로딩 : 보조기억장치에 저장되어 있는 데이터를 RAM(주기억장치)에 올리는 것

 

(2) 캐시

- 데이터 접근 시간을 줄이기 위해 데이터를 저장해놓은 공간

- 공간 지역성과 시간 지역성을 고려해서 캐시에 저장할 데이터를 결정할 수 있다. 

※ 시간 지역성 : 최근 접근한 데이터에 연이어 다시 접근하려는 특성

※ 공간 지역성 : 최근 접근한 데이터의 가까운 공간에 다시 접근하려는 특성

- Cache Hit : 캐시에서 원하는 데이터를 찾은 경우

- Cache Miss : 캐시에 원하는 데이터가 없어서 메모리에서 직접 데이터를 찾아오는 경우

- 캐시 매핑 방식로는 직접 매핑, 연관 매핑, 직접연관 매핑이 있다.

  • 직접 매핑 : 메모리 주소와 캐시의 순서를 일치시키는 방법으로, 속도는 빠르지만 적중률은 낮다.
  • 연관 매핑 : 메모리 주소와 캐시의 순서를 일치시키지 않는 방법으로, 더 자주 사용될만한 데이터 위주로 저장할 수 있다. 속도는 느리지만 적중률은 높다.
  • 직접연관 매핑 : 일정 그룹 내에서 자유롭게 저장하는 방법이다. 속도와 적중률 모두 보통이다.

- 웹 브라우저의 캐시로는 쿠키와 세션이 있다. 쿠키는 캐시 데이터를 사용자의 컴퓨터에 저장하고, 세션은 서버에 저장한다는 차이점이 있다. 그리고 로컬 스토리지는 도메인 단위로 저장되며 웹 브라우저를 닫아도 유지되고, 세션 스토리지는 탭 단위로 저장된다.

※ 자바스크립트에서 쿠키를 함부로 볼 수 없도록 httponly 옵션을 거는 것이 중요하다.

 

 

2) 메모리 관리

- 컴퓨터의 한정된 메모리를 최대한 효율적으로 활용해야 하기 때문에 운영체제의 메모리 관리는 중요하다.

 

(1) 가상 메모리

- 보조기억장치의 일정 용량을 메모리처럼 활용함으로써 매우 큰 메모리처럼 보이게 하는 것

- 가상 메모리를 위한 가상 주소가 필요하며, MMU(Memory Management Unit)에 의해 가상 주소가 실제 주소로 변환된다.

- 가상 주소와 실제 주소의 매핑 정보는 페이지 테이블이 관리한다. 이 때 속도 향상을 위해 페이지 테이블의 캐시인 TLB를 사용한다.

- Page : 프로그램의 분할된 각 블록

- Page Frame : 메모리상에 있는 Page의 틀

- Swapping : 페이지를 RAM과 하드 디스크 간에 올리고 내리는 것

- Page Fault : RAM에 없는 데이터에 접근했을 경우에 발생하는 것이다. Page Fault가 발생하면 운영체제는 필요한 페이지를 메모리에 올려준다.

 

(2) Thrashing

- Page Fault의 빈도가 지나치게 높아져서 심각한 성능 저하를 초래하는 현상이다. 

- Thrashing을 방지하기 위한 다음과 같은 방법들이 있다.

  • Working Set : 최근에 참조한 Page들의 집합이다. 이를 사용하면 thrashing을 방지할 수 있다.
  • PFF(Page Fault Frequency) : Page Fault 빈도가 높을 때는 페이지 수를 증가시키고, 빈도가 낮을 때는 페이지 수를 감소시키는 방법

 

(3) 메모리 할당 기법

<1> 연속 할당

- 메모리에 연속적으로 공간을 할당하는 것

  • 고정 분할 방식 : 메모리를 미리 나누어 관리하는 방식으로, 내부 단편화가 발생할 수 있다.
  • 가변 분할 방식 : 메모리를 동적으로 나눠 사용하는 방식으로, 외부 단편화가 발생할 수 있다. 최초로 발견한 공간에 할당하는 최초적합, 할당 가능한 가장 작은 공간에 할당하는 최적적합, 할당 가능한 가장 큰 공간에 할당하는 최악적합 방식이 있다.

※ 내부 단편화 : 메모리를 나눈 공간에 비해 프로그램이 너무 작아서 생기는 남은 공간

※ 외부 단편화 : 메모리를 나눈 공간에 비해 프로그램이 커서 못들어가서 생기는 남은 공간

 

<2> 불연속 할당

- 메모리에 불연속적으로 공간을 할당하는 것

  • 페이징 : 프로그램을 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 할당하는 방법으로, Page의 공유 및 보호 과정이 복잡하다. 프로그램을 자르고 남은 부분에 대한 내부 단편화는 발생할 수 있음
  • 세그멘테이션 : 논리적 의미 단위인 세그먼트로 나누는 방법으로, 외부 단편화는 발생할 수 있음
  • 하이브리드 페이징 : 프로그램을 논리 단위의 세그먼트로 분할 후, 각 세그먼트를 다시 고정된 크기의 page로 분할하는 방법으로, 내부 단편화는 발생할 수 있음

- Locality : 일부 페이지만 집중적으로 참조하는 성질

 

(4) 페이지 교체 알고리즘

- 성능을 위해 스와핑 횟수를 줄이기 위한 알고리즘들이다.

  • 최적 교체 : 미래에 가장 오랫동안 참조되지 않을 Page를 교체하는 기법으로, 실현 불가능하다.
  • FIFO(First In First Out) : 가장 일찍온 Page를 교체하는 기법
  • LRU(Least Recently Used) : 가장 오랫동안 참조되지 않은 Page를 교체하는 기법
  • NUR(Not Used Recently) : 최근에 사용되지 않는 Page를 교체하는 기법으로, 각 페이지마다 계수기를 두어야 하는 LRU의 단점을 개선한 기법이다. 최근 참조 여부를 비트로 나타내어 일정 시간마다 비트를 초기화시켜준다.
  • LFU(Least Frequently Used) : 가장 적게 사용된 페이지를 교체하는 기법

 

 

 

4. 프로세스와 쓰레드

- 프로그램 : 컴퓨터가 실행할 수 있는 파일

- 프로세스 : 인스턴스화되어 실행중인 프로그램으로, CPU 스케쥴링의 대상이 되는 작업이다.

- 쓰레드 : 프로세스 내부에 존재하는 최소 작업 단위로, 프로세스의 자원을 제어할 수 있다.

 

1) 컴파일

(1) 컴파일이란?

- 컴파일러가 의해 컴퓨터가 이해할 수 있는 기계어로 번역하는 과정

- 프로그램은 컴파일을 통해 실행할 수 있는 파일이 된 것이다.

 

(2) 컴파일 과정

i) 전처리 : 소스 코드의 주석을 제거하는 등 본격적인 컴파일의 준비 과정

ii) 컴파일러 : 오류 처리, 코드 최적화, 어셈블리어로 변환

iii) 어셈블러 : 목적 코드로 변환

iv) 링커 : 실행 파일(exe, out)을 생성

 

 

2) 프로세스의 상태

(1) Created

- 프로세스가 생성된 상태

- fork() : 새로운 주소 공간에 자식 프로세스를 생성

- exec() : 주소 공간을 덮어써서 새로운 프로세스를 생성

 

(2) Ready

- 자원은 준비되었고 CPU가 할당 해주기만을 기다리고 있는 상태

 

(3) Suspended Ready

- Ready 상태에서 메모리 부족으로 일시 중단된 상태

 

(4) Running

- 프로세서와 자원을 모두 할당 받은 상태

 

(5) Blocked

- 인터럽트 등으로 프로세스가 중단된 상태

 

(6) Suspended Blocked

- Blocked 상태에서 메모리 부족으로 일시 중단된 상태

 

(7) Terminated

- 프로세스 수행이 종료된 상태

- 모든 자원을 반납

 

 

3) 프로세스 메모리 구조

 

메모리는 크게 정적 영역과 동적 영역으로 나뉜다.

 

정적 영역

  • CODE 영역 : 함수, 제어문, 상수같은 소스 코드에 해당
  • DATA 영역 : 초기화된 전역변수, 정적변수에 해당
  • BSS(Blocked Stated Symbol) 영역 : 초기화가 안된 전역변수가 해당

 

동적 영역

  • HEAP 영역 : 동적 배열에 사용되며 런타임 시 크기가 결정된다. 낮은 메모리 영역에서 높은 메모리 영역으로 채워진다.
  • STACK 영역 : 지역변수, 함수 호출, 매개변수가 해당되며 컴파일 시에 크기가 결정된다. 높은 메모리 영역에서 낮은 메모리 영역으로 채워진다.

 

 

4) PCB(Process Control Block)

(1) PCB란?

- 프로세스에 대한 메타데이터를 저장한 블록으로, 프로세스가 생성될 때 같이 생성된다.

- 중요한 정보이기 때문에 커널 스택의 가장 앞부분에서 관리된다.

 

(2) PCB가 관리하는 정보

  • PID : 프로세스 고유 식별 번호
  • 스케쥴링 정보
  • 레지스터 정보
  • 프로세스 상태 정보
  • 메모리 관리 정보
  • 입출력 상태 정보
  • 문맥 저장 영역
  • 계정 정보 : 자원 사용 시간 등

 

(3) Context Switching

- 프로세스(PCB)를 교체하는 과정

- CPU가 동시에 처리할 수 있는 프로세스의 수는 적기 때문에 수많은 Context Switching이 필요하다.

- 만약에, A 프로세스에서 B 프로세스로 교체되는 경우에는 A 프로세스에 대한 PCB를 저장해두고 B 프로세스에 대한 PCB를 로드해서 참조한다.

- Cache Miss Overhead : Context Switching이 발생할 때마다 캐시 메모리를 초기화하기 때문에 캐시미스가 자주 발생할 수 있으며, 이에 따른 오버헤드가 존재한다.

- 쓰레드는 프로세스 내에서 스택 영역을 제외한 모든 메모리를 공유하기 때문에 캐시를 완전히 리셋해줄 필요가 없다. 따라서 쓰레드에서 발생하는 Context Switching은 비용과 시간이 더 적게 든다.

 

 

5) 멀티 프로세싱

- 말 그대로 여러 프로세스를 통해 하나 이상의 작업을 동시에 수행하는 방법이다.

- 특정 프로세스에 문제가 발생되어도 다른 프로세스가 대체할 수 있다는 장점이 있다.

- 웹 브라우저도 멀티프로세스 구조를 갖는다.

- IPC(Inter Process Communication) : 프로세스 간 통신을 뜻하며, 그 종류로는 다음과 같은 것들이 있다.

  • 공유 메모리 : 공유 버퍼를 통해 프로세스가 서로 통신할 수 있다. 하드웨어 관점에서는 RAM을 가리키기도 한다.
  • 파일 : 디스크 또는 파일 서버에 있는 데이터
  • 소켓 : 네트워크를 경유하는 프로세스 간 통신의 종착점이다. TCP 또는 UDP로 통신할 수 있다.
  • 익명 파이프 : FIFO 방식의 단방향 파이프 기반으로 데이터를 주고 받는 방식이다. 부모-자식 프로세스 간에만 사용할 수 있으며 다른 네트워크상에서는 사용할 수 없다.
  • 명명된 파이프 : 파이프 서버와 하나 이상의 파이프 클라이언트로 구성되어 있다. 여러 파이프를 동시에 사용할 수 있고, 다른 네트워크상에서도 사용할 수 있다.
  • 메시지 큐 : 메시지를 큐로 관리하는 방식이다. 사용이 간편하다는 장점이 있고, 커널에서 전역적으로 관리된다.

 

 

6) 멀티쓰레딩

- 프로세스의 작업을 여러 개의 쓰레드로 처리하는 방법이다.

- 쓰레드끼리 프로세스의 자원을 공유하기 때문에 효율적이다.

- 한 쓰레드에 문제가 생기면 다른 쓰레드에도 영향을 끼쳐 프로세스에 영향을 줄 수 있다.

- 동시성 : 여러 스레드가 번갈아가면서 실행되어 동시에 실행되는 것처럼 보이는 성질

- 웹 브라우저의 각 프로세스의 내부에도 여러 개의 스레드가 존재한다.

 

 

7) 공유 자원과 임계 영역

(1) 공유 자원과 Race Condition

- 공유 자원 : 각 프로세스와 쓰레드가 함께 접근할 수 있는 자원

- Race Condition : 공유 자원을 여러 프로세스가 동시에 사용함으로써 결과값이 깨질 수 있는 상태

 

(2) 임계 영역(Critical Section)

- 공유 자원에 접근할 때 결과가 달라질 수 있는 영역

- 임계 영역에 락을 걸고 다음 조건들을 만족시키면 임계 영역을 해결할 수 있다.

  • 상호 배제 : 한 프로세스가 임계 영역에 들어가있다면 다른 프로세스는 들어갈 수 없다.
  • 한정 대기 : 영원히 임계 영역에 못들어갈 수는 없어야 한다.
  • 융통성 : 다른 프로세스의 일을 방해하면 안된다.

- 임계 영역을 해결하기 위한 방법으로는 다음과 같은 것들이 있다.

  • Mutex : 잠금 또는 잠금 해제라는 하나의 상태만 가지는 잠금이다. 동기화 대상이 하나일 때 사용한다.
  • Semaphore : 정수 값과 wait(P), signal(V) 함수로 공유 자원에 대한 접근을 다룬다. 동기화 대상이 하나 이상일 때 사용한다. 세마포어의 종류로는 0과 1의 값만 가지는 binary semaphore와 0 이상의 값을 가질 수 있는 counting semaphore가 있다.
  • Monitor : 공유 자원을 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공하는 방법으로, 내부적으로 모니터 큐를 사용한다. Semaphore과 달리 상호 배제가 자동으로 이루어진다.

 

8) Deadlock

- 2개 이상의 프로세스들이 서로의 자원을 기다리며 중단 중인 상태

- 교착 상태의 원인

  • 상호 배제 : 다른 프로세스의 자원에 접근 불가
  • 점유 대기 : 리소스를 점유하고 있으면서 다른 리소스를 대기
  • 비선점 : 다른프로세스의 자원을 강제적으로 가져올 수 없음
  • 환형 대기 : 서로가 서로의 자원을 대기

- 교착 상태의 해결 방법

  • 위의 4가지 교착 상태의 원인이 성립되지 않도록 설계
  • 교착 상태의 가능성이 없을 때만 자원을 할당 - 예) 은행원 알고리즘, Habermann 알고리즘
  • 교착 상태 사이클에 관련된 프로세스를 하나씩 종료
  • 작업 종료 (현대 운영체제가 선택한 방식)

※ 은행원 알고리즘 : 프로세스별 추가 할당 가능한 자원의 수를 따져가며 안전 할당 순서를 탐색

 

 

 

5. CPU 스케쥴링 알고리즘

- CPU 스케쥴러는 CPU 스케쥴링 알고리즘에 따라 어떤 프로세스에 CPU 소유권을 줄 것인지 결정한다.

 

1) 비선점형 알고리즘

- 프로세스가 CPU 스케쥴링 알고리즘에 따라 스스로 CPU 소유권을 포기할 수 있는 방식이다. 강제로 프로세스를 중지하는 것이 아니다.

 

(1) FCFS(First Come First Served)

- 먼저 온 프로세스 순서대로 처리하는 방식

 

(2) SJF(Shortest Job First)

- 실행 시간이 가장 짧은 프로세스 순서대로 실행하는 방식

- 기아(starvation) 현상이 일어날 수 있다.

※ starvation : 우선 순위가 낮은 작업은 영원히 처리되지 않는 현상이다. 오래된 작업일수록 우선순위를 높이는 에이징(aging)을 통해 극복 가능하다.

 

(3) HRN(Highest Response-ratio Next)

- SJF 기법에서 대기 시간을 추가로 고려하는 방식

 

 

2) 선점형 알고리즘

- CPU 스케쥴링 알고리즘에 따라 현재 사용중인 프로세스의 CPU 소유권을 강제로 박탈할 수 있는 방식이다.

- 현대 운영체제가 사용하는 방식이다.

 

(1) RR(Round Robin)

- 각 프로세스에 동일한 할당 시간을 부여하고, 돌아가면서 CPU 소유권을 부여하는 방식이다.

- 할당 시간이 너무 크면 FCFS가 되고, 너무 짧으면 context switching이 잦아져서 성능이 안좋아진다.

 

(2) SRF(Shortest Remaining Time First)

- SJF와 동일하게 실행 시간이 가장 짧은 프로세스 순서대로 실행하는 방식인데, 중간에 실행 시간이 더 짧은 프로세스가 들어오면 기존 프로세스를 중지하고 해당 프로세스를 수행한다는 차이점이 있다.

 

(3) 다단계 큐

- 우선 순위에 따른 여러 개의 준비 큐를 사용하는 방식이다. 큐마다 FCFS나 RR 등 여러 스케쥴링 알고리즘을 적용할 수 있다.

 

 

반응형

'IT 상식 > CS' 카테고리의 다른 글

[CS] 자료구조 요약  (0) 2022.11.26
[CS] 데이터베이스 요약  (0) 2022.11.20
[CS] 네트워크 요약  (0) 2022.11.06
[CS] 디자인 패턴과 프로그래밍 체계 요약  (0) 2022.11.01
[CS] 면접 기타 예상 질문  (0) 2021.06.11

댓글