[CS지식] 운영체제

5tr1ker·2023년 1월 20일
0

CS 지식

목록 보기
4/6
post-thumbnail

운영체제

사용자가 컴퓨터를 쉽게 다룰 수 있게 해주는 인터페이스로 한정된 메모리나 시스템 자원을 효율적으로 분배해 주며 다음과 같은 역할을 합니다

  • CPU 스케쥴링과 프로세스 관리 : CPU 소유권을 어떤 프로세스에 할당할지 관리하며 프로세스를 생성 , 삭제하는 역할을 합니다.
  • 메모리 관리 : 한정된 메모리를 어떤 프로세스에 얼마나 할당할지 관리합니다.
  • 디스크 파일 관리 : 디스크에 파일을 어떻게 보관할지 관리합니다.
  • I/O 디바이스 관리 : I/O 디바이스들인 키보드 , 마우스와 컴퓨터간의 데이터를 주고 받는것을 관리합니다.

운영체제의 구조

유저 프로그램이 맨위에 있고 그 다음 순서대로 GUI , 시스템콜 , 커널 , 드라이버 , 하드웨어가 존재합니다. 여기서 GUI와 시스템콜 , 커널 , 드러이버가 운영체제를 지칭합니다.

시스템콜

운영체제가 커널에 접근하기 위한 인터페이스이며 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할 때 사용합니다. 예를들어 유저 프로그램에서 파일 입출력을 할때 유저 모드에서 파일을 읽지 않고 커널 모드로 들어가 파일을 읽고 다시 유저 모드로 돌아가 나머지 유저 프로그램의 로직을 실행합니다. 이 과정으로 컴퓨터 자원에 대한 직접 접근을 차단할 수 있고 , 다른 프로그램으로 부터 보호할 수 있습니다.

modebit

시스템 콜이 작동될 때 modebit를 이용해 유저모드인지 커널모드인지 구분을 합니다. modebit는 1 또는 0의 값을 가지는 플래그 변수입니다.

컴퓨터의 요소

CPU

CPU는 산술논리연산장치 , 제어장치 , 레지스터로 구성되어 있는 컴퓨터 장치로 , 인터럽트에 의해 단순히 메모리에 존재하는 명령어를 해석하여 실행하는 장치입니다.

  • 제어장치 ( CU ) : 프로세스 조작을 지시하는 부품으로 , 명령어를 읽고 해석하며 데이터를 처리하기 위한 순서를 결정합니다.
  • 레지스터 : CPU 안에 있는 매우 빠른 임시기억장치로 CPU와 직접 연결되어있어 연산 속도가 메모리보다 매우 빠릅니다. CPU는 자체적으로 데이터를 저장할 수 없어 레지스터를 거쳐 데이터를 전달합니다.
  • 산술논리연산장치 ( ALU ) : 덧셈 , 뺄셈 같은 산술 연산과 , 배타적 논리합 , 논리곱 같은 논리 연산을 계산하는 디지털 회로입니다.

CPU의 연산처리

제어장치가 계산할 값을 메모리와 레지스터에 로드합니다. 그 다음 제어장치가 레지스터에 있는 값을 계산하라고 산술논리장치에게 명령을 합니다. 제어장치가 계산된 값을 다시 레지스터에서 메모리로 계산된 값을 저장합니다.

인터럽트

어떤 신호가 들어왔을 때 CPU를 잠깐 정지시키는 것을 말합니다. 키보드나 마우스 등 IO디바이스에 의한 인터럽트나 0으로 나누는 산술 연산에서의 인터럽트 , 프로세스 오류 등으로 발생합니다. 인터럽트가 발생하면 인터럽트 핸들러 함수가 모여 있는 인터럽트 벡터로 가서 인터럽트 핸들러 함수를 실행합니다. 인터럽트 간에는 우선순위가 있고 , 우선순위에 따라 실행되며 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉩니다.

하드웨어 인터럽트

키보드를 연결하거나 마우스를 연결하는 등 IO 디바이스에서 발생하는 인터럽트입니다.

소프트웨어 인터럽트

트랩(trap)이라고도 하며 , 프로세스 오류 등 프로세스가 시스템콜을 호출할 때 발생합니다.

DMA 컨트롤러

I/O 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치로 , CPU에 너무 많은 인터럽트 요청으로 인한 CPU 부하가 발생할 수 있는 것을 막아주며 , CPU의 일을 부담하는 컨트롤러입니다.

메모리

전자회로에서 데이터나 상태, 명령어를 기록하는 장치이며 보통 RAM을 일컬어 메모리라 부릅니다. CPU는 계산을 담당하고 메모리는 기억을 담당합니다.

메모리 계층

메모리 계층은 레지스터 , 캐시 , 메모리 , 저장장치로 구성되어 있습니다.

  • 레지스터 : CPU 안에 있는 매우 빠른 임시기억장치입니다.
  • 캐시 : L1 , L2 캐시를 지칭합니다.
  • 주기억장치 : 메모리인 RAM을 지칭합니다.
  • 보조기억장치 : SSD , HDD 를 말합니다.

계층이 위로 올라갈수록 가격은 비싸지는데 용량은 작아지고 속도가 빨라지는 특징이 있습니다. 계층을 둔 이유는 경제성과 캐시때문입니다.

캐시

캐시는 데이터를 미리 복사해 놓는 임시 저장소이며 빠른 장치와 느린 장치사이에 속도 차이로 인한 병목 현상을 줄이기 위한 메모리입니다. 실제로 메모리와 CPU 사이의 속도 차이가 크기 때문에 중간에 레지스터 계층을 두어 속도 차이를 해결합니다. 이렇게 속도 차이를 해결하기 위해 계층과 계층사이에 있는 계층을 캐싱 계층이라고 합니다.

지역성의 원리

캐시 계층을 두는 것 말고 캐시를 직접 설정할 때가 있는데 , 자주 사용하는 데이터를 기반으로 설정합니다. 자주 사용하는 데이터에 대한 근거는 시간 지역성과 공간 지역성으로 나뉩니다.

시간 지역성

최근 사용한 데이터에 다시 접근하려는 특성을 말합니다.

공간 지역성

최근 접근한 데이터의 주변이나 가까운 지역에 접근하는 특징을 말합니다.

캐시 히트와 캐시 미스

캐시에서 원하는 데이터를 찾았다면 캐시히트라고 하며 , 해당 데이터가 캐시에 없다면 주 메모리로 가서 데이터를 찾는 것을 캐시 미스라고 합니다. 캐시 히트를 하게되면 제어장치를 통해 가져오는데 위치가 가깝기 때문에 빠릅니다. 하지만 캐시 미스같은 경우 메모리에서 가져와야 하기 때문에 느립니다.

웹 브라우저에서의 캐시

쿠키

만료기간이 있는 키-값 저장소입니다. 쿠키를 설정할 때 스크립트로 조회할 수 없게 httponly 옵션을 거는 것이 중요하며, 클라이언트 또는 서버에서 만료기한 등을 정할 수 있으며 보통 서버에서 만료기간을 정합니다.

로컬 스토리지

만료기한이 없는 키-값 저장소입니다. 웹 브라우저를 닫아도 유지되고 도메인 단위로 저장 , 생성됩니다. HTML5를 지원하지 않는 웹 브라우저에서는 사용할 수 없으며 클라이언트에서만 수정 가능합니다.

세션 스토리지

만료기한이 없는 키-값 저장소입니다. 탭 단위로 세션 스토리지를 생성하며, 탭을 닫을 때 해당 데이터가 삭제됩니다. HTML5를 지원하지 않는 웹 브라우저에서는 사용할 수 없으며 , 클라이언트에서만 수정할 수 있습니다.

가상 메모리

컴퓨터가 실제로 사용 가능한 메모리 자원을 추상화하여 사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말합니다. 이때 가상적으로 주어진 메모리를 가상 주소 ( logical address ) 라고하며 , 실제 메모리상에 있는 주소를 실제 주소 ( physical address ) 라고 합니다. 가상주소는 메모리관리장치( MMU ) 에 의해 실제 주소로 변환됩니다. 프로세스 주소 정보는 페이지 테이블에 관리됩니다.

TLB

페이지 테이블에 있는 리스트를 보관하며 CPU가 페이지 테이블까지 가지않도록 해 속도를 향상시킬 수 있는 캐시 계층입니다.

스와핑

가상 메모리에 존재하지만 실제 메모리인 RAM에 없는 데이터를 가지고 올때 페이지 폴트가 발생하는데, 이때 메모리에서 사용하지 않는 데이터를 하드디스크에 저장하고 , 해당 데이터를 불러오는 것을 말합니다.

페이지 폴트

프로세스 주소 공간엔 존재하지만 RAM에는 없는 데이터에 접근할 때 발생합니다. 페이지 폴드가 발생했을 때 먼저 CPU는 물리 메모리 공간을 확인해 해당 페이지가 없으면 트랩을 발생시켜 CPU의 동작을 일시 정지 시킵니다. 그 다음 운영체제가 가상 메모리와 물리 메모리에 페이지가 존재하는지 확인하고 없다면 스위핑을 합니다. 그런다음 페이지를 불러오고 페이지 테이블을 최산화 하여 CPU를 재개합니다.

스레싱

메모리의 페이지 폴트율이 높은 것을 의미하며 , 컴퓨터의 심각한 성능 저하를 발생시킵니다. 페이지 폴트가 발생하면 CPU 이용률이 낮아지게 되고 운영체제는 가용성을 위해 더 많은 프로세스를 메모리에 올리되는 악순환이 반복됩니다. 이를 해결하기위해 지역성의 원리를 통해 미리 메모리를 로드하는 작업 세트와 페이지 폴트 빈도를 상한선과 하한선으로 조절하는 PFF가 있습니다.

메모리 할당

연속 할당

메모리를 순차적으로 공간에 할당하는 것을 말합니다.

고정 분할 방식

메모리를 미리 나누어 관리하는 방식으로 , 미리 나누어져 있기 때문에 융통성이 없으며 내부 단편화가 발생합니다.

내부 단편화 : 메모리를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 현상

가변 분할 방식

매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용하며 , 외부 단편화가 발생할 수 있습니다. 가변 분할 방식의 종류로는 밑의 세가지가 있습니다.

  • 최초 적합 : 외쪽에서 아래쪽으로 순차적으로 시작해 크기에 맞는 첫번째 빈공간을 찾으면 할당합니다.
  • 최적 적합 : 프로세스의 크기보다 크고 차이가 가장 작은 빈공간에 할당합니다.
  • 최악 적합 : 프로세스의 크기보다 크고 차이가 가장 큰 빈공간에 할당합니다.

외부 단편화 : 메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 현상

불연속 할당

메모리를 비연속적으로 할당하며 현대 운영체제가 사용하는 방법입니다. 메모리를 동일한 크기의 페이지로 나누고 프로그램마다 페이지 테이블을 두어 이를 통해 메모리에 프로그램을 할당하는 것입니다.

페이징

동일한 크기의 페이지로 나누어 메모리를 서로 다른위치에 할당합니다. 홀의 크기가 균일하지만 주소 변환이 복잡해집니다.

세그멘테이션

페이지 단위가 아니라 의미 단위인 세그먼트로 나누는 방식입니다. 공유와 보안 측면에서 좋지만 홀의 크기가 균일하지 않습니다.

페이지드 세그멘테이션

공유나 보안을 의미 단위인 세그먼트로 나누고 , 물리적 메모리는 페이지로 나누는 것을 말합니다.

페이지 교체 알고리즘

오프라인 알고리즘

먼 미래에 참조되는 페이지를 현재 페이지와 바꾸는 것을 말합니다. 불가능한 방법이지만 다른 알고리즘과 성능 비교를 위해 사용합니다.

FIFO ( First in First out )

가장 먼저온 페이지를 교체 대상으로 놓는 방법을 의미합니다.

LRU ( Least Recently used )

참조가 가장 오래된 페이지를 바꿉니다. 오래된 것을 파악하기 위해 페이지마다 계수기와 스택을 두어야 하는 문제점이 있습니다.

NUR ( Not Used Recently )

일명 clock 알고리즘이며 0과 1 비트를 사용해서 가장 오래된 페이지를 찾습니다. 시계 방향으로 돌면서 참조되지 않은 비트인 0을 찾으면 해당 프로세스를 교체합니다.

LFU ( Least Frequently Used )

참조가 가장 적은 페이지를 교체합니다.

프로세스

프로세스는 컴퓨터에서 실행되고 있는 프로그램을 말하며 CPU 스케줄링의 대상이 되는 작업입니다. 프로세스 내부에는 최소 한개의 스레드가 있는데 , 스레드 단위로 스케줄링합니다.

프로세스의 상태

생성 상태 ( create )

프로세스가 생성된 상태이며 PCB가 할당됩니다.

대기 상태 ( ready )

메모리 공간이 충분하다면 할당받고 아니면 대기하고 있으며 CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태입니다.

실행 상태 ( running )

CPU 소유권과 메모리를 할당받고 인스트럭션을 수행중인 상태입니다. 이를 CPU burst가 일어났다고도 표현합니다.

중단 상태 ( blocked )

어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태입니다.

종료 상태 ( terminated )

메모리와 CPU 소유권을 모두 내려놓고 가는 상태입니다.

프로세스의 메모리 구조

스택

지역변수 , 매개변수 , 함수가 저장되고 컴파일 시 크기가 결정되며 동적인 특징을 갖습니다. 스택 영역에서 함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 늘어날 수 있는데 , 이때 스택과 힙의 메모리 영역이 겹치면 안되기 때문에 사이 공간을 비워놓습니다.

동적 할당할 때 사용되며 런타임 시 크기가 결정되고 동적인 특징을 가집니다.

데이터 영역

전역변수와 정적 변수가 저장되고 초기화 되지 않은 변수가 0으로 초기화되어 저장되는 BSS 영역과 0이 아닌 다른 값으로 할당된 변수가 저장되는 Data 영역으로 나뉩니다.

코드 영역

프로그램에 내장되어 있는 소스 코드가 들어가는 영역이고 수정 불가능한 기계어로 저장되어 있으며 정적인 특징을 갖습니다.

PCB

운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터를 말하며, 프로세스가 생성되면 운영체제는 해당 PCB를 생성합니다. 프로세스가 생성되면 프로세스의 주소 값들이 메모리 구조를 기반으로 할당되며 , 메타데이터들은 PCB에 저장됩니다. 이는 프로세스의 중요한 정보를 가지고 있어 사용자가 접근하지 못하는 커널 스택 앞부분에 저장됩니다.

컨텍스트 스위칭 ( 문맥 교환 )

PCB를 교환하는 과정으로 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생됩니다. 컨텍스트 스위칭이 일어날 때 마다 유휴 시간이 발생하며 , 이뿐만 아니라 캐시미스라는 비용도 발생합니다.

캐시 미스

프로세스가 가지고 있는 메모리 주소가 그대로 그대로 있으면 잘못된 주소 변환이 생기며 , 캐시클리어 과정을 하게 되는것을 말합니다.

멀티프로세싱

여러개의 프로세스로 동시에 두 가지 이상의 일을 수행할 수 있는 것을 말하며 , 프로세스나 메모리중 일부에 문제가 발생해도 다른 프로세스를 이용해 처리할 수 있어 신뢰성이 높은 강점이 있습니다.

IPC

프로세스간의 데이터를 주고받고 공유 데이터를 관리하는 메커니즘을 말합니다. IPC 의 종류로는 공유 메모리 , 파일 , 소켓 , 파이프 , 메세지 큐가 있으며 메모리가 완전히 공유되는 스레드보다는 속도가 떨어집니다.

  • 공유메모리 : 여러 프로세스가 동일한 메모리 블록에 접근할 수 있으며 , 서로 통신할 수 있도록 공유 버퍼를 생성하는 것을 말합니다. 메모리를 공유하기 때문에 오버헤드가 발생하지 않아 가장 빠르지만 , 동기화가 필요합니다.
  • 파일 : 디스크에 저장된 데이터나 , 파일 서버에서 제공한 데이터를 말하며 이를 기반으로 프로세스간 통신을 합니다.
  • 소켓 : 네트워크 인터페이스를 기반으로 통신하는 데이터로 TCP , UDP가 있습니다.
  • 익명 파이프 : 프로세스간 FIFO 방식의 단 방향 파이프를 기반으로 데이터를 주고받으며 , 부모와 자식 프로세스간에만 사용할 수 있습니다.
  • 명명된 파이프 : 하나의 파이프 서버와 하나 이상의 파이프 클라이언트간의 통신을 위한 파이프이며 여러 파이프를 동시에 사용할 수 있습니다. 다른 네트워크상의 컴퓨터와 통신할 수 있습니다.
  • 메시지 큐 : 메시지를 큐 데이터 구조 형태로 관리하는 것을 말합니다. 다른 IPC 방식에 비해 가장 직관적입니다. 공유 메모리로 구현할 때 동기화 때문에 기능 구현이 복잡해 지는데 , 대안으로 메시지 큐를 사용합니다.

스레드

프로세스의 실행 가능한 가장 작은 단위로 , 프로세스는 여러 스레드를 가질 수 있습니다. 코드 힙, 스택, 데이터를 각자 생성하는 프로세스와 달리 , 스레드는 스택을 제외한 모든 영역을 공유합니다.

멀티스레딩

프로세스 내 작업을 여러 스레드로 처리하는 기법이며 스레드는 서로 자원을 공유하기 때문에 효율성과 동시성이 높습니다. 하지만 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어진 프로세스에 영향을 줄 수 있습니다.

공유자원

각 프로세스나 스레드가 함께 접근할 수 있는 자원이나 변수를 의미하며 , 이 공유자원을 두 개 이상의 프로세스가 읽거나 쓰는 상황을 경쟁 상태 ( Race Condition ) 라고 합니다. 접근의 타이밍이나 순서가 결과값에 영향을 미칠 수 있습니다.

임계영역

둘 이상의 프로세스나 스레드가 접근순서에 따라 결과가 달라지는 코드 영역을 말하며 임계 영역을 해결하기 위해 뮤텍스 , 세마포어 , 모니터가 있으며 이 방법들은 상호 배제 , 한정 대기 , 융통성을 만족합니다.

  • 상호 대기 : 한 프로세스가 임계영역에 들어가 있다면 다른 프로세스는 들어갈 수 없습니다.
  • 한정 대기 : 한 프로세스가 영원히 임계영역에 들어가지 못해선 안됩니다.
  • 융통성 : 한 프로세스가 다른 프로세스를 방해하면 안됩니다.

뮤텍스

공유 자원을 lock을 통해 잠금 설정하고 사용한 후 unlock을 통해 잠금 해제하는 방식입니다. 잠금 설정하면 다른 프로세스나 스레드가 접근할 수 없으며 잠금 해제되면 접근할 수 있습니다.

세마포어

일반화된 뮤텍스로 간단한 정수와 wait 함수와 signal 함수로 공유 자원의 접근을 처리합니다. wait 함수는 자신의 차례가 올 때까지 기다리는 함수이며 , signal 함수는 다음 프로세스에게 순서를 넘겨주는 함수입니다. 이때 0과 1의 값만 가지는 바이너리 세마포어와 여러 자원에 대한 접근을 제어하는 카운팅 세마포어가 있습니다.

바이너리 세마포어는 일반 뮤텍스와 비슷하지만 뮤틱스는 잠금 매커니즘이고 세마포어는 신호 매커니즘입니다.

모니터

공유자원에 안전하게 접근할 수 있게 공유 자원을 숨기고 접근에 대한 인터페이스를 제공하며 모니터 큐를 통해 공유 자원의 작업을 순차적으로 처리합니다. 세마포어보다 구현하기 쉬우며 상호배제가 자동으로 됩니다.

교착 상태

두 개 이상의 프로세스들이 서로 가진 자원을 기다리며 중단된 상태입니다.

교착 상태의 원인

  • 상호 배제 : 한 프로세스가 자원을 독점하고 있으며 다른 프로세스는 접근할 수 없습니다.
  • 점유 대기 : 특정 프로세스가 점유한 자원을 다른 프로세스가 요청한 상태입니다.
  • 비선점 : 다른 프로세스의 자원을 강제로 가져올 수 없습니다.
  • 환형 대기 : 서로가 서로의 자원을 요구하는 상황입니다.

교착 상태의 해결 방법

현대 운영체제는 교착 상태가 발생하기 드물며 , 이를 처리하는 비용이 더 커서 사용자가 작업을 종료하는 방법을 사용하고 있습니다.

CPU 스케줄링 알고리즘

비선점형 방식

스스로 CPU 소유권을 포기하는 방식이며 , 강제로 프로세스를 중지하지 않습니다. 따라서 컨텍스트 스위칭으로 인한 부하가 적습니다.

FCFS ( First Come , First Served )

가장 먼저 온 것을 가장 먼저 처리하는 알고리즘입니다. 길게 수행되는 프로세스때문에 준비 큐에서 오래 기다리는 현상인 Convoy effect 가 발생하는 단점이 있습니다.

SJF ( Shortest job First )

실행시간이 가장 짧은 프로세스를 먼저 실행하는 알고리즘입니다. 긴 시간을 가진 프로세스가 실행되지 않은 Starvation 현상이 일어나며 평균 대기시간이 가장 짧습니다. 하지만 실제 실행 시간을 알 수 없기 때문에 과거 이력을 토대로 추측합니다.

우선순위

SJF에서 긴 시간을 가진 프로세스는 실행되지 않는 단점을 개선한 알고리즘으로, 오래된 작업일 수록 우선순위를 높이는 방법인 aging을 이용합니다.

선점형 방식

현대 운영체제가 사용하며 사용중인 프로세스를 강제 중지하고 다른 프로세스에게 CPU 소유권을 할당하는 방식입니다.

라운드 로빈 ( RR , Round Robin )

현대 컴퓨터가 쓰는 우선순위 스케줄링의 일종으로 각 프로세스마다 동일한 시간을 주고 그 시간안에 끝나지 않으면 다시 준비 큐의 뒤로 가는 알고리즘입니다. 일반적으로 전체 작업 시간은 길어지지만 평균 응답 시간은 짧아지는 특징이 있습니다.

SRF

SJF 와 비슷하지만 중간에 더 짧은 작업이 들어오면 수행중인 작업을 중지하고 해당 프로세스를 수행합니다.

다단계 큐

우선순위에 따른 준비 큐를 여러 개 준비하고 , 큐마다 다른 스케줄링 알고리즘을 사용합니다. 큐 간의 프로세스 이동이 되지않아 스케줄링 부담이 적지만 유연성이 떨어집니다.

profile
https://github.com/5tr1ker

0개의 댓글