1. CPU 스케줄러

CPU 스케줄러는 운영체제의 핵심 구성 요소 중 하나로, 어떤 프로세스에게 CPU를 할당할지 결정하는 역할을 합니다. 다양한 스케줄링 알고리즘을 사용해 프로세스가 실행될 준비가 되었을 때 어떤 프로세스가 CPU를 사용할지 결정합니다.

2. CPU 스케줄러 알고리즘

CPU 스케줄러 알고리즘은 CPU 스케줄러가 어떤 프로세스에 CPU를 할당할지 결정하는 알고리즘입니다. 알고리즘의 목표는 CPU 이용률을 높게, 주어진 시간에 많은 일을 하게, 준비 큐에 있는 프로세스는 적게, 응답 시간은 짧게 설정하는 것을 목표로 합니다.

크게 선점형 알고리즘과 비선점형 알고리즘을 나눌 수 있습니다.

 

2-1. 비선점형 알고리즘

현재 실행 중인 프로세스가 종료되거나 스스로 CPU를 반납할 때까지 다른 프로세스는 CPU를 사용할 수 없는 방식입니다. FCFS, SJF, 우선순위가 있습니다.

 

FCSF(First Come, First Served)

프로세스가 도착한 순서대로 CPU를 할당하는 방식입니다.

 

SJF(Shortest Job First)

실행 시간이 가장 짧은 프로세스에게 CPU를 먼저 할당하는 방식입니다.

 

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

프로세스에 우선순위를 부여하고 우선순위가 높은 프로세스에게 먼저 CPU를 할당하는 방식입니다.

2-2. 선점형 알고리즘

현재 실행 중인 프로세스를 중단하고 다른 프로세스에게 CPU를 할당하는 방식입니다. 라운드로빈, SRF, 다단계 큐가 있습니다.

 

라운드로빈(Round Robin)

각각의 프로세스에게 동일한 시간동안 CPU를 할당하는 방식입니다. 할당 시간 내에 처리를 완료하지 못하면 강제 중단 후 다음 작업으로 넘어갑니다. 처리하지 못한 프로세스는 준비 큐(ready queue)의 뒤로 가게 됩니다.

준비 큐(ready queue)란? 운영체제 내에서 CPU를 할당받을 준비가 완료된 프로세스들이 대기하는 큐(queue) 자료구조입니다.

 

 

SRFT(Shortest Remaining Time First)

남은 실행 시간이 가장 짧은 프로세스에게 먼저 CPU를 할당합니다. 만약 중간에 더 짧은 작업 작업이 들어오면 수행하던 프로세스는 중지하고 해당 프로세스를 수행합니다.

 

다단계 큐(Multilevel Queue Scheduling)

여러 개의 큐를 사용하여 프로세스를 관리합니다. 우선순위에 따른 준비 큐를 여러 개 사용하고 큐마다 라운드 로빈이나 FCFS 등 다른 스케줄링 알고리즘을 적용하는 것을 말합니다.

 

 

728x90

'운영체제' 카테고리의 다른 글

[운영체제] 스레드  (0) 2024.05.10
[운영체제] 멀티 프로세싱  (0) 2024.05.09
[운영체제] 프로세스  (0) 2024.05.08
[운영체제] 메모리 관리  (0) 2024.05.05
[운영체제] 캐시(Cache)  (0) 2024.05.04

1. 스레드

스레드는 프로세스의 실행 가능한 가장 작은 단위입니다. 하나의 프로세스는 여러 스레드를 가질 수 있습니다. 최소한 하나의 스레드를 갖고 있어야 합니다.

출처: https://velog.io/@aeong98/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C

 

프로세스는 독립된 메모리 주소 공간을 가지며 이 공간에는 코드, 데이터, 스틱, 힙이 포함됩니다. 프로세스 내의 스레드는 스레드끼리 프로세스의 자원(코드, 데이터, 힙)을 공유합니다. 그 외의 영역은(스택 영역 등)은 스레드끼리 공유하지 않으며 독립적으로 갖고 있습니다.

 

2. 싱글스레딩 vs 멀티스레딩

싱글스레딩프로그램이 하나의 스레드로 실행되는 방식인 반면, 멀티스레딩프로그램이 여러 개의 스레드로 실행되는 방식입니다.

출처: https://velog.io/@gil0127/%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9CSingle-thread-vs-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C-Multi-thread-t5gv4udj

2-1. 싱글스레딩

  • 장점
    - 단순한 작업에 적합
    - 구현이 간단하며 스레드 간의 동기화나 데이터 공유에 대한 걱정 없음
  • 단점
    - 한 번에 하나의 작업만 수행할 수 있음
    - 하나의 작업이 완료된 후에야 다음 작업을 시작할 수 있음(순차적으로 작업 실행)
    - CPU 활용도가 낮고 복잡한 작업에는 비효율적일 수 있음

2-2. 멀티스레딩

  • 장점
    - 각 스레드는 독립적으로 실행되며 동시에 여러 작업을 수행할 수 있음
    - 스레드 간 자원 공유와 통신이 가능하여 효율적인 협업이 이루어짐
    - 병렬 처리를 통해 CPU 활용도를 높일 수 있음
    - 복잡한 작업이나 I/O작업이 많은 경우에 효과적(한 스레드가 중단(blocked)되어도 다른 스레드는 실행 상태(running)일 수 있기 때문에 중단되지 않은 빠른 처리 가능)
  • 단점
    - 스레드 2개 이상이 공유 데이터에 접근하면 문제가 발생할 수 있음 -> 스레드 동기화 필요(데이터의 일관성과 정확성을 유지하기 위해 스레드들의 실행 순서를 제어하는 방법)
    - 구현이 상대적으로 복잡하고 디버깅이 어려울 수 있음
    - 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 프로세스에 영향을 줄 수 있음
  싱글스레딩 멀티스레딩
스레드 수 1개 여러 개
자원 사용 낮음 높음
구현 난이도 낮음 높음
성능 일반적으로 낮음 높음(특히 멀티코어/멀티CPU에서)
동기화 문제 X O(교착 상태(Deadlock) 등)

3. 공유 자원

공유 자원(Shared Resource)은 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수 등을 말합니다. 

3-1. 경쟁 상태(Race Condition)

공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태(race condition)라고 합니다.

예를 들어, 두 스레드가 같은 변수를 동시에 수정하려고 할 때 경쟁 상태가 발생하는 상황입니다.

3. 임계 영역(Critical Section)

임계 영역은 둘 이상의 스레드가 공유 자원에 접근할 때 동시에 실행되면 안되는 코드 영역을 말합니다. 임계 영역에서는 고유 자원이 변경될 수 있으므로 한 번에 하나의 스레드만 이 구간을 실행할 수 있어야 합니다. 임계 영역 문제를 해결하기 위해서는 다음과 같은 조건을 만족해야 합니다.

  1. 상호 배제(Mutual Exclusion): 한 시점에 하나의 스레드만 임계 영역을 실행할 수 있습니다.
  2. 진행(Progress): 임계 영역에 들어가려는 스레드가 선택되어야 하며, 이 선택은 무한히 지연될 수 없습니다.
  3. 한정된 대기(Bouned Waiting): 한 스레드가 임계 영역에 들어가기 위해 대기하는 시간은 한정되어 있어야 합니다. 다시 말해, 무한히 대기 상태에 머물 수 없습니다. 

임계 영역의 동시 접근을 해결하기 위한 방법은 크게 뮤텍스, 세마포어, 모니터가 있습니다.

 

뮤텍스(mutex, mutual exclusion의 약자)

뮤텍스는 임계 영역에 상호 배제를 보장하는 잠금 메커니즘입니다.

뮤텍스는 잠금(lock())과 해제(unlock()), 두 가지의 상태를 가집니다. 임계 영역을 실행하려는 스레드는 먼저 뮤텍스를 획득(잠금)해야 합니다. 임계 영역을 빠져나올 때는 뮤텍스를 반납(해제)합니다. 만약 스레드가 뮤텍스를 이미 획득한 상태라면 다른 스레드는 뮤텍스가 해제될 때까지 대기해야 합니다.

 

세마포어(semaphore)

세마포어는 일반화된 뮤텍스입니다. 정수 값을 가지는 변수로, 여러 개의 스레드가 공유 자원에 접근할 수 있는 개수를 제한합니다. 정수와 wait()(또는 P())와 signal()(또는 V()) 함수로 공유 자원에 대한 접근을 처리합니다. 

  • wait(): 자신의 차례가 올 때까지 기다리는 함수
  • signal(): 다음 프로세스로 순서를 넘겨주는 함수 

세마포어는 다음과 같이 작동합니다. 

  1. 세파모어는 초기값으로 설정됩니다. 이 값은 동시에 공유 자원이 접근할 수 있는 스레드의 수를 나타냅니다.
  2. wait()연산: 공유 자원에 접근하기 전에 스레드는 wait 연산을 호출합니다. 이 연산은 세마포어의 값을 감소시키고 값이 0보다 작아지면 해당 스레드는 대기 상태가 됩니다.
  3. signal()연산: 공유 자원을 사용한 후에 스레드는 signal 연산을 호출합니다. 이 연산은 세마포어의 값을 증가시키고, 대기 중인 스레드 중 하나를 깨워서 진행합니다.

세마포어에는 카운팅 세마포어바이너리 세마포어가 있습니다.

  1. 카운팅 세마포어(counting semaphore)
    값이 0 이상의 정수를 가질 수 있는 세마포어입니다. 여러 개의 스레드가 공유 자원에 접근할 수 있는 개수를 제한하는 데 사용됩니다.
  2. 바이너리 세마포어(binary semaphore)
    값이 0 또는 1만 가능한 세마포어입니다. 상호 배제를 구현하는데 사용되며 뮤텍스와 유사한 역할을 합니다. 뮤텍스는 잠금을 기반으로 상호배제가 일어나는 '잠금 메커니즘'이고, 세마포어는 신호를 기반으로 상호 배제가 일어나는 '신호 메커니즘'입니다.

모니터(monitor)

모니터는 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공합니다. 모니터큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리합니다.

 

4. 교착 상태

교착상태(deadlock)는 두 개 이상의 프로세스 또는 스레드가 서로가 가진 자원을 기다리면서 무한정 대기하는 상태을 말합니다.

출처: https://lealea.tistory.com/244

교착상태를 잘 설명하는 예시로 '식사하는 철학자들' 문제가 있습니다.

다섯 명의 철학자가 하나의 원탁에 앉아 식사를 한다. 각각의 철학자들 사이에는 포크가 하나씩 있고, 앞에는 접시가 있다. 접시 안에 든 요리는 포크를 두개 사용하여 먹어야만 하는 스파게티이다. 그리고 각각의 철학자는 다른 철학자에게 말을 할 수 없으며, 번갈아가며 각자 식사하거나 생각하는 것만 가능하다. 따라서 식사를 하기 위해서는 왼쪽과 오른쪽의 인접한 철학자가 모두 식사를 하지 않고 생각하고 있어야만 한다. 또한 식사를 마치고 나면, 왼손과 오른손에 든 포크를 다른 철학자가 쓸 수 있도록 내려놓아야 한다. 이 때, 어떤 철학자도 굶지 않고 식사할 수 있도록 하는 방법은 무엇인가?

교착 상태가 발생하기 위해서는 다음 4가지 조건이 모두 만족되어야 합니다.

  • 상호 배제(Mutual Exclstion): 한 번에 하나의 프로세스만 자원을 사용할 수 있어야 합니다.
  • 점유 대기(Hold and Wait): 프로세스가 적어도 하나의 자원을 점유하고 있으면서, 다른 프로세스가 점유하고 있는 자원을 기다려야 합니다.
  • 비선점(No Preemption): 프로세스가 점유하고 있는 자원을 강제로 빼앗을 수 없어야 합니다.
  • 순환 대기(Circular Wait): 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 점유하고 있어야 합니다.

교착 상태의 해결 방법은 크게 4가지로 나눌 수 있습니다.

1️⃣ 예방(Prevention): 교착 상태의 조건 중 하나를 만족하지 않도록 시스템을 설계합니다.

2️⃣ 회피(Avoidance): 자원 요청 시 교착 상태가 발생할 가능성이 있는지 미리 검사하고 안전한 경우에만 자원을 할당압니다. 대표적으로 "은행원 알고리즘"을 씁니다.

3️⃣ 탐지(Detection) 및 회복: 회복(Recovery): 교착 상태가 발생하면 교착 상태에 있는 프로세스를 하나씩 강제로 종료하거나 교착상태가 회복될 때까지 한 프로세스에게 자원을 몰아줍니다.

4️⃣ 무시(Ignorance): 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 큽니다. 따라서 교착 상태가 발생하면 사용자가 작업을 종료하게 합니다. 많은 운영체제가 이 방법을 사용하고 있습니다.

728x90

'운영체제' 카테고리의 다른 글

[운영체제] CPU 스케줄링 알고리즘  (0) 2024.05.10
[운영체제] 멀티 프로세싱  (0) 2024.05.09
[운영체제] 프로세스  (0) 2024.05.08
[운영체제] 메모리 관리  (0) 2024.05.05
[운영체제] 캐시(Cache)  (0) 2024.05.04

1. 멀티 프로세싱

멀티프로세싱은 여러 개의 프로세스, 동시에 두 가지 이상의 일을 수행할 수 있는 것을 말합니다.

1-1. 웹 브라우저

웹 브라우저의 멀티프로세싱은 브라우저가 여러 개의 프로세스를 사용하여 웹 페이지를 로드하고 실행하는 것을 말합니다.

  • 브라우저 프로세스: 탭 바, 주소창, 북마크 바, 설정 메뉴 등 브라우저의 UI 요소를 렌더링
  • 렌더러 프로세스: 웹 페이지에서 보이는 부분의 모든 것을 제어
  • 플러그인 프로세스: PDF 뷰어, Flash Player 등의 브라우저 플러그인을 실행하기 위해 사용
  • GPU 프로세스: 웹 페이지의 그래픽 처리를 담당. WebGL, CSS, 애니메이션 등 GPU를 사용하는 작업을 처리.

1-2. IPC(Inter Process Communication)

멀티 프로세싱 환경에서 여러 프로세스가 동시에 작업을 수행하면서 서로 정보를 주고 받거나 동기화하는 것이 필수적인데, 이 때 사용되는 기술이 IPC입니다. 정리하자면, IPC는 프로세스들 사이에서 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로입니다.

 

IPC의 종류로는 공유 메모리, 파일, 소켓, 파이프, 메시지 큐가 있습니다.

 

공유 메모리

  • 개념: 여러 프로세스가 동일한 메모리 영역을 접근하여 데이터를 공유하는 방식

특징
- 각 프로세스의 메모리를 다른 프로세스가 접근할 수 없지만 공유 메모리를 통해 여러 프로세스가 하나의 메모리를 공유 가능
- 메모리 자체를 공유하기 때문에 불필요한 데이터 복사의 오버헤드가 발생하지 않아 가장 빠름
- 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 공기화가 필요

 

파일

  • 개념: 파일 시스템을 통해 데이터를 주고 받는 방식
  • 특징
    - 영구적인 데이터 저장
    - 속도가 느림

소켓

  • 개념: 네트워크를 통해 프로세스 간 데이터를 주고 받는 방식
  • 특징
    - TCP와 UDP가 있음

파이프

  • 개념: 2개의 프로세스 입출력을 직렬 연결하여 데이터를 주고 받는 방식
  • 특징
    - 익명 파이프(Anonymous PIPE)명명된 파이프(Named PIPE) 존재

익명 파이프(Anonymous PIPE)

  • 개념: 부모-자식 프로세스 간에만 통신할 수 있는 파이프(자식 프로세스란 부모 프로세스에 의해 생성된 프로세스로 부모 프로세스의 코드를 복사하여 생성되므로 부모 프로세스의 일부 상태를 상속받음)
  • 특징
    - 프로세스 간에 FIFO 방식으로 읽히는 임시 공간
    - 단방향 통신으로 읽기 전용, 쓰기 전용 파이프를 만들어서 작동

명명된 파이프(Named PIPE)

  • 개념: 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 이름있는 단방향/양방향 파이프
  • 특징
    - 단방향 또는 양방향 가능
    - 여러 파이프를 동시에 사용 가능
    - 컴퓨터의 프로세스끼리 또는 다른 네트워크상의 컴퓨터와도 통신 가능

메시지 큐

  • 개념: 메시지를 큐(queue) 데이터 구조 형태로 관리하는 것
  • 특징
    - 커널의 전역 변수 형태 등 커널에서 전역적으로 관리됨
    - 사용 방법이 매우 직관적이고 간단
    - 다른 코드의 수정 없이 단지 몇 줄의 코드를 추가시켜 간단하게 메시지 큐에 접근 가능

 

728x90

'운영체제' 카테고리의 다른 글

[운영체제] CPU 스케줄링 알고리즘  (0) 2024.05.10
[운영체제] 스레드  (0) 2024.05.10
[운영체제] 프로세스  (0) 2024.05.08
[운영체제] 메모리 관리  (0) 2024.05.05
[운영체제] 캐시(Cache)  (0) 2024.05.04

1. 프로세스(Process)란?

컴퓨터에서 실행되고 있는 프로그램을 말하면 CPU 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰입니다.

프로그램은 일반적으로 하드 디스크 등에 저장되어 있는 실행코드를 뜻하고, 프로세스프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 지칭합니다.

예를 들어, 프로그램은 구글 크롬 프로그램(chrome.exe)와 같은 실행 파일이며, 이를 두 번 클릭하면 구글 크롬 프로세스로 변환되는 것입니다.

위 그림처럼 프로그램이 메모리에 올라가면 프로세스가 되는 인스턴스화가 일어나고, 이후 운영체제의 CPU 스케줄러에 따라 CPU가 프로세스를 실행합니다.

  프로그램 프로세스
정의 디스크 등의 저장 장치에 저장되어 있는 특정 작업을 수행하기 위해 프로그래밍 언어로 작성된 코드 집합 실행 중인 프로그램의 인스턴스(instance)
상태 정적인 상태로 존재 동적인 상태로 실행 중
메모리 사용 디스크 등의 저장 장치에 저장되어 잇음 메모리에 로드되어 실행됨
자원 사용 자원을 직접 사용하지 않음 CPU, 메모리, 파일 등의 시스템 자원을 사용
식별자 파일 이름을 식별 프로세스 ID(PID)로 식별

 

 

2. 프로세스와 컴파일 과정

프로그램을 구성하는 언어는 다양합니다. 컴파일 언어인 C 언어 기반의 프로그램을 기준으로 설명하겠습니다.

컴파일 과정은 프로그램 실행 전에 이루어지며, 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 작업입니다.

전처리

소스 코드의 주석을 제거하고 #include, #define 등 헤더 파일을 병합하여 매크로를 치환합니다.

 

컴파일러

전처리된 소스 코드를 어셈블리어로 번역합니다. 이 과정에서 구문 분석, 오류 처리, 코드 최적화 작업 등이 수행됩니다.

 

어셈블러

어셈블러가 어셈블리어 코드를 목적 코드(기계어, object code)로 변환합니다. 이때 확장자는 리눅스 기준으로 .o입니다.(운영체제마다 확장자는 다릅니다.)

 

링커

컴파일된 여러 개의 object 파일(프로그램 내에 있는 라이브러리 함수  + 다른 파일들 + object code)을 하나의 실행 파일로 묶습니다.

실행 파일 확장자는 .exe 또는 .out 입니다.

 

라이브러리는 프로그램에서 재사용 가능한 코드를 모아놓은 것을 의미합니다. 코드 재사용성을 높여주고, 프로그램을 더 효율적으로 관리할 수 있게 해줍니다. 라이브러리는 정적과 동적으로 나뉩니다.

정적 라이브러리는 프로그램이 컴파일 될 때 프로그램 코드에 포함되어 있는 라이브러리입니다. 라이브러리 코드가 최종 실행 파일(.exe or .out 파일) 안에 직접 포함되어 배포합니다.

  • 특징
    - 배포 용이성: 시스템 환경 등 외부 의존도가 낮기 때문에 실행 파일 하나로 손쉽게 배포 가능합니다.
    - 메모리 효율성 저하: 코드 중복 등 메모리 효율성이 떨어지는 단점이 있습니다.

동적 라이브러리는 프로그램이 실행 중에 필요할 때만 메모리로 로드되는 라이브러리입니다. 시스템의 동적 링크 라이브러리(DLL 파일들) 또는 공유 객체(.so 파일들) 형태로 존재하며 실행 파일과 분리되어 있습니다.

  • 특징
    - 메모리 효율성: 여러 프로그램이 동일한 라이브러리를 공유할 수 있으므로 시스템 메모리 사용이 줄어듭니다.
    - 외부 의존도 증가: 동적 라이브러리가 프로그램 실행 중에 필요한 코드나 데이터를 로드하기 위해 해당 라이브러리 파일이 시스템에 설치되어 있어야 하기 때문에 외부 의존도가 높습니다.

3. 프로세스의 상태

프로세스의 상태는 프로그램 필행 중에 프로세스가 어떤 상황에 있는지를 나타내며, 운영 체제의 스케줄러에 의해 관리됩니다.

3-1. 생성 상태(create)

프로세스가 생성되고 초기화되는 상태를 의미하여 fork() 또는 exec() 함수를 통해 생성합니다. 이때 PCB가 할당됩니다.

  • fork(): 부모 프로세스의 주소 공간을 그대로 복사하며 새로운 자식 프로세스를 생성하는 함수
  • exec(): 새롭게 프로세스를 생성하는 함수

3-2. 대기 상태(ready)

프로세스가 실행을 위해 필요한 메모리 등의 리소스를 할당받고, CPU에서 실행될 차례를 기다리는 상태입니다.

메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기합니다.

3-3. 대기 중단 상태(ready suspended)

메모리 부족으로 일시 중단된 상태입니다.

3-4. 실행 상태(running)

프로세스가 CPU를 할당받아 실제로 명령어를 실행하고 있는 상태입니다. 프로세스는 계산을 수행하거나 명령어를 처리합니다.

이를 CPU brust가 일어났다고도 표현합니다.

3-5. 중단 상태(blocked)

프로세스가 특정 이벤트나 조건을 만족할 때까지 실행을 멈추고 기다리는 상태입니다. 예를 들어 프린트 인쇄 버튼을 눌렀을 때 프로세스가 잠깐 멈춘 듯할 때가 바로 중단 상태입니다.

3-6. 일시 중단 상태(blocked suspended)

대기 상태와 비슷합니다. 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태입니다.

3-7. 종료 상태(terminated)

프로세스가 실행을 완료하고 시스템에서 제거되는 상태입니다. 사용했던 모든 리소스를 운영 체제가 회수하고, 프로세스는 시스템에서 완전히 제거됩니다.

4. 프로세스의 메모리 구조

프로세스의 메모리 구조란 프로세스가 실행될 때 시스템 내부에서 할당되는 메모리 공간을 뜻합니다. 코드 영역 (code segment), 데이터 영역(BSS segment, data segment), 힙(heap), 스택(stack)으로 나뉩니다.

스택은 높은 메모리 주소부터 할당되고 힙은 낮은 메모리 주소부터 할당됩니다.

스택과 힙은 동적 할당에 해당되며 데이터와 코드는 정적 할당되는 영역입니다. 동적 할당은 런타임 단계에서 메모리를 할당받는 것이며, 정적 할당은 컴파일 단계에서 메모리를 할당하는 것을 의미합니다.

출처: https://zangzangs.tistory.com/107

4-1. 스택 영역

함수 호출과 관련된 지역 변수, 함수 매개변수, 반환 주소 등을 저장하는 데 사용됩니다. 각 함수 호출은 스택에 자신만의 스택 프레임을 생성하며, 함수 실행이 완료되면 해당 스택 프레임은 제거됩니다. 스택은 메모리 주소가 높은 곳에서 낮은 곳으로 확장됩니다.

 

4-2. 힙 영역

힙은 동적으로 할당되는 변수들을 담습니다. malloc(), free() 등과 같은 함수를 이용하여 런타임에 메모리를 동적으로 할당할 수 있습니다.

 

4-3. 데이터 영역

데이터 영역은 BSS segment, Data segment로 나눠서 저장합니다.

BSS segment(Block Started by Symbol): 전역 변수, static, const로 선언되어 있고 0으로 초기화 또는 초기화가 어떤 값으로도 되어 있지 않은 변수들이 이 메모리 영역에 할당됩니다.

Data segment(Initialized Data Segment): 전역 변수,static, const로 선언되어 있고 0이 아닌 값으로 초기화된 변수가 이 메모리 영역에 할당됩니다.

4-4. 코드 영역

프로그램의 실행 코드가 저장되는 메모리 영역입니다.

5. 프로세스 제어 블록(PCB)

PCB(Process Control Block)은 운영체제가 각 프로세스를 관리하기 위해 사용하는 중요한 데이터 구조입니다. 프로세스에 대한 메타데이터를 저장한 데이터를 말합니다. 프로세스가 생성되면 운영체제는 해당 PCB를 생성합니다.

프로그램 실행 -> 프로세스 생성 -> 프로세스 주소 값들에 스택, 힙 등의 구조를 기반으로 메모리 할당 -> 프로세스의 메타데이터들이 PCB에 저장되어 관리

5-1. PCB 구조

PCB는 일반적으로 다음과 같은 정보를 포함합니다.

  • 프로세스 스케줄링 상태: CPU에 대한 소유권을 얻은 이후의 상태 = 프로세스의 현재 상태(ready, running, waiting 등)
  • 프로세스 ID: 각 프로세스를 고유하게 식별하는 번호
  • 프로세스 권한: 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
  • 프로그램 카운터: 프로세스가 다음에 실행할 명령어의 주소에 대한 포인터
  • CPU 레지스터: 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
  • CPU 스케줄링 정보: 프로세스 우선순위, 스케줄링 큐에 대한 포인터 등 스케줄링 결정에 필요한 정보
  • 계정 정보: 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
  • I/O 상태 정보: 프로세스에 할당된 I/O 디바이스 목록

5-2. 컨텍스트 스위칭(Context Switching)

컨텍스트 스위칭은 PCB를 기반으로 운영체제에서 CPU가 이전 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 불러오는 과정을 말합니다. 이 과정을 통해 하나의 CPU가 여러 프로세스를 번갈아 가며 실행할 수 있게 되어, 사용자는 여러 프로그램이 동시에 실행되는 것처럼 느끼게 됩니다.

출처: https://www.crocus.co.kr/1364

프로세스 P0를 실행하다가 멈추고, 프로세스 P0의 PCB를 저장하고 프로세스 P1을 로드하여 실행합니다.

그리고 다시 프로세스 P1의 PCB를 저장하고 프로세스 P0의 PCB를 로드합니다.

컨텍스트 스위칭에 드는 비용으로 유휴시간캐시미스가 있습니다.

유휴 시간이란 컴퓨터 시스템이 사용 가능한 상태이나 실제적인 작업이 없는 시간을 말합니다. 상태 정보를 저장하고 로드하는 데 시간을 소비합니다. 

CPU 캐시가 새로운 프로세스의 작업에 맞게 다시 채워져야 하기 때문에 캐시미스가 발생할 수 있습니다.

728x90

'운영체제' 카테고리의 다른 글

[운영체제] CPU 스케줄링 알고리즘  (0) 2024.05.10
[운영체제] 스레드  (0) 2024.05.10
[운영체제] 멀티 프로세싱  (0) 2024.05.09
[운영체제] 메모리 관리  (0) 2024.05.05
[운영체제] 캐시(Cache)  (0) 2024.05.04

운영체제의 대표적인 할 일 중 하나가 메모리 관리입니다. 메모리 관리를 통해 컴퓨터 내의 한적된 메모리를 효과적으로 사용할 수 있도록 합니다.

1. 가상 메모리(Virtual Memory)

컴퓨터 시스템에서 실제 물리 메모리(RAM)의 크기 제한을 극복하고, 프로세스에게 더 큰 메모리 공간을 제공하기 위한 메모리 관리 기법입니다.

가상 메모리의 주요 목적은 한정된 물리적 메모리(RAM)를 효율적으로 활용하여 더 많은 프로그램을 동시에 실행시키고, 프로그램의 성능을 향상시키며, 메모리 관리를 간편하게 만드는 것입니다.

 

각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 줍니다.

가상 주소(logical address): 가상적으로 주어진 주소

실제 주소(physical address): 실제 메모리(RAM)상에 있는 주소

가상 주소는 메모리관리장치(MMU)에 의해 실제 주소로 변환됩니다. 이 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축할 수 있게 됩니다.

1-1. 스와핑(Swapping)

  • 정의: 실행 중인 프로세스 전체를 메모리에서 보조 기억장치(하드 디스크 등)로 옮기거나, 보조 기억장치에서 메모리로 다시 가져오는 작업
  • 목적
    - 메모리 공간 확보: 메모리가 부족한 상황에서 운영체제는 스와핑을 통해 현재 실행 중인 프로세스 중 일부를 보조기억장치로 이동하여 메모리 공간을 확보합니다.
    - 다중 프로그래밍 지원: 더 많은 프로세스를 동시에 실행할 수 있도록 합니다.

2. 메모리 할당

사용자가 사용하는 프로세스들을 메모리에 할당하는 방식으로 연속 할당 방식불연속 할당 방식이 있습니다.

2-1. 연속 할당 방식

연속 할당 방식은 메모리에 올릴 때 주소 공간을 여러 개로 분할하지 않고 물리적 메모리의 한 곳에 연속적으로 적재하는 방식입니다.

고정 분할 기법동적 분할 기법이 있습니다.

  • 고정 분할 기법이란?
    메모리를 미리 정해진 크기의 분할 영역으로 나누고, 프로세스를 각 분할 영역에 할당하는 방식입니다. 필요한 용량보다 더 큰 메모리를 받으면 메모리가 낭비됩니다.(내부단편화)
    아래 그림과 같이 메모리에 100MB 공간이 있고 프로세스C는 80MB 공간을 차지한다면 20MB 메모리가 낭비됩니다. 20MB의 여유 메모리가 존재하지만 크기가 작아 다른 프로세스가 해당 메모리를 사용할 수 없게 됩니다.

 

  • 동적 분할 기법이란?
    프로세스의 크기에 따라 동적으로 메모리를 분할하는 방법입니다. 즉, 프로세스의 크기에 맞게 메모리를 동적으로 할당하고 해제합니다. 메모리를 적재하고 해체하는 작업을 반복하면서 hole(할당할 수 있는 비어 있는 메모리 공간)이 발생하게 됩니다. 이때 남아있는 메모리의 크기가 실행하고자 하는 프로세스보다 크지만, 연속적이지 않은 공간에 존재하여 실행하지 못하는 상황이 발생합니다.(외부 단편화)

 

2-2. 불연속 할당 방식

메모리를 연속적으로 할당하지 않는 방식을 불연속 할당 방식이라고 합니다. 페이징(Paging), 세그멘테이션(Segmentation), 페이지드 세그멘테이션(Paged Segmentation) 기법이 있습니다.

2-2-1. 페이징(Paging)

페이징은 프로세스의 논리 주소 공간페이지(page)라는 일정 단위로 자르고, 메모리의 물리 주소 공간프레임(frame)이라는 페이지와 동일한 일정한 단위로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법을 의미합니다.

  • 페이지(Page): 가상 메모리를 일정한 크기로 나눈 블록
  • 프레임(Frame): 실제 메모리를 일정한 크기로 나눈 블록
  • 페이지 테이블(Page Table): 페이지와 프레임의 매핑 정보를 저장하는 테이블. 각 프로세스는 자신의 페이지 테이블을 갖고 있음.

 

페이지 폴트(Page Fault)란?

프로그램을 실행 시 프로세스를 구성하는 모든 페이지를 물리적 메모리에 올리지 않고 당장 필요한 페이지만 메모리에 올립니다. 따라서 CPU(프로세스)가 접근하려는(요청한) 페이지가 현재 실제 메모리에 없어서 발생하는 상황이 발생할 수 있습니다. 이를 페이징 폴트라고 합니다.

  • 해결 방법
    1. 어떤 명령어가 유효한 가상 주소에 접근했으나 해당 페이지가 없다면 트랩이 발생되어 운영체제에 알림
    2. 운영체제는 실제 디스크로부터 사용하지 않은 프레임을 찾음
    3. 해당 프레임을 실제 메모리에 가져와서 페이지 교체 알고리즘을 기반으로 특정 페이지와 교체(스와핑 발생)
    4. 페이지 테이블을 갱신시킨 후 해당 명령어를 다시 시작

스레싱(thrashing)이란?

페이지 폴트가 과도하게 발생하여 실제 유용한 작업을 수행하지 못하고 페이지 교체 작업에만 시스템 자원을 소비하여 시스템 성능이 급격히 저하되는 현상을 말합니다. 

  • 원인
    - 과도한 멀티프로그래밍: 메모리 용량에 비해 너무 많은 프로세스를 동시에 실행하려는 경우 스와핑이 많이 일어나서 발생할 수 있습니다.
    - 부적절한 페이지 교체 알고리즘: 페이지 교체 알고리즘이 효율적이지 않아 자주 사용되는 페이지가 메모리에서 제거되고 곧바로 다시 필요해지는 경우 페이지 폴트가 빈번하게 발생할 수 있습니다.
  • 해결방법
    - 작업 세트(working set): 프로세스가 실행 중에 주로 참조하는 페이지의 집합을 만들어서 미리 메모리에 로드하는 것
      -> 미리 메모리에 로드하면 탐색 비용 감소, 스와핑 감소
    - PFF(Page Fault Frequency): 일정 시간 동안 발생하는 페이지 폴트의 수
      -> 낮은 PFF: 프로세스가 필요로 하는 페이지가 대부분 메모리에 존재하여 페이지 폴트가 적게 발생(시스템 성능 좋음)
      -> 높은 PFF: 프로세스가 필요로 하는 페이지가 메모리에 없어서 페이지 폴트가 많이 발생(시스템 성능 저하)
      -> 상한선 도달 시, 프레임을 늘려 더 많은 페이지를 메모리에 유지시킵니다. 반대로, 하한선 도달 시 프레임을 줄입니다.

2-2-2. 세그멘테이션(Segmentation)

페이지 단위가 아닌 논리적인 단위인 세그먼트(segment)로 나누는 방식입니다. 프로세스를 이루는 메모리는 코드, 데이터, 스택, 힙으로 이루어집니다. 각 segment는 코드, 데이터, 스택, 힙 프로그램의 논리적인 구성 요소를 나타내며 크기가 가변적입니다. 프로세스는 여러 segment로 구성됩니다.

프로그램의 논리적 구조를 반영하여 메모리를 관리하므로 프로그램 개발 및 관리가 용이합니다. 예를 들어, 데이터와 코드를 분리하여 관리할 수 있습니다. 하지만, 논리적인 단위로 나누기 때문에 segment의 크기가 다양하므로 다양한 크기의 hole이 발생할 수 있는 단점이 있다.(외부 단편화 발생)

2-2-3. 페이지드 세그멘테이션(Paged Segmentation)

페이징 기법과 세그멘테이션을 결합한 방식입니다. 가상 메모리를 segment로 나누고 각 segment를 다시 동일한 크기인 페이지로 나누어 관리합니다. 이 방식은 세그멘테이션의 논리적인 구조와 페이징의 물리적인 구조를 모두 활용하여 메모리를 효율적으로 관리할 수 있습니다. 하지만 구현이 복잡하다는 단점이 있습니다.

3.  페이지 교체 알고리즘

  • 배경
    메모리는 한정되어 있기 때문에 스와핑(페이지 교체)이 많이 일어납니다. 이 알고리즘은 제한된 메모리(RAM)에서 프로세스들이 필요로 하는 페이지를 효율적으로 관리하는 역할을 합니다. 운영 체제는 페이지 교체 알고리즘을 사용하여 메모리(RAM)에서 교체할 페이지를 선택하고 선택된 페이지를 보조 기억 장치로 내보내고 요청된 페이지를 메모리(RAM)로 가져옵니다.

3-1. 오프라인 알고리즘(offline algorithm)

  • 의미: 먼 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘
  • 특징
    미래에 사용되는 프로세스를 미리 알 수 없어서 사용할 수 없는 알고리즘입니다. 하지만 가장 좋은 알고리즘이기 때문에 다른 알고리즘과의 성능 비교에 대한 상한 기준(upper bound)을 제공합니다.

3-2. FIFO(First In First Out)

  • 의미: 가장 먼저 메모리에 들어온 페이지를 가장 먼저 내보내는 방식
  • 특징
    - 간단하지만 자주 사용되는 페이지가 먼저 들어왔다면 교체될 가능성이 높아 비효율적일 수 있습니다.

3-2. LRU(Least Recently Used)

  • 의미: 가장 오랫동안 사용되지 않은 페이지를 교체하는 방식입니다. 
  • 특징
    - 최근에 사용된 페이지는 곧 다시 사용될 가능성이 높다는 '지역성(Locality)' 원리에 기반합니다.
    - 오래된 것을 파악하기 위해 각 페이지마다 계수기(Counter), 스택을 두어야 하는 문제점이 있습니다.

3-3. NUR(Not Used Recently)

LRU에서 발전한 기법입니다.

  • 정의: 최근 사용되지 않은 페이지들 중에 교체 페이지를 선택합니다.
  • 특징
    - LRU에서 발전한 기법입니다.
    - clock 알고리즘이라고도 합니다.

3-4. LFU(Least Frequently Used)

  • 의미: 가장 참조 횟수가 적은 페이지(많이 사용되지 않은 페이지)를 교체하는 방식입니다. 
  • 특징
    - 자주 사용되는 페이지를 메모리에 유지할 수 있지만, 최근성을 고려하지 않아 오래된 페이지가 계속 메모리에 남아있을 수 있습니다.
728x90

'운영체제' 카테고리의 다른 글

[운영체제] CPU 스케줄링 알고리즘  (0) 2024.05.10
[운영체제] 스레드  (0) 2024.05.10
[운영체제] 멀티 프로세싱  (0) 2024.05.09
[운영체제] 프로세스  (0) 2024.05.08
[운영체제] 캐시(Cache)  (0) 2024.05.04

캐시(Cache)

캐시란 자주 사용되는 데이터를 메인 메모리보다 접근 속도가 빠른 캐시 메모리에 임시로 저장해 놓는 장치입니다. 캐시를 사용하면 메인 메모리에 직접 접근하는 대신 캐시 메모리에서 데이터를 읽어올 수 있기 때문에 데이터 접근 시간을 단축할 수 있습니다.

  • 캐시 계층: 속도 차이를 해결하기 위해 계층과 계층 사이에 있는 계층(ex. 램과 CPU 사이의 속도 차이가 크기 때문에 그 중간에 레지스터 계층을 둬서 속도 차이 해결)

1. 지역성(Locality)의 원리

캐시 계층을 두지 말고 캐시를 직접 설정할 때는 자주 사용하는 데이터를 기반으로 설정해야 합니다. 이 데이터에 대하는 근거는 지역성입니다.

지역성의 원리는 캐시 메모리 설계와 최적화에 매우 중요한 역할을 합니다.

  1. 시간 지역성(Temporal Locality)
    프로그램이 최근에 액세스 한 메모리 위치를 가까운 미래에 다시 액세스 할 가능성이 높다는 것입니다. 예를 들어, 반복문 내에서 같은 변수를 반복적으로 사용하는 경우가 이에 해당합니다. 시간 지역성이 높으면 캐시 적중률이 높아집니다.
  2. 공간 지역성(Spatial Locality)
    최근 근접한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성을 의미합니다. 예를 들어, 배열을 순차적으로 탐색하는 경우가 이에 해당합니다.

2. 캐시 Hit & 캐시 Miss

캐시가 효율적으로 동작하려면, 캐시의 적중률(Hit-rate)를 극대화해야 합니다.

캐시 메모리에 접근했을 때 원하는 정보가 있을 수도 없을 수도 있습니다. 이때 원하는 정보가 있다면 적중(Hit), 없다면 실패(Miss)했다고 합니다.

출처: https://velog.io/@skypinkhs0718/%EC%BA%90%EC%8B%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

캐시 hit의 경우, 해당 데이터를 제어장치를 거쳐 가져오게 됩니다. 위치도 가깝고 CPU 내부에서 작동하기 때문에 빠릅니다.

반면 miss의 경우,  데이터를 메모리에서 가져오게 되는데 이는 시스템을 기반으로 작동하기 때문에 느립니다.

캐시 적중률 = 캐시 적중 횟수/ 전체 요청 횟수(적중률이 0.95~0.99일 때 우수하다고 함)

 

3. 캐시 매핑

캐시 매핑은 컴퓨터 시스템에서 메인 메모리의 데이터를 캐시 메모리에 어떻게 저장하고 검색할 것인지를 결정하는 방법을 의미합니다.

캐시 매핑에는 3가지 방법이 있습니다.

  1. 직접 매핑: 메인 메모리와 캐시를 똑같은 크기로 나누고 순서대로 매핑하는 것을 말합니다. 예를 들어 메모리가 1~100이 있고 캐시가 1~10이 있다면 각각을 10으로 나눠 1:1~10, 2:11~20 이런 식으로 매핑합니다. 구현이 간단하며 처리가 빠르지만 충돌 문제가 발생할 수 있습니다.
    직접 매핑 방식에서 캐시 메모리는 메인 메모리의 특정 블록에 직접 매핑됩니다. 이 매핑 방식의 특성상, 한 캐시 라인이 여러 메모리 블록과 연결될 수 있습니다. 따라서, CPU 다시 A 참조하려고 하면, 위치에는 이전에 덮어씌운 B 데이터만 존재하게 됩니다. 그래서 캐시에서 원하는 A 데이터를 찾을 없게 되는 것이죠. 이러한 상황을 '캐시 미스'라고 부르며, 때문에 CPU 다시 메인 메모리에서 A 찾아야 합니다. 과정은 상대적으로 느리기 때문에 성능 저하를 초래하게 됩니다.
    위의 예제에서 A와 B는 동일한 캐시 라인에 매핑되어 있다고 가정했습니다. 그래서 CPU가 A를 참조할 때 A는 캐시에 로드되며, 이후 B를 참조할 때 B는 같은 캐시 라인에 로드되어 기존의 A를 덮어씁니다.
  2. 연관 매핑: 순서를 일치시키지 않고 관련 있는 캐시와 메모리를 매핑합니다. 직접 매핑에서는 인덱스가 필요했지만 연관 매핑에서는 빈자리를 찾아가면 됩니다. 충돌은 적지만 모든 블록을 탐색해야 해서 속도가 느립니다.
  3. 집합 연관 매핑: 직접 매핑과 연관 매핑을 합쳐 놓은 것입니다. 순서는 일치시키지만 집합을 둬서 저장하며 블록화되어 있기 때문에 검색은 좀 더 효율적입니다. 예를 들어 메모리가 1~100이 있고 캐시가 1~10이 있다면 캐시 1~5는 1~50의 데이터를 무작위로 저장시키는 것을 말합니다.

4. 웹 브라우저의 캐시

웹 브라우저의 캐시(Cache)는 웹 페이지, 이미지, 스타일시트, 자바스크립트 등 웹 리소스를 임시로 저장해 두는 공간을 말합니다.

쿠키(Cookie), 로컬 스토리지(Local Storage), 세션 스토리지(Session Storage)가 있습니다. 쿠키, 로컬 스토리지, 세션 스토리지는 모두 웹 브라우저에서 사용하는 데이터 저장 기술입니다. 

4-1. 쿠키

  • 개념: 웹 사이트(웹 서버)가 사용자의 컴퓨터에 저장하는 작은 텍스트 파일
  • 특징
    • key-value 형태
    • 각 쿠키는 4KB까지 데이터 저장 가능
    • 사용자의 세션 ID, 로그인 정보, 사용자의 환경 설정 등을 저장하는데 주로 사용
    • 만료 기한 O -> 만료 날짜가 지나면 쿠키는 자동으로 삭제됨

4-2. 로컬 스토리지

  • 개념: 웹 브라우저에서 브라우징 도메인 내에서 데이터를 장기적으로 저장할 수 있는 텍스트 파일
  • 특징
    • key-value 형태
    • 한 브라우징 도메인 당 최대 5KB까지 데이터 저장 가능
    • 사용자 설정, 쇼핑 카트 정보, 로그인 정보 및 상태, 게임 데이터 저장하는데 주로 사용
    • 만료 기한 X -> 사용자가 직접 삭제하기 전까지 데이터 유지, 브라우저 종료해도 제거되지 않음

4-3. 세션 스토리지

  • 개념: 브라우징 도메인 내에서 시점에 따른 데이터를 저장하는 텍스트 파일
  • 특징
    • key-value 형태
    • 각 쿠키는 5KB까지 데이터 저장 가능
    • 사용자 입력, 일시적인 설정(사용자가 세션동안 선택한 테마 또는 언어 설정), 장바구니 등을 저장하는데 주로 사용
    • 만료 기한 O -> 브라우저를 닫으면 세션 스토리지의 모든 정보 사라짐

4. 데이터베이스의 캐싱 계층

데이터베이스 시스템을 구축할 대도 메인 데이터베이스 위에 레디스(redis, Remote Dictionary Server) 데이터베이스 계층을 '캐싱 계층'으로 둬서 성능을 향상시키기도 합니다.

데이터를 메모리에 저장하고 관리하여 빠른 응답 시간을 제공합니다.

출처: https://blog.cslee.co.kr/redis-remote-dictionary-system/

 

728x90

'운영체제' 카테고리의 다른 글

[운영체제] CPU 스케줄링 알고리즘  (0) 2024.05.10
[운영체제] 스레드  (0) 2024.05.10
[운영체제] 멀티 프로세싱  (0) 2024.05.09
[운영체제] 프로세스  (0) 2024.05.08
[운영체제] 메모리 관리  (0) 2024.05.05

+ Recent posts