운영체제(OS, Operating System)

    1) 운영체제

    운영체제란 컴퓨터 하드웨어 자원을 효율적으로 관리하여 사용자에게 제공하는 시스템 소프트웨어이다.

    ex) Windows, Linux, iOS, Android, UNIX, Mac OS

     

    * 인터페이스: 디바이스와 디바이스 또는 사람과의 통신을 위한 매개체 또는 프로토콜을 의미한다.

    * 써드파티: 제 3자라는 의미로, 원천 기술과 호환되는 제품을 의미한다.

     

    1-1) 운영체제의 기능

    프로세스, 기억장치, 입출력 시스템, 네트워킹 등을 관리한다. 입출력 시스템이란 마우스, 키보드 등을 디바이스에 연결 시의 입출력을 말하는데, 사용자가 장치 특성에 대해 알지 못하더라도 연결하여 사용할 수 있도록 보조해주는 것이다.

    - CPU 스케줄링과 프로세스 관리

    - 메모리 관리

    - 디스크 파일 관리

    - 입출력 시스템 관리

     

    1-2) 운영체제의 구조

    - 유저 프로그램

    ------------------------ 운영체제

    - GUI : 그래픽적으로 표현된 사용자 인터페이스 <-> CUI만 있을 수도 있음

    - 시스템 콜 : 운영체제가 커널에 접근하기 위한 인터페이스로, 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수 호출 하려할때 시스템 콜 사용

    - 커널 : 컴퓨터의 물리적 자원 관리(CPU - 프로세스, 메모리 - Page, 디스크 -  File, 네트워크 - Socket) 등 운영체제 중 핵심 역할로서 메모리에 상주하는 부분,

    ex) Linux는 단일형 커널 사용(IPC, 파일 시스템 등을 커널이 직접 처리) vs Mac OS는 마이크로 커널(IPC 등은 개별로 존재)

    - 드라이버 : 하드웨어 제어 소프트웨어

    ------------------------ 운영체제

    - 하드웨어

     

    * 커널 모드(운영체제 서비스를 제공받을 수 있는 모드) vs 사용자 모드(운영체제 서비스를 제공받을 수 없는 모드)

    -> 레지스터에 슈퍼바이저 플래그가 1일 경우 커널 모드

    -> 컴퓨터 자원에 대한 직접 차단, 다른 프로그램으로 부터 보호

     

    1-3) 메모리 구조

    레지스터 - 캐시 - 메모리(RAM) - 저장장치(HDD/SSD) *비휘발성

    < 속도 ----------------------------------------------------- 용량 >

     

    - 캐시(cache): 데이터를 미리 복사해 놓는 임시 저장소, 장치 간의 속도차이에 의한 병목 현상 방지

    * 캐시히트: 캐시에서 원하는 데이터 찾음 vs 캐시미스: 캐시에서 못 찾아서 메모리(RAM)에서 찾아옴

     

     

    2) 프로세스와 쓰레드

     프로세스와 쓰레드는 비슷한 듯 하면서 헷갈리는 개념이다. 둘 모두 어떤 작업을 할 때 여러개가 일을 한다는 의미로 기억하고 있을 것이다. 둘의 가장 큰 차이점을 꼽으라고 한다면 자원 할당에 관한 것이다. 각각의 프로세스는 독립된 자원을 할당받는다. 따라서 한 프로세스에 오류가 나더라도, 다른 프로세스의 자원에 영향을 미치지 않는다. 하지만 많은 프로세스는 그만큼 많은 자원을 사용할 것이다. 하나의 프로세스 안에는 여러개의 쓰레드로 이루어져 있다. 말하자면 일꾼인데, 이 일꾼들은 자원을 공유한다. 즉, 하나의 프로세스에 할당받은 자원을 그 아래의 쓰레드들이 공유해서 사용한다. 따라서 한 쓰레드에서 오류가 나면, 다른 쓰레드에서도 오류가 날 것이다. 하지만 그 만큼 자원을 효율적으로 사용할 수 있다.

     

    따라서 멀티 쓰레드(Multi Thread) 프로그래밍은 프로그램의 효율과 '성능'을 높이기 위해서 사용한다.

     

    * 쓰레딩과(Threading) 쓰래싱(Thrashing)

    이름이 비슷하여 혼동할 수 있어 미리 적는다. 쓰레딩(Threading)은 위의 쓰레드를 사용하는 것을 의미하고, 쓰래싱은 Page falut와 관련된 오류이다. 메모리 관리를 위해 Page라는 것을 OS가 사용하는데, 이 때 사용가능 한 Page가 없어 Page fault가 자주 일어나는 것을 의미한다. 

     

    * 멀티 태스킹(Multi Tasking)

    멀티 태스킹이란 다중 작업, 여러개의 Task를 사용하는 것이다. Task는 추상적인 개념으로, 일부는 프로세스 자체를 의미하기도 한다. 정확히는 하나의 작업 단위라고 보면 될 것이다. 

     

    * 멀티 프로세싱(Multi Processing)과 멀티 프로그래밍(Multi Programming)

    멀티 프로세싱은 여러 개의 프로세스를 사용하는 것이다. 우리가 여러가지 프로그램을 키는 것에 해당한다. 멀티 프로그래밍은 요새는 OS에서 자동적으로 지원하는데, 입출력 대기시간(마우스, 키보드 등) 동안 다른 프로세서가 일 할 수 있는 것이다.

     

    프로세스는 fork() 시스템 호출을 통해 자식 프로세스를 생성할 수 있다.

     

    2-1) 스케쥴링(Scheduling)

    멀티 태스킹을 처리할 때, CPU가 어떤 프로세스를 먼저 처리할 지에 대해서 정해주는 것이다. 즉 처리 순서를 정하는 것을 의미한다. 여기에는 한 프로세스가 CPU를 할당받았을 때 다른 프로세스가 뺏지 못하는 선점 스케줄링과, 뺏을 수 있는 비선점 스케줄링 두가지로 나뉜다.

     

    ① 선점 스케줄링

    프로세스의 실행 시간이 유동적이고, 그에 맞춰 스케쥴을 관리해야할 때 사용된다. 우선순위와 관련하여 정보 교환을 위한 오버헤드가 발생한다.

     

    - SRT: 남은 처리 시간 순으로 정렬하여 수행한다.

    - 라운드 로빈(Round Robin, RR): 우선 순위 없이 선입선출 시간 단위로 수행된다. 주의할 것은 무언가 하나를 끝내고 넘어가는 것이 아니라, 하나를 조금 수행(시간 단위 만큼)하고 다음으로 넘어가는 것이다.

    - 다단계 큐: 우선순위를 가진 여러개의 큐를 두어 우선순위에 맞게 각 큐를 수행한다.

     

    ② 비선점 스케줄링

    각 프로세스가 어느정도 시간이 걸릴지 예측 가능할 때 사용하다. 유연성이 떨어지지만 오버헤드가 적다.

     

    - FIFO(FCFS): 선입 선출이다. 먼저 들어온 것이 다 처리되면 다음 것을 처리한다.

    - SJF: 실행 시간이 짧은 프로세스에 먼저 할당한다. 실행 시간이 길다면 계속 밀려 실행되지 못할 수 있다.

    - HRN: SJF의 기법을 보완한 것으로, 대기 시간 개념을 도입(에이징 기법)하였다. 대기 시간과 실행 시간을 고려하여 처리한다.

     

    * 콘보이(Convoy) 현상: 작업 시간이 긴 프로세스가 먼저 처리되어 다른 프로세스가 모두 늦춰져 효율이 떨어지는 현상 

     

    2-2) 멀티 쓰레드

    https://www.embedded.com/get-multicore-performance-from-one-core/

    하나의 프로세스에 단 하나의 쓰레드만 존재할 경우, 싱글쓰레드 프로세스라고 한다. 쓰레드가 여러개 있으면 그것이 바로 멀티쓰레드 프로세스다. 이는 프로세스의 병렬성을 높여주는 장점을 가지지만, 프로세스를 여러개 두는 것에 비해 자원 효율에서 앞설 수 있다.

    더보기

    * CPU와 GPU

    GPU는 병렬 처리가 가능하고, CPU는 불가능 하다고 알고 있었다. CUDA를 배울때 그랬던 것 같은데.. 이에 대해 Intel 등 여러 자료들을 찾아보니, CPU의 코어 수가 GPU에 비해 현저히 적기 때문에 둘의 병렬성에 대한 차이가 존재하는 것을 의미하는 것같다. Thread가 CPU에도 존재하기 때문에 병렬 처리는 가능하지만, 단순한 계산을 매우 여러번 해야 한다면 코어의 수가 적어 병렬로 처리하지 못할 수도 있다는 뜻이다.

     

    즉 GPU는 많은 연산을 병렬로 처리하여 간단하고 많은 수의 연산을 빠르게, CPU는 하나 하나 강력한 코어로 복잡하고 적은 수의 연산을 빠르게 하는 장점을 가지고 있는 것이다.

    그럼 병렬 처리는 어떤 목적으로 사용하는 것일까? 흔히 병렬 처리를 떠올리면 통화 하면서 게임을 하는, 여러가지 작업을 동시에 진행하는 것이 목적이라고 생각이 들 수 있다. 하지만 이는 또 다른 디바이스가 연산을 해주면 되는 문제다. 물론 비용적인 측면을 고려해서 병렬 처리가 중요하다라고 할 수 있겠지만, 그보다는 소형화, 그리고 전송속도에 대한 물리적 한계 때문에 연산을 하는 프로세서의 개발 문제에 있다. 쉽게 풀어 설명하자면 하나의 작업을 더 빠르게 수행하려는 것이 목적인 것이다.

     

    조금 엇나간 비유를 하자면(정확하지 않을 수 있다) 스타크래프트를 하는데 3멀티와 4멀티에 동시에 공격이 온다. 직렬 처리는 3멀티에 보내야 할 마린과 메딕의 수를 계산하고, 4멀티에 보내야 할 마린과 메딕의 수를 계산하여 보내는 방식이다. 병렬 처리는 3멀티와 4멀티에 보내야 할 계산을 동시에 하는 것이다. 따라서 생각(컴퓨터로 치면 실행) 시간에 대해 성능 이득을 거둘 수 있다.

     

    마치 "병렬 프로그래밍(=멀티쓰레드 프로그래밍)을 하면 CPU의 단점을 바로 개선할 수 있구나"라고 생각이 들 수 있겠지만, 사실은 난이도가 조금 높다. 어떨때는 멀티쓰레드를 사용하였을 때 성능이 저하가 될 수 있다. Data Race라고 하여 처리 순서에 따라 실행결과가 달라져 프로그래머 예상 밖의 결과가 나타나는 것이다. 

     

    2-3) 멀티쓰레드 프로그래밍

     

     

    2-4) 프로세스 동기화와 교착 상태

    두 개 이상의 프로세스가 동시에 동일한 자료를 접근하여 변경할 때, 하나의 프로세스만 자료를 조작할 수 있도록 보호해야 한다. 이것이 프로세스 동기화의 목적이다.

     

    https://www.topcit.or.kr/upload/edubox/essence/ess_ko_03/index.html

     

    ① 임계구역(Critical Section)

    임계구역이란 프로세스 동기화를 위해 각각의 프로세스가 코드의 일부분에 임계구역을 정의하고, 이 임계구역에서 다른 프로세스와 공유하는 자료를 변경하는 작업을 수행한다. 동시에 두 개 이상의 프로세스는 그들의 임계구역 안에서 실행될 수 없다.

     

    쉽게 설명하면, 하나의 프로세스만 해당 공유 자원을 이용할 수 있게끔 보장하는 영역이다. 이를 보장하기 위해서는 3가지 조건이 필요하다.

     

    - 상호 배제: 오직 한 쓰레드만 현재 임계 구역 진입이 가능하다.

    - 진행: 임계구역에 아무런 프로세스가 없다면, 잔류구역에서 실행 중이지 않은 다른 프로세스들이 접근하려 할 수 있다. 이 때 적절한 프로세스를 적절한 대기시간 안에 결정해야한다.

    - 한정된 대기: 어떤 쓰레드든 일정 대기 시간 내에 진입할 수 있어야 한다.

     

    또한 임계 구역에 동시 접근하는 것을 해결하기 위한 방법으로 3가지가 존재한다.

     

    - Lock/Unlock : 자원이 사용되고 있으면 잠궈서 접근 불가 -> 잠기기 전에 다른 스레드가 접근하는 상황이 발생할 수 있음

    - Semaphore : 공유 자원을 여러 프로세스가 접근하는 것을 막고자, 동시 접근 가능 공유 자원 수를 사용한다. 단 하나의 카운팅만 사용할 경우(이진으로 0과 1) Mutex를 사용한다(Mutex는 이진 Semaphore). P(wait)와 V(Signal) 연산을 하며, 검사는 임계 영역에 진입하기 위해, 증가는 대기 중인 프로세스를 깨우기 위해 사용된다.

    -> 프로세스가 임계영역에 진입할 때 세마포 값을 wait으로, 나올때 signal로 변경한다. 세마포가 wait이면 다른 프로세스는 임계영역에 접근할 수 없다. 즉 세마포가 5이면 5개의 프로세스가 들어갈 수 있는 것이다. Mutex는 

     

    - Monitor : 한 프로세스안의 하나의 스레드만 자원에 접근하도록 추상화된 데이터 형태다. 접근하는 과정과 해제를 처리한다.

     

    ② 교착 상태(Deadlock)

    교착 상태란 쓰레드가 서로를 무한히 기다리는 상황이다. 서로 자신의 차례만 기다려 다음 연산으로 진행하지 못한다. 교착 상태는 4가지 조건을 모두 충족하여야 발생한다.

     

    - 상호 배제: 한 프로세스가 자원을 사용하고 있으면, 다른 프로세스는 사용할 수 없다.

    - 점유 대기: 한 프로세스가 자원을 가지고 있는 상태에서, 다른 자원을 기다리고 있다.

    - 비선점: 사용되고 있는 자원을 뺏어올 수 없다.

    - 순환대기: 프로세스가 요구하는 자원의 방향이 순환(원형)이다. 즉 연쇄적으로 맞물려 있는 상태이다.

     

    교착 상태를 해결하기 위해서는 방지, 회피, 복구, 무시 4가지를 이용한다. 

     

    3) 기억장치 관리

     

    3-1) 단편화

    메모리를 할당하고, 회수하는 과정을 반복하다보면 사용되지 않고 낭비되는 일부 기억공간이 생긴다. 이를 단편화라고 하는데, 내부 단편화와 외부 단편화 두 가지 종류가 있다.

     

    ① 외부 단편화

    두 개의 메모리에 총 65,000MB가 남아있는데, 각각 32,500MB씩 있어서 64,500MB의 새로운 프로세스가 할당되지 못해 65,000MB가 쓰이지 않는 경우를 의미한다. 세그멘테이션으로 분할하여 사용하는 경우에 발생할 수 있다.

     

    ② 내부 단편화

    내부 단편화란 실제 프로세스의 사용량 보다 너무 크게 할당해서 나머지 빈 공간이 발생하는 경우를 의미한다. 페이징을 이용할 때 발생할 수 있다.

     

    그럼 단편화라는 문제는 어떻게 해결할 수 있을까? 이는 메모리의 압축과 통합의 방법이 있다. 압축의 경우 구현이 복잡한데다 과부하의 우려가 있어 잘 사용되지 않는데, 작은 크기의 사용되는 메모리들을 합병시키는 방법이다. 통합은 인접한 미사용 메모리를 통합시켜 주는 것이다.

     

    3-2) 가상 기억장치

    목적은 운영체제의 제한된 메모리 공간 문제를 해결하기 위한 것이다. 물리적으로 실제 존재하는 것은 아니고 대용량 보조기억 장치를 주기억장치처럼 사용한다.

     

    *보조기억 장치와 주기억 장치

    주기억 장치는 ROM과 RAM이다. 롬(ROM)은 내용이 지워지지 않는 비 휘발성, 램(RAM)은 휘발성이다. 램에 프로그램을 불러와 CPU가 작업을 하는 곳이며, ROM은 BIOS와 같은 변화가 불가능한(쓰기가 불가능) 중요 데이터들이 저장되어 있다. 보조기억 장치는 HDD와 SSD가 있다. SSD는 전기적으로 데이터를 저장해 속도와 소음면에서 HDD보다 우위에 있다.

     

    *스와핑(swapping)

    메모리(RAM)에서 당장 사용하지 않는 부분을 HDD/SSD에 저장해두고 필요할 때 꺼내쓰는 방식이다.

     

    *페이지 폴트(page fault)

    프로세스 주소에는 존재하지만 메모리에는 없는 데이터에 접근한 경우 발생하는 경고

     

    가상 기억장치를 구현하는 기법은 페이징과 세그멘테이션이 있다.

     

    ① 페이징 기법(Paging)

    주기억 장치를 '프레임'이라는 동일 크기로 분할하고, 가상 기억 장치에 보관된 작업은 '페이지'로 분할하여 주기억장치의 프레임에서 실행시키는 기법이다. 페이지를 이용할 때 스래싱(Thrashing)이 일어날 수 있다고 했는데, 멀티 프로그래밍의 이용률을 낮추고 워킹 셋을 활용한다.

     

    *워킹 셋: 자주 참조하는 페이지 리스트를 모아둔 것. 자주 사용되는 것은 주기억 장치에 상주시켜 Page fault를 줄인다.

     

    페이지 교체의 기법은 아래와 같다.

     

    - 최적화(Optimal): 가장 오래 사용되지 않을 페이지를 교체

    - 선입선출(FIFO): 먼저 들어온 순서로 교체

    - 최소 최근 사용(LRU, Least Recently Used): 가장 오래 사용되지 '않은' 페이지를 교체

    - 최소 사용 빈도(LFU, Least Frequently Used): 가장 적게 사용되거나 집중 사용되지 않는 페이지를 교체

     

    ② 세그멘테이션 기법(Segmentation)

    가상 기억 장치에 보관된 작업을 세그멘테이션이라는 단위로 분할하여 주기억장치에서 실행한다.

    https://www.topcit.or.kr/upload/edubox/essence/ess_ko_03/index.html

     

    'CS지식' 카테고리의 다른 글

    컴퓨터 네트워크  (0) 2022.08.05
    C, C++, C#  (0) 2022.08.03
    컴퓨터 그래픽스  (0) 2022.08.02
    자료구조와 STL  (0) 2022.06.23
    [인공지능] Basic  (0) 2022.03.11

    댓글