Study/CS

[CS]OS(Operating System)

seomj 2024. 6. 13. 20:38

운영체제란?

하드웨어를 관리하고, 컴퓨터 시스템의 자원들을 효율적으로 관리하며, 응용 프로그램과 하드웨어 간의 인터페이스로써 다른 응용 프로그램이 유용한 작업을 할 수 있도록 환경을 제공해준다.

사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 시스템 소프트웨어

 

유형

일괄 처리 시스템(Batch Processing System)

유사한 작업들끼리 일정량 또는 일정 시간 묶어서 처리하는 방식

 

다중 프로그래밍 시스템(Multi Programming System)

하나의 cpu와 주기억 장치를 이용하여 여러 개의 프로그램을 동시에 처리하는 방식

 

시분할 시스템(Time Sharing System)

시간을 분할하여 여러 사용자들에게 컴퓨터 자원을 번갈아 가며 할당하면 사용자는 자신이 컴퓨터를 독점하고 있다는 느낌을 받는다.

 

실시간 시스템(Real-Time Systme)

단말기의 요청을 즉시 처리하여 결과를 반환하는 시스템

 

다중처리 시스템(Multi-Processing System)

여러 대의 cpu와 하나의 주기억 장치를 이용하여 여러 개의 프로그램을 동시에 처리하는 방식

 

분산 컴퓨팅(Distibuted Computing)

넷상으로 연결된 여러 대의 컴퓨터들의 처리 능력을 이용하여 복잡한 계산 문제를 해결하려는 분산 처리 모델

 

역할

  1. 프로세스 관리
    프로세스, 스레드, 스케줄링, 동기화, IPC 통신
    운영체제에서 작동하는 응용 프로그램을 관리하는 기능
    프로세서(CPU) 관리하는 것이라고 볼 수도 있다. 현재 CPU를 점유해야 할 프로세스를 결정하고, 실제로 CPU를 프로세스에 할당하며, 이 프로세스 간 공유 자원 접근과 통신 등을 관리한다.
  2. 저장장치 관리
    메모리 관리, 가상 메모리, 파일 시스템
    1차 저장장치에 해당하는 메인 메모리와 2차 저장장치에 해당하는 하드디스크, NAND 등을 관리하는 기능
    • 1차 저장장치(Main Memory)
      • 프로세스에 할당하는 메모리 영역의 할당과 해제
      • 각 메모리 영역 간의 침범 방지
      • 메인 메모리의 효율적 활용을 위한 가상 메모리 기능
    • 2차 저장장치(HDD, NAND Flash Memory 등)
      • 파일 형식의 데이터 저장
      • 이런 파일 데이터 관리를 위한 파일 시스템을 OS에서 관리
  3. 네트워킹
    TCP/IP, 기타 프로토콜
    TCP/IP 기반의 인터넷에 연결하거나, 응용 프로그램이 네트워크를 사용하려면 운영체제에서 네트워크 프로토콜을 지원해야 한다.
  4. 사용자 관리
    계정 관리, 접근 권한 관리
  5. 디바이스 드라이버
    순차 접근 장치, 임의 접근 장치, 네트워크 장치
    시스템의 여러 하드웨어를 운영체제에서 인식하고 관리하게 만들어 응용 프로그램이 하드웨어를 사용할 수 있게 만들어야 한다.
    운영체제 안에 하드웨어를 추상화 해주는 계층이 필요하며, 이 계층이 디바이스 드라이버이다.

 

 

 

참고

https://www.notion.so/Operating-System-38aeb9c1999e40edb97e6f1f67580c6d?pvs=4#0e378e99895f4eca986eccee5c97fb61

https://cocoon1787.tistory.com/685


PCB와 Context Switching

Process Control Block

프로세스 제어 블록

운영체제가 프로세스를 제어하기 위해서 정보를 저장해 놓고, 프로세스의 상태 정보를 저장하는 구조체

특정한 프로세스를 관리할 필요가 있는 정보를 포함하는, 운영체제 커널의 자료 구조

운영체제가 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보를 가지고 있는 데이터 베이스

 

 

프로그램 실행 → 프로세스 생성 → 프로세스 주소 공간(코드, 데이터, 스택)에 생성 → 이 프로세스의 메타 데이터들이 PCB에 저장

 

각 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB는 제거된다.

 

프로세스는 CPU가 처리하던 작업의 내용들을 자신의 PCB에 저장하고, 다음에 다시 CPU를 점유하여 작업을 수행해야 할 때 PCB로부터 해당 정보들을 CPU에 넘겨와서 계속해서 하던 작업을 진행할 수 있게 된다.

즉, PCB가 필요한 이유는 앞으로 다시 수행할 대기 중인 프로세스에 관한 저장 값을 PCB에 저장해두기 위함이다.

 

Linked List 방식으로 관리된다.

 

이렇게 수행 중인 프로세스를 변경할 때, CPU의 레지스터 정보가 변경되는 것을 Context Switching이라고 한다.

CPU가 이전의 프로세스 상태를 PCB에 보관하고 또 다른 프로세스의 정보를 PCB에 읽어 레지스터에 적재하는 과정

인터럽트가 발생하거나, 실행 중인 CPU 사용 허가 시간을 모두 소모하거나, 입출력을 위해 대기해야 하는 경우에 발생한다.

CPU에 계속 프로세스를 수행하도록 하기 위해 다른 프로세스를 실행시키고 Context Switching 한다.

 

 

 

참고

https://baebalja.tistory.com/319

https://jwprogramming.tistory.com/16

https://gyoogle.dev/blog/computer-science/operating-system/PCB%20&%20Context%20Switching.html


프로세스 & 스레드

프로그램: 어떠한 작업을 위해 실행할 수 있는 파일

프로세스: 프로그램을 메모리 상에서 실행 중인 작업

스레드: 프로세스 안에서 실행되는 여러 흐름 단위

 

프로세스

  • 운영체제로부터 시스템 자원을 할당받는 작업의 단위
  • 메모리에서 올라와 실행되고 있는 프로그램 인스턴스
  • 컴퓨터에서 연속적으로 실행되고 있는 프로그램
  • 각 프로세스는 별도의 주소 공간에서 실행되고 프로세스끼리는 자원을 공유하지 않음
  • 하나의 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신 필요

스레드

  • 하나의 프로세스 내의 주소 공간이나 자원들 공유
  • 하나의 프로세스가 생성되면 하나의 스레드(메인 스레드)가 생성됨
  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
  • 스레드는 프로세스 내에서 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유

차이점

프로세스는 자신만의 고유 공간과 자원을 할당받아 사용하고, 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용한다.

 

멀티 프로세스

하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것

장점

  • 여러 개의 자식 프로세스 중 하나에 문제가 발생해도 다른 자식 프로세스에 영향이 없다
  • 구현이 간단하다
  • 각 프로세스들이 독립적으로 동작하여 안정적이다

단점

  • 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다
  • 작업량이 많을수록 오버헤드가 발생하고 Context Switching으로 인한 성능 저하 우려
  • 프로세스 간의 통신을 하기 위해서는 IPC를 통해야 한다

*Context Switching: 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정 프로세스의 경우 Context Switching 시 CPU 레지스터, RAM과 CPU 사이의 캐시 메모리가 초기화되기 때문에 오버헤드가 큰 반면, 스레드는 Context Switching시 Stack영역만 처리하면 되므로 스레드 간의 문맥 교환 속도가 빠릅니다.

 

멀티 스레드

하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것

장점

  • 시스템의 자원과 처리 비용이 감소한다 (실행 속도 상승)
  • Context Switching이 빠르다
  • 스레드 간의 자원(Code, Data, Heap)을 공유하고 있기 때문에 응답 시간이 빠르다

단점

  • 스레드가 개별적으로 움직여 프로그램 테스트, 디버깅이 어렵다
  • 스레드 간의 데이터 공유 시 동기화 문제
  • 하나의 스레드의 오류로 전체 프로세스에 문제가 발생한다
  • 많은 스레드 사용은 오버헤드 발생

 

멀티 프로세스 대신 멀티 스레드를 사용하는 이유

자원 효율성 증대, 처리 비용 감소, 응답 시간 단축

 

 

 

참고

https://cocoon1787.tistory.com/688

https://gyoogle.dev/blog/computer-science/operating-system/Process%20vs%20Thread.html


프로세스의 주소 공간

프로세스가 생성되면서 메모리에 프로세스 주소 공간이 할당된다.

Code(Text)

  • 프로그램을 실행시키는 실행 파일 내의 명령어들
  • 컴파일 시에 결정
  • Read-Only
  • 같은 프로그램으로 실행된 여러 프로세스는 동일한 코드를 가진다

Data

  • 전역 변수, static(정적) 변수
  • 전역 변수, 정적 변수를 참조한 코드는 컴파일 후 Data 영역의 주소 값을 가리킨다
  • 프로그램 실행 시 생성, 종료 시 소멸
  • Read-Write
  • 한 프로세스 내 여러 스레드가 공통으로 Data 영역을 공유

BSS(Blocked Started by Symbel)

  • 전역으로 선언된 초기화 하지 않은 변수

Heap

  • 동적 할당을 위한 메모리 영역
  • 런타임에 크기가 정해진다
  • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당

Stack

  • 복귀할 주소, 데이터(지역 변수, 매개 변수, 반환값)를 임시로 저장
  • LIFO 구조 - 컴파일 시 크기 결정, Stack Overflow가 발생할 수 있음
  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
  • Read-Write
  • 함수의 호출과 함께 할당, 함수 호출 완료 시 소멸

→ 최대한 데이터를 공유하여 메모리 사용량을 줄이기 위해 구역을 나눈다.

Code는 따로 관리하여 공유한다.

 

Stack과 Data를 나눈 이유

Stack을 통해 함수의 흐름을 관리하고, Data를 통해 전역 변수, static 변수를 관리한다. 프로그램의 함수와 지역 변수는 LIFO 특성을 가진 스택에서 실행된다. 이 함수들 안에서 공통으로 사용하는 전역 변수는 따로 지정해주면 메모리를 아낄 수 있다.

 

 

 

참고

https://hojunking.tistory.com/51

https://velog.io/@klm03025/운영체제-프로세스-주소-공간

https://gyoogle.dev/blog/computer-science/operating-system/Process%20Address%20Space.html


인터럽트(Interrupt)

프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 즉시 중단하고, 발생된 상황에 대한 우선 처리가 필요함을 CPU에게 알린다.

 

외부/내부 인터럽트는 CPU의 하드웨어 신호에 의해 발생한다.

소프트웨어 인터럽트는 명령어의 수행에 의해 발생한다.

 

발생 처리 과정

인터럽트가 발생하면 현재 수행 중인 프로그램을 멈추고, 상태 레지스터와 PC 등을 스택에 잠시 저장한 뒤에 인터럽트 서비스 루틴으로 간다.

 

만약 인터럽트 기능이 없다면, 컨트롤러는 특정한 어떤 일을 할 시기를 알기 위해 계속 체크를 해야 한다.(Polling, 폴링)

즉, 컨트롤러가 입력을 받아들이는 방법에는 2가지가 있다.

  • 폴링
    • 사용자가 명령어를 사용해 입력 핀의 값을 계속 읽어 변화를 알아내는 방식
  • 인터럽트
    • MCU 자체가 하드웨어적으로 변화를 체크하여 변화 시에만 일정한 동작을 하는 방식

 

 

 

참고

https://gyoogle.dev/blog/computer-science/operating-system/Interrupt.html

https://baebalja.tistory.com/354


시스템 콜(System Call)

OS는 다양한 서비스를 수행하기 위해 하드웨어를 직접 관리한다. 반면 응용 프로그램은 OS가 제공하는 인터페이스를 통해서만 자원을 사용할 수 있다. OS가 제공하는 인터페이스를 시스템 콜이라고 한다.

 

커널 영역의 기능을 사용자 모드가 사용 가능하게

즉, 프로세스가 하드웨어 직접 접근해서 필요한 기능을 할 수 있게 한다.

응용 프로그램은 시스템 콜을 사용해서 원하는 기능을 수행할 수 있다.

 

보통 API(라이브러리 함수)를 통해 사용하게 된다.

운영체제(OS)는 메모리에 프로그램 적재, I/O처리, 파일시스템 처리 등 여러 서비스들을 제공하는데 사용자 프로세스는 이에 직접적인 접근이 아닌 시스템 콜 호출을 통해 서비스를 제공받을 수 있다.

 

종류

  • 프로세스 제어
  • 파일 조작
  • 장치 관리
  • 정보 유지
  • 통신
  • 보호

 

 

 

참고

https://didu-story.tistory.com/311


IPC(Inter Process Communication)

독립적 구조를 가진 프로세스 간의 통신을 가능하도록 해주는 통신

프로세는 커널이 제공하는 IPC 설비를 이용해 프로세스 간 통신을 할 수 있게 된다.

 

방법(모델)

메세지 전달 방식

서로 독립된 공간에 있는 프로세스들이 자원을 공유하기 위해 커널에 있는 공유 공간 속에 데이터를 주고 받는 방식

각 프로세스들이 커널에 있는 메시지 큐 공간으로 자원을 던져준다. 즉, 운영체제가 대리 전달하는 방식이다.

  • 직접 통신
    • 프로세스가 커널의 메시지 큐로 전달하고, 커널이 이를 다른 프로세스에게 전달하는 방식
  • 간접 통신
    • 프로세스가 커널의 메시지 큐로 전달하고, 다른 프로세스가 직접 와서 자원을 읽어가는 방식

실제 메시지 전송이 이뤄지는 내부 구현은 커널의 중재에 의해 사실상 동일한 방식으로 이루어진다.

 

공유 메모리 방식

프로세스들이 주소 공간의 일부를 공유하는 방식

운영체제는 공유 메모리를 사용하는 시스템 콜을 지원해서 서로 다른 프로세스들이 그들의 주소 공간 중 일부를 공유할 수 있도록 한다.

 

프로세스가 공유 메모리 할당을 시스템 콜을 통해 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해준다. 이후 어떤 프로세스든 해당 메모리 영역에 접근할 수 있다.

 

 

 

참고

https://baebalja.tistory.com/359

https://gyoogle.dev/blog/computer-science/operating-system/IPC.html


경쟁 상태(Race Condition)

공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 결과값에 영향을 줄 수 있는 상태

  1. 커널 작업을 수행하는 중에 인터럽트 발생
    문제: 커널 모드에서 데이터를 로드하여 작업을 수행하다가 인터럽트가 발생하여 같은 데이터를 조작하는 경우
    해결: 커널 모드에서 작업을 수행하는 동안, 인터럽트를 disable 시켜 CPU 제어권을 가져가지 못하도록 한다.
  2. 프로세스가 시스템 콜을 하여 커널 모드로 진입하여 작업을 수행하는 도중 문맥 교환이 발생할 때
    문제: 프로세스1이 커널 모드에서 데이터를 조작하는 도중, 시간이 초과되어 CPU 제어권이 프로세스2로 넘어가 같은 데이터를 조작하는 경우
    해결: 프로세스가 커널 모드에서 작업하는 경우 시간이 초과되어도 CPU 제어권이 다른 프로세스에게 넘어가지 않도록 함
  3. 멀티 프로세서 환경에서 공유 메모리 내의 커널 데이터에 접근할 때
    문제: 멀티 프로세서 환경에서 2개의 CPU가 동시에 커널 내부의 공유 데이터에 접근하여 조작하는 경우
    해결: 커널 내부에 있는 각 공유 데이터에 접근할 때마다, 그 데이터에 대한 lock/unlock을 하는 방법

이 문제가 발생하지 않기 위해 임계 구역에 조건이 있다.

(조건은 아래 '세마포어 & 뮤텍스' 파트에서 설명한다.)

 

 

 

참고

https://gyoogle.dev/blog/computer-science/operating-system/Race%20Condition.html


세마포어(Semaphore) & 뮤텍스 (Mutex)

임계 구역(Critical Section)

공통으로 접근하여 데이터를 수정할 수 있는 코드 영역

여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 부분

 

프로세스 간 공유 자원을 접근하는 데 있어서 문제가 발생하지 않도록 한 번에 하나의 프로세스만 이용하며 다른 프로세스들의 접근을 제한해야 한다.

 

조건

  • 상호 배제(Mutual Exclution): 하나의 프로세스가 임계 구역에 들어가 있다면 다른 프로세스는 들어갈 수 없다.
  • 진행(Progress): 들어가려는 프로세스가 여러 개라면 어느 것이 들어갈 것인지 결정해야 한다.
  • 한정된 대기(Bounded Waiting): 다른 프로세스의 기아(Starvation)를 막기 위해 한 번 임계 구역에 들어간 프로세스는 다음 번 임계 구역 접근에 제한이 생겨야 한다.

*기아(Starvation): 임계 영역에 들어가기 위해 무한정 기다리는 현상

 

뮤텍스(Mutex)

임계 구역을 가진 스레드들의 실행 시간이 서로 겹치지 않고 각각 단독으로 실행되게 하는 기술

공유 자원이 하나일 때 처리하는 동기화 방법

  • Lock: 현재 임계 구역에 들어갈 권한을 얻어옴
    • 만약 다른 프로세스/스레드가 임계 구역 수행 중이면 종료할 때까지 대기
  • Unlock: 현재 임계 구역을 모두 사용했음을 알림
    • 대기 중인 다른 프로세스/스레드가 임계 구역에 진입할 수 있음

데커(Dekker)알고리즘, 피터슨(Peterson)알고리즘, 제과점(Backery)알고리즘

 

세마포어(Semaphore)

 

멀티 프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법

공유 자원이 하나 이상일 때 처리하는 동기화 방법

 

세마포어 S는 현재 공유 자원에 접근할 수 있는 프로세스/스레드의 수를 의미한다.

열쇠를 하나 가져가는 연산을 P, 열쇠를 반납하는 연산을 V

 

P와 V의 동작이 계속 번갈아 진행하다가 S가 0이 되면?

→ V 해줘야 다음 프로세스/스레드가 임계 구역에 접근할 수 있다.

 

Bust-Waiting, Block-Wakeup

 

 

 

참고

https://baebalja.tistory.com/323

https://baebalja.tistory.com/340

https://cocoon1787.tistory.com/541

https://gyoogle.dev/blog/computer-science/operating-system/Semaphore%20&%20Mutex.html


데드락(DeadLock)

교착 상태

둘 이상의 프로세스가 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 현상

프로세스 P1이 임계 구역에서 자원 A를 소유하고 있고 자원 B를 소유하려는 순간에 문맥 교환이 일어나서 프로세스 P2가 임계 구역에 들어온다. 그리고 자원 B를 소유하고 자원 A를 소유하려는 데 이미 프로세스 P1이 자원 A를 소유하고 있어서 기다려야 한다.

 

4가지 조건 - 상호배제, 점유와 대기, 비선점, 순환대기

하나라도 조건을 만족시키지 못하면 교착상태가 일어나지 않는다.

  1. 상호 배제(Mutual Exclusion)
    프로세스들이 자원을 배타적으로 점유하고 있고 다른 프로세스들이 자원을 사용할 수 없다.
  2. 점유와 대기(Hold and wait)
    자원을 가진 프로세스가 다른 자원을 기다릴 때 보유 자원을 놓지 않고 계속 가지고 있다.
  3. 비선점(No Preemption)
    프로세스가 자원을 가지고 있을 때, 자원 스스로 내어 놓을 뿐 강제로 빼앗기지 않는다.
  4. 순환대기(Circular Wait)
    양보없이 서로 나아가려는 방향만 바라보고, 서로 빠져주기를 기다린다.
    사이클이 형성된 상태로 기다리는 상황

 

처리 방법 - 예방, 회피, 탐지 및 복구, 무시

  1. 예방(Prevention)
    데드락이 발생되지 않게 알고리즘을 짜자.
    4가지 조건 중 하나 이상을 부정하자.
    1. 상호 배제 부정
      1. 읽기 전용 파일과 같은 공유 자원을 사용
    2. 점유와 대기 부정
      1. 프로세스 대기를 없애기 위해서 프로세스가 실행되기 전에 필요한 모든 자원 할당 (자원 낭비)
      2. 자원을 점유하지 않고 있을 때에만 다른 자원을 요청할 수 있도록 함 (기아상태 될 수 있음)
    3. 비선점 부정
      1. 모든 자원에 대한 선점 허용
      2. 프로세스가 할당 받을 수 없는 자원을 요청하는 경우, 기존에 가지고 있던 자원을 모두 반납하고 새 자원과 이전 자원을 얻기 위해 대기 (자원 낭비)
    4. 순환 대기 부정
      1. 자원에 고유한 번호를 할당해서 번호 순서대로 자원을 요구 (자원 낭비)
    → 하지만 예방 방법은 시스템 처리량이나 자원 사용의 효율성을 떨어뜨린다.

  2. 회피(Deadlock Avoidance)
    데드락이 빠질 가능성이 있는지 없는지 OS가 검사를 하고, 가능이 없는 경우에만 자원 요청을 허용한다.

    은행원 알고리즘
    더보기

    “CPU는 최소한 하나의 프로세스에게 할당해 줄 만큼의 자원을 항상 보유하고 있어야 한다”

     

    은행에 $10이 있으며, a, b, c가 은행에서 돈을 빌린다고 가정하자. 은행은 a, b, c에게 $3씩 빌려줬다. 은행은 $1이 남았다. a는 $5, b는 $4, c는 $6가 필요하다. 은행은 여기서 b가 $1이 부족하다는 것을 생각하고 빌려준다. 그러면 b는 $4가 있기 때문에 작업을 처리하고 빌린 $4를 은행에 반환한다. 은행은 $4가 있고 c에게 $3을 빌려준다. c는 $6을 가지고 작업을 처리한다. 빌린 $6를 은행에 반환한다. 은행은 $7을 가지고 있고 a에게 $2를 빌려준다. a는 $5로 작업을 처리하고 빌린 $5를 은행에 반환한다.

    → 모두 처리가 가능하기 때문에 안전상태!

     

    만약 은행이 a, b, c에게 $3, $3, $3.5를 빌려준다면, 은행에 $0.5가 남고 이는 a, b, c그 누구도 작업을 처리할 수 없게 된다.

    → 불완전 상태!

     

    미리 자원의 최대 요구량을 알아야 하고, 할당할 수 있는 자원의 수가 일정해야 하는 등 사용에 제약 조건이 많다.

  3. 탐지 및 복구(Detection and Recovery)
    OS가 자원을 달라는 대로 주면서 주기적으로 데드락에 빠졌는지 검사한다.
  4. 무시
    프로그램이 작동을 멈추거나 오류가 발생하면 사용자가 직접 프로세스를 종료한다.

 

 

 

 

 

참고

https://baebalja.tistory.com/342

https://cocoon1787.tistory.com/858


CPU 스케줄링

CPU가 수행 중이던 프로세스가 끝나면 다음 프로세스로 어떤 것을 고를지에 대한 방법

 

현재 실행 상태에 있던 프로세스가 다른 상태로 전이될 때 다음 실행시킬 프로세스의 선정이 필요한 경우 스케줄링이 발생한다.

time quantum

각 프로세스마다 CPU를 사용할 수 있는 최대 시간

 

노화(aging) 기법

기다리는 시간이 길어지면 우선순위를 조금씩 높여, 언젠가는 가장 높은 우선순위가 되어 CPU를 할당 받을 수 있게 해주는 방법

 

 

비선점형 스케줄링

FCFS(First-Come First-Served)

큐에 도착한 순서대로 CPU 할당

 

SJF(Shortest-Job First)

CPU 버스트 시간이 더 짧은 프로세스를 먼저 수행

*CPU Burst Time: CPU 할당 후 입출력 요구까지의 시간

 

선점형 스케줄링

SRTF(Shortest Remaining Time First)

작업량이 가장 적은 사람을 먼저 처리하는 스케줄링 방식

 

우선순위 스케줄링(Priority scheduling)

우선순위가 가장 높은 프로세스에게 제일 먼저 CPU를 할당하는 방식

우선 순위가 낮은 프로세스가 무한정 기다리는 기아 현상 발생 가능

→ 노화 기법으로 기아 현상 해결 가능

 

라운드 로빈 스케줄링(Round Robin scheduling)

시분할 시스템의 성질을 잘 활용한 스케줄링

퀀텀의 시간이 끝나면 해당 프로세스는 대기하고 있는 프로세스의 맨 뒤로 이동한다.

퀀텀이 크면 FCFS와 같아지고, 작으면 Context Switching이 잦아져 오버헤드가 증가한다.

 

다단계 큐(Multilevel Queue)

프로세스마다 사용자에게 우선적으로 먼저 처리되어야 하는 그룹으로 나누고 각 그룹에 따라서 처리할 큐를 여러 개 두어 사용하는 것

 

속도가 빨라야 하는 프로세스에게는 타임 퀀텀을 작게 하고, 사용자와의 상호 작용이 없는 프로세스와 같은 경우엔 타임 퀀텀을 길게 하여 FCFS 방식으로 처리한다.

우선 순위가 높은 큐는 타임 퀀텀을 작게 하고, 우선 순쉬가 낮은 큐는 타임 퀀텀을 크게 한다.

 

큐를 분리하면 프로세스의 우선 순위와 작업 형태를 고려하여 스케줄링을 할 수 있다.

 

우선 순위가 높은 상위 큐 프로세스가 계속해서 들어온다면, 하위 큐 프로세스의 작업을 할 수 없게 된다.

 

다단계 피드백 큐(Multilevel Feedback Queue)

다단계 큐와 기본적인 형태가 같다. 하지만 피드백 큐는 CPU를 사용하고 난 프로세스는 우선 순위가 낮아진다는 특정이 있다.

CPU를 사용하고 난 프로세스는 원래의 큐가 아닌 우선 순위가 하나 낮은 큐의 끝으로 간다.

 

만약 우선 순위가 높은 프로세스들이 계속 들어오게 되면?

→ 큐 사이로 프로세스들의 이동이 가능하다. 노화 기법을 활용해 오랜 시간 동안 할당 받지 못한 프로세스가 있다면 상위 큐로 보내 우선 순위를 올려줄 수 있다.

→ 프로세스의 우선 순위가 낮아질수록 해당 큐의 타임 퀀텀은 커진다.

 

 

 

참고

https://baebalja.tistory.com/360

https://cocoon1787.tistory.com/123

https://gyoogle.dev/blog/computer-science/operating-system/CPU Scheduling.html


페이징과 세그먼테이션

어떠한 프로그램을 실행할 때, 컴퓨터에서는 프로그램들을 메모리 공간에 연속적으로 할당하게 된다. 만약 여러 프로그램들이 메모리에 할당되고 해제되는 것이 반복되다 보면 메모리 공간이 조각조각 나뉘어 총 메모리가 충분함에도 불구하고 프로그램에 메모리를 할당하는 것이 불가능한 상태가 발생한다. 이를 메모리 단편화라고 한다.

 

외부 단편화: 프로그램의 크기보다 분할의 크기가 작은 경우에는 해당 분할이 비어 있는데도 불구하고 프로그램을 적재하지 못하기 때문에 발생하는 현상

내부 단편화: 프로그램의 크기보다 분할의 크기가 큰 경우 해당 분할에 프로그램을 적재하고 남는 현상

 

메모리 단편화 해결 방법: 페이징, 세그먼테이션

 

메모리 관리 기법

  1. 연속 메모리 기법
    • 프로그램 전체가 메모리에 연속적으로 할당
    • 고정 분할 기법
    • 동적 분할 기법
  2. 불연속 메모리 기법
    • 프로그램의 일부가 서로 다른 주소 공간에 할당될 수 있는 기법
    • Page: 프로세스를 고정된 크기로 나눈 블록
    • Frame: 메모리를 고정된 크기로 나눈 블록
    • Segment: 서로 다른 크기의 논리적 블록

 

가상 메모리

실제 메모리 크기와 관계없이 메모리를 사용할 수 있도록 가상 메모리 주소를 사용

사용하지 않는 것은 메모리에 올리지 않고 사용하는 부분들을 쪼개서 메모리에다 넣는다.

가상 주소를 주기억 장치의 실제적인 주소로 매핑(mapping)하는 방법을 통해 구현한다.

 

페이징

프로세스의 주소 공간을 고정된 사이즈의 페이지 단위로 나누어 물리적 메모리에 불연속적으로 할당하는 방식

메모리는 Frame으로, 프로세스는 Page로 고정 크기로 분할된다.

페이지와 프레임을 대응시키는 page mapping 과정이 필요하며, paging table을 생성해야 한다.

paging table에는 각 페이지 번호와 해당 페이지가 할당된 프레임의 시작 물리 주소를 저장한다.

 

외부 단편화 발생 X

디스크에서 들고 오는 페이지들의 크기가 프레임보다 큰 경우가 없기 때문에 메모리에 못 들어가는 경우는 없다.

 

내부 단편화 발생 가능

프로세스의 주소 공간 중 제일 마지막에 위치한 페이지에서는 내부 단편화가 발생할 가능성이 있다.

 

세그먼테이션

프로세스를 서로 크기가 다른 논리적인 블록 단위인 Segment로 분할하여 메모리에 할당

각 세그먼트는 연속적인 공간에 저장한다.

세그먼트들의 크기가 서로 다르기 때문에 프로세스가 메모리에 적재될 때 빈 공간을 찾아 할당하는 기법

mapping을 위한 segment table이 필요하다.

 

내부 단편화 발생 X

프로세스가 필요한 메모리 공간만큼 메모리를 할당해주기 때문이다.

 

외부 단편화 발생 가능

중간에 메모리를 해제하면 작은 빈틈이 여러 곳에 생길 수 있다. 그 작은 빈틈보다 큰 세그먼트가 메모리에 들어가고자 하면 들어갈 수가 없다.

 

 

 

참고

https://baebalja.tistory.com/428

https://cocoon1787.tistory.com/860

https://gyoogle.dev/blog/computer-science/operating-system/Paging%20and%20Segmentation.html


페이지 교체 알고리즘

페이징 기법으로 메모리를 관리하는 운영체제에서 필요한 페이지가 주기억장치에 적재되지 않았을 시(페이지 부재) 어떤 페이지 프레임을 선택하여 교체할 것인지 결정하는 방법

 

필요한 페이지만 메모리에 올려도 메모리는 결국 가득 차게 되며, 올라와 있던 페이지가 사용된 후에 자리만 차지하고 있을 수 있다.

따라서 메모리가 가득 차면, 추가로 페이지를 가져오기 위해 안쓰는 페이지는 out하고, 해당 공간에 현재 필요한 페이지를 in 해야한다. 이때 어떤 페이지를 out 시킬지 정해야 한다.

 

OPT(Optimal)

앞으로 가장 오랫동안 사용되지 않을 페이지 교체

페이지가 앞으로 잘 사용되지 않을 것이라는 보장이 없기 때문에 수행하기 어렵다.

 

FIFO

가장 먼저 들어온 페이지 교체

 

가장 간단한 방법이며, 초기화 코드에서 적절한 방법이다.

 

LRU(Least Recently Used)

가장 오랫동안 사용하지 않은 페이지를 교체

가장 오랫동안 사용하지 않았던 데이터라면 앞으로도 사용할 확률이 적을 것이라 가정한다.

 

LFU(Least Frequently Used)

참조 횟수가 가장 낮은 페이지를 교체

 

MFU(Most Frequently Used)

참조 횟수가 가장 많은 페이지를 교체

 

NUR=NRU(Not Used Recenetly, Not Recently Used)

클럭 알고리즘

최근에 사용하지 않은 페이지 교체 (LRU를 근사한 알고리즘)

 

 

 

참고

https://doh-an.tistory.com/28

https://gyoogle.dev/blog/computer-science/operating-system/Page%20Replacement%20Algorithm.html


메인 메모리

명령어 수행 시 메모리에 필요한 데이터가 없으면 해당 데이터를 우선 가져와야 한다.

 

MMU(Memory Management Unit, 메모리 관리 장치)

논리 주소를 물리 주소로 변환한다

메모리 보호나 캐시 관리 등 CPU가 메모리에 접근하는 것을 총 관리해주는 하드웨어

가상 메모리의 논리 주소를 가지고 실제 데이터가 담겨 있는 곳에 접근하기 위해서 빠른 주소 변환이 필요하다. 이를 MMU가 돕는다. OS를 통해 페이지 테이블에 접근하고 변환 작업을 진행한다.

 

메모리 보호(Memory Protection)

보호되는 메모리 영역에 접근하지 못한다.

MMU는 한 프로세스에게 합법적인 주소 영역을 설정하고, 잘못된 접근이 오면 trap을 발생시키며 보호한다.

base와 limit을 설정하여 접근 가능한 메모리 영역을 설정한다. 이 영역 밖에서 접근을 요구하면 trap을 발생시킨다. base와 limit 레지스터는 커널 모드에서만 수정 가능하다.

 

메모리 과할당(Over Allocating)

실제 메모리의 사이즈보다 더 큰 사이즈의 메모리를 프로세스에 할당한 상황

  1. 프로세스 실행 도중 페이지 폴트 발생
  2. 페이지 폴트를 발생시킨 페이지 위치를 디스크에서 찾음
  3. 메모리의 빈 프레임에 페이지를 올려야 하는데, 모든 메모리가 사용 중이라 빈 프레임이 없음

이러한 과할당을 해결하기 위해 빈 프레임을 확보할 수 있어야 한다.

메모리에 올라와 있는 한 프로세스를 종료시켜 빈 프레임을 얻는 방법은 페이징 시스템을 들킬 가능성이 높다. 페이징 기법은 사용자 모르게 처리해야 한다.

프로세스 하나를 swap out하고, 이 공간을 빈 프레임으로 활용한다. swapping 기법을 통해 빈 프레임을 확보하여 페이지 교체가 이뤄진다.

 

*Swapping: 현재 실행 중인 프로세스의 일부만 메모리에 올리고, 나머지 프로세스들은 보조 저장 장치에 swap out하여 저장하는 방식으로 작동

 

캐시 메모리

CPU가 재접근할 때, 메모리 참조 및 인출 과정에 대한 비용을 줄이기 위해 캐시에 저장해둔 데이터를 활용한다.

 

CPU와 기억 장치의 상호 작용

CPU에서 주소를 전달 → 캐시에 명령이 존재하는지 확인

  • 존재하면 Hit
    해당 명령어를 CPU로 전송 → 완료
  • 존재하지 않으면 Miss
    명령어를 갖고 주기억 장치로 접근 → 해당 명령어를 가진 데이터 인출 → 해당 명령어 데이터를 캐시에 저장 → 해당 명령어를 CPU로 전송 → 완료

캐시의 성능을 측정할 때 Hit latency와 Miss latency가 중요하다.

Hit latency + (Miss rate * MIss latency) 이므로 CPU가 어떤 데이터를 원할지 예측하여 캐시에 쓸모 있는 정보가 들어있도록 해야 한다. 이때 캐시의 효율을 극대화시키기 위해 어느 데이터를 원할지의 판단에 사용되는 것이 지역성의 원리이다.

 

지역성(Locality)

한 순간에 특정 부분을 집중적으로 참조하는 특성

  • 시간 지역성
    최근에 참조된 주소의 내용은 곧 다음에도 참조되는 특성
    최근 접근한 데이터에 대해 다시 접근하는 경향
  • 공간 지역성
    실제 프로그램이 참조된 주소와 인접한 주소의 내용이 다시 참조되는 특성
    최근 접근한 데이터의 주변 공간에 다시 접근하는 경향

캐싱 라인

캐시에 데이터를 저장할 시, 자료구조를 활용해 묶어서 저장

캐시에 저장하는 데이터에 데이터의 메모리 주소를 함께 저장하면서 빠르게 원하는 정보를 찾을 수 있다.

 

캐시 vs 레지스터

레지스터

  • CPU에 존재하는 다목적 저장 공간
  • 메모리 계층의 최상위에 위치
  • 가장 빠른 속도로 접근 가능한 메모리
  • 데이터와 명령어를 저장하는 역할, 현재 계산을 수행 중인 값을 저장하는 데 사용
  • 메인 메모리에서 레지스터로 데이터를 옮겨와 데이터를 처리한 후 그 내용을 다시 레지스터에서 메인 메모리로 저장하는 설계를 사용한다.

 

공통점

어떤 명령어나 데이터를 저장해두는 저장 공간

 

차이점

캐시: CPU와 별도로 있는 공간이며, 메인 메모리와 CPU 간의 속도 차이를 극복하기 위한 것

레지스터: CPU 안에서 연산을 처리하기 위하여 데이터를 저장하는 공간

 

 

 

참고

https://hojunking.tistory.com/119

https://velog.io/@rlvy98/CS-MMUMemory-Management-Unit-메모리-관리-장치#mmu의-메모리-보호

https://velog.io/@klloo/os-memory-cache#cache

https://gyoogle.dev/blog/computer-science/operating-system/Memory.html

 

'Study > CS' 카테고리의 다른 글

[CS]Network  (1) 2024.06.20
[CS]Computer Architecture - 하드웨어, 시스템 버스, CPU, 캐시 메모리  (0) 2024.05.29