Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,4 @@ yarn-error.log
.pnp.js
# Yarn Integrity file
.yarn-integrity
/package-lock.json
2 changes: 1 addition & 1 deletion contents/posts/operation-system/1/index.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: "1. 운영체제의 역할과 커널의 기능"
title: "운영체제의 역할과 커널의 기능"
description: "운영체제의 역할과 커널의 기능"
date: 2025-09-04
update: 2025-09-04
Expand Down
66 changes: 33 additions & 33 deletions contents/posts/operation-system/10/index.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: "10. 멀티 프로세스와 멀티 쓰레드의 차이 및 장단점"
title: "멀티 프로세스와 멀티 쓰레드의 차이 및 장단점"
description: "멀티 프로세스와 멀티 쓰레드의 차이 및 장단점"
date: 2025-09-13
update: 2025-09-13
Expand All @@ -8,25 +8,25 @@ tags:
series: "프로세스와 쓰레드에 대해서 알아보기"
---

![img.png](멀티프로세스.png)
![img.png](multi_process.png)

멀티 프로세스는 운영체제에서 하나의 응용 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기술이다.
멀티 프로세스는 운영체제에서 하나의 응용 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기술입니다.
보통은 하나의 프로그램을 실행하기 위해서 하나의 프로세스만 메모리에 생성하게 되지만, 부가적인 기능을 위해
여러개의 프로세스를 생성하는 것이다.
여러개의 프로세스를 생성하는 것입니다.

<br>
<br>

### 어떻게 멀티 프로세스를 생성할까?

멀티 프로세스는 이전에 보았던 계층구조 프로세스 처럼 부모 프로세스가
여러개의 자식 프로세스를 생성한다.
여러개의 자식 프로세스를 생성합니다.

부모 프로세스는 자식 프로세스의 PID를 알고있으며 자식또한 PID와 PPID를 알고있어
서로 통신이 가능하다.
서로 통신이 가능합니다.

이런 성질은 각각 독립적이지만 통신이 가능하게 만들었고 멀티 프로세스의 대표적인 예가
브라우저의 탭이라고 할 수 있다.
브라우저의 탭이라고 할 수 있습니다.

브라우저 탭은 문제가 발생해서 닫아야 하는 상황이여도 다른 탭까지 닫히지 않고 개별적으로
운용을 할 수 있는걸 기억해보면 독립적이란 말을 더 잘 이해할 수 있을것이다.
Expand All @@ -40,10 +40,10 @@ series: "프로세스와 쓰레드에 대해서 알아보기"

1. 안정성

멀티 프로세스의 안정성은 각각의 프로세스가 독립적이기 떄문에 가능하다.
멀티 프로세스의 안정성은 각각의 프로세스가 독립적이기 떄문에 가능합니다.
대표적인 예로 좀전에 설명을 했던 특정 브라우저 탭이 문제가 발생하여 닫아야 하는 상황에서
같은 브라우저의 다른 탭까지 닫히지는 않는다.
이런것이 독립적인 성격에 의한 안정성이라고 할 수 있다.
같은 브라우저의 다른 탭까지 닫히지는 않습니다.
이런것이 독립적인 성격에 의한 안정성이라고 할 수 있습니다.

<br>
<br>
Expand All @@ -54,18 +54,18 @@ series: "프로세스와 쓰레드에 대해서 알아보기"

1. 문맥교환 (Context Switching) Overhead

멀티 태스킹을 이루는 기술인 문맥 교환 과정에서 성능 저하가 발생할 수 있다.
멀티 태스킹을 이루는 기술인 문맥 교환 과정에서 성능 저하가 발생할 수 있습니다.
프로세스를 컨텍스트 스위칭 하면, CPU는 다음 프로세스의 정보를 불러오기 위해
메모리를 검색하고, CPU 캐시 메모리를 초기화하며, 프로세스 상태를 저장하고,
불러올 데이터를 준비해야 하기 떄문에, 빈번한 문맥교환이 발생하고 이 비용은 곧 오버헤드로 발생할 수 있다.
불러올 데이터를 준비해야 하기 떄문에, 빈번한 문맥교환이 발생하고 이 비용은 곧 오버헤드로 발생할 수 있습니다.

<br>
<br>

2. 자원 공유 비효율성

프로세스는 독립적인 메모리를 가지고, 멀티 프로세스는 독립적인 메모리 공간의 합일 것이다.
그렇기 때문에 메모리 비효율성을 초래한다.
프로세스는 독립적인 메모리를 가지고, 멀티 프로세스는 독립적인 메모리 공간의 합일 것입니다.
그렇기 때문에 메모리 비효율성을 초래합니다.

<br>
<br>
Expand All @@ -74,17 +74,17 @@ series: "프로세스와 쓰레드에 대해서 알아보기"

---

![img.png](멀티스레드.png)
![img.png](multi_thread.png)

<br>

이전에 보았던 것처럼 스레드는 하나의 프로세스 내에 있는 실행 흐름이다.
멀티 스레드는 하나의 프로세스 안에 여러개의 실행흐름을 가지는 것이다.
멀티 스레드 또한 멀티 프로세스 처럼 여러개의 작업을 동시 실행 할 수 있다.
이전에 보았던 것처럼 스레드는 하나의 프로세스 내에 있는 실행 흐름입니다.
멀티 스레드는 하나의 프로세스 안에 여러개의 실행흐름을 가지는 것입니다.
멀티 스레드 또한 멀티 프로세스 처럼 여러개의 작업을 동시 실행 할 수 있습니다.

이전에 보았던 것처럼 멀티 프로세스는 브라우저의 여러개의 탭을 통해 예시를 들었다.
이전에 보았던 것처럼 멀티 프로세스는 브라우저의 여러개의 탭을 통해 예시를 들었습니다.
하지만, 멀티 스레드는 같은 브라우저라 할지라도 동일탭에 여러 실행 흐름을 말하게 되고
예를들어 네트워크 처리 스레드, 검색 스레드 와 같이 동일한 프로세스 내 기능들을 말하게 된다.
예를들어 네트워크 처리 스레드, 검색 스레드 와 같이 동일한 프로세스 내 기능들을 말하게 됩니다.

<br>
<br>
Expand All @@ -96,52 +96,52 @@ series: "프로세스와 쓰레드에 대해서 알아보기"
### 프로세스보다 스레드가 가벼움

스레드는 프로세스보다 용량이 가볍다. 이유는 데이터, 코드, 힙 영역을
프로세스와 공유해서 사용하기 때문에 내장된 정보다 프로세스보다 작기 떄문이다.
그렇기 때문에 스레드를 제거하는 작업이 프로세스를 제거하는 작업보다 가볍다.
프로세스와 공유해서 사용하기 때문에 내장된 정보다 프로세스보다 작기 떄문입니다.
그렇기 때문에 스레드를 제거하는 작업이 프로세스를 제거하는 작업보다 가볍습니다.

<br>
<br>

### 자원의 효율성

멀티 스레드는 하나의 프로세스 내에서 스택영역을 제외한 영역을 공유하기 때문에
프로세스 간 통신을 사용하지 않고도 자원의 공유가 가능하여 자원을 효율적으로 사용할 수 있다.
프로세스 간 통신을 사용하지 않고도 자원의 공유가 가능하여 자원을 효율적으로 사용할 수 있습니다.

<br>
<br>

### Context Switching 비용 감소

스레드 문맥 교환 또한 오버헤드가 존재하지만, 프로세스 문맥교환과 비교했을 때,
상대적으로 오버헤드가 적다.
상대적으로 오버헤드가 적습니다.

이유는 프로세스 컨텍스트 스위칭 비용은 스위칭할 때마다 CPU 캐시에 있는 내용을 모두 초기화하고,
새로운 프로세스 정보를 CPU 캐시에 적재해야 하기 떄문이다.
하지만, 스레드 문맥교환은 스레드 개별적인 정보만 교체하면 되기 떄문에 비용이 상대적으로 낮다.
새로운 프로세스 정보를 CPU 캐시에 적재해야 하기 떄문입니다.
하지만, 스레드 문맥교환은 스레드 개별적인 정보만 교체하면 되기 떄문에 비용이 상대적으로 낮습니다.

<br>
<br>

## 멀티 스레드의 단점

멀티 프로세스는 개별적인 작업으로 인해 독집적이고, 각자의 문제를 전파하지 않는다고 하였다.
멀티 프로세스는 개별적인 작업으로 인해 독집적이고, 각자의 문제를 전파하지 않는다고 합니다.

하지만, 멀티 스레드는 하나의 스레드가 문제가 발생하면 다른 스레드들고 영향을 받아 전체가 종료가 될 수 있다.
하지만, 멀티 스레드는 하나의 스레드가 문제가 발생하면 다른 스레드들고 영향을 받아 전체가 종료가 될 수 있습니다.

<br>
<br>

## 데드락

데드락이란 하나의 자원을 사용하기위해 여러 곳에서 접근했고, 그상황에서 교착상태가 일어났을때
여러대의 스레드가 서로 대기하면서 무한정 기다리는 현상을 데드락이라고 한다.
여러대의 스레드가 서로 대기하면서 무한정 기다리는 현상을 데드락이라고 합니다.

예를들어, 스레드 1 은 자원 A을 점유하고 있는 상태에서 자원 B가 필요한 상황이다.
그리고 스레드 2 는 자원 B를 점유하고 있는 상태에서 자원 A이 필요한 상황이다.
예를들어, 스레드 1 은 자원 A을 점유하고 있는 상태에서 자원 B가 필요한 상황입니다.
그리고 스레드 2 는 자원 B를 점유하고 있는 상태에서 자원 A이 필요한 상황입니다.
하지만 스레드 1은 자원 B가 필요한 상황에서 자원 A을 빌려줄 수 있는 상황이 아니고,
스레드 2또한 자원 A이 필요한 상태에서 자원 B를 빌려줄 수 없는 상황인 것이다.
스레드 2또한 자원 A이 필요한 상태에서 자원 B를 빌려줄 수 없는 상황인 것입니다.
이처럼 다수의 쓰레드가 같은 lock을 동시에,
다른 명령에 의해 획득하려 할 때 서로 절대 불가능한 일을 계속적으로 기다리는 상황을 이야기 한다.
다른 명령에 의해 획득하려 할 때 서로 절대 불가능한 일을 계속적으로 기다리는 상황을 이야기 합니다.



24 changes: 12 additions & 12 deletions contents/posts/operation-system/11/index.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: "11. 멀티 쓰레드 프로그래밍의 동시성 이슈와 Thread-Safe 설계 방법"
title: "멀티 쓰레드 프로그래밍의 동시성 이슈와 Thread-Safe 설계 방법"
description: "멀티 쓰레드 프로그래밍의 동시성 이슈와 Thread-Safe 설계 방법"
date: 2025-09-14
update: 2025-09-14
Expand All @@ -15,7 +15,7 @@ series: "프로세스와 쓰레드에 대해서 알아보기"

<br>

![img.png](동시성이슈.png)
![img.png](concurrency.png)

<br>

Expand All @@ -26,7 +26,7 @@ series: "프로세스와 쓰레드에 대해서 알아보기"
스레드 a가 좋아요 카운트를 늘리면 11가 됩니다. 하지만 스레드 a와 b는 좋아요 카운트에 동시에 접근해서 초기값 10을 받은 상태라면
스레드 b는 늘어난 11라는 숫자대신 10을 기준으로 값을 줄이게 됩니다. 그럼 최종 결과는 10이 아닌 9라는 값으로 나오게 됩니다.

이처럼 멀티 스레드 환경에서는 하나의 자원에 동시에 접근하게 되면 이러한 문제가 발생할 수 있다.
이처럼 멀티 스레드 환경에서는 하나의 자원에 동시에 접근하게 되면 이러한 문제가 발생할 수 있습니다.

<br>
<br>
Expand All @@ -36,7 +36,7 @@ series: "프로세스와 쓰레드에 대해서 알아보기"
---

그럼 우리가 추구해야 할 문제는 스레드 안전한 멀티 스레드 프로그래밍을 구현할 수 있어야 한다. 이것을 구현하는
방법에 대해 이야기 하려고 한다.
방법에 대해 이야기 하려고 합니다.

<br>
<br>
Expand All @@ -60,37 +60,37 @@ series: "프로세스와 쓰레드에 대해서 알아보기"

<br>

- 공유 자원에 하나의 Thread만 접근할 수 있도록 세마포어/ 뮤텍스락을 통제하는 방법이다.
- 공유 자원에 하나의 Thread만 접근할 수 있도록 세마포어/ 뮤텍스락을 통제하는 방법입니다.

<br>

2. 원자 연산(Atomic Operation)

<br>

- 공유 자원에 접근할 때 원자 연산을 이용하거나 원자적으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현하는 방법이다.
- 공유 자원에 접근할 때 원자 연산을 이용하거나 원자적으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현하는 방법입니다.
- Atomic
- 공유 자원 변경에 필요한 연산을 원자적으로 분리한 뒤에 실제로 데이터의 변경이 이루어지는 시점에 Lock을 걸고,
데이터를 변경하는 시간 동안 다른 쓰레드의 접근이 불가능하도록 하는 방법이다.
데이터를 변경하는 시간 동안 다른 쓰레드의 접근이 불가능하도록 하는 방법입니다.

<br>

3. Thread-Local Storage (스레드 지역 저장소)

<br>

- 공유 자원의 사용을 최대한 줄이고 각가의 쓰레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는 방법이다.
- 일반적으로 공유 상태를 피할 수 없을 때 사용하는 방식이며, 전역 변수 사용을 자제하라는 뜻으로 생각하면 된다.
- 공유 자원의 사용을 최대한 줄이고 각가의 쓰레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는 방법입니다.
- 일반적으로 공유 상태를 피할 수 없을 때 사용하는 방식이며, 전역 변수 사용을 자제하라는 뜻으로 생각하면 됩니다.

<br>

4. Re-entrancy (재진입성)

<br>

- 쓰레드 호출과 상관 없이 프로그램에 문제가 없도록 작성하는 방법이다.
- 어떤 함수가 한 스레드에 의해 호출되어 실행 중이라면 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 옳바르게 주어져야 한다.
- 쓰레드끼리 독립적으로 동작할 수 있도록 코드를 작성하는 것으로 생각하면 된다.
- 쓰레드 호출과 상관 없이 프로그램에 문제가 없도록 작성하는 방법입니다.
- 어떤 함수가 한 스레드에 의해 호출되어 실행 중이라면 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 옳바르게 주어져야 합니다.
- 쓰레드끼리 독립적으로 동작할 수 있도록 코드를 작성하는 것으로 생각하면 됩니다.

<br>
<br>
Expand Down
95 changes: 95 additions & 0 deletions contents/posts/operation-system/12/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
---
title: "CPU 스케줄링의 목적과 스케줄러의 종류"
description: "CPU 스케줄링의 목적과 스케줄러의 종류"
date: 2025-09-15
update: 2025-09-15
tags:
- 운영체제
series: "CPU 스케줄링"
---

## CPU 할당?

---

지금까지 배운 내용을 토대로 프로세스는 CPU를 필요로 하며, 프로세스가 실행 된다는 말은 메모리에 올라간 데이터를 토대로 프로세스가 CPU를 할당받아 사용
하는것을 프로세스가 실행 된다고 표현합니다. 그 과정에서 프로세스는 일정 주기마다 컨텍스트 스위칭을 통해 CPU 할당을 바꾸고 IO요청에 대해서도 대기 상태로 들어가는 등
CPU사용에 여러 변수가 있습니다.

한가지 의문점은, 누가? 어떻게? CPU를 할당하는지 배운적은 없습니다.
여기서 CPU라는 리소스에 대한 사용을 결정짓는건 운영체제입니다.
그리고 오늘 글의 주제인 CPU 스케줄링은 운영체제가 CPU라는 자원을 배분하는 행위를 지칭합니다.

<br>
<br>

## CPU 스케줄링 우선순위

---

![img.png](priority.png)

운영체제는 많은 프로세스에게 공정하게 CPU라는 공용자원을 배분하기 위해 고려해야 하는것이 우선순위 입니다.
우선순위라는 기준을 매겨야 하는 이유는
운영체제는 어떤 프로세스는 당장 처리해야 할 중요성을 띄거나, IO작업이 많거나, CPU 사용시간 자체가 길거나처럼 각자의 사정이 있고, 이 사정 가운대 효율적으로 자원을 배분해야 하기 떄문입니다.

<br>

'우선순위가 높다'라는 표현은 CPU 사용에 우선권을 가집니다. 즉 먼저 처리되어야 한다 라는 뜻입니다.
대표적으로 우선순위가 높은 프로세스는 입출력이 많은 프로세스 입니다.
(입출력 처리가 많은 프로세스가 우선순위가 높은 이유는 아래에서 설명합니다.)

대부분의 프로세스는 I/O 작업과 CPU처리를 번갈아가면서 수행하게 됩니다. 이 말은 프로세스 상태 변화에서 실행, 대기를 번갈아 가면서 사용한다는 뜻입니다.
그렇지만 모든 프로세스가 동일한 비율로 I/O와 CPU처리를 하는것은 아닙니다. 여기서 CPU작업의 비율이 많다면 **CPU 집중 프로세스**라고 하게 되며, 반대로 I/O작업의
비율이 많다면 **입출력 집중 프로세스** 라고 부르게 됩니다.

CPU집중 프로세스는 실행상태가 많고, 입출력 집중 프로세스는 대기 상태가 많으니 입출력 집중 프로세스를 빠르게 대기 상태로 넘겨주는 것이 CPU사용에 대해서 더 효율적인
방법일것입니다. 그렇기 떄문에 입출력 처리가 많은 프로세스가 우선순위가 높습니다.

여담으로, CPU를 이용하는 작업을 **CPU 버스트**, 입출력을 이용하는 작업을 **입출력 버스트**라고 부르게 됩니다.

<br>
<br>

이러한 우선순위는 **PCB**에 기록됩니다. **PCB** 우선순위 기준으로 먼저 처리할 프로세스를 결정하고 처리하게 됩니다.

<br>
<br>

## 스케줄링 큐

---

![img.png](queue_scheduling.png)

우선순위는 **PCB**에 기록되지만, 운영체제가 매 CPU 할당 과정마다 **PCB**를 확인하고 결정하는건 비효율 적인 방식입니다.
그렇기 때문에 프로세스는 마치 '줄을 서는것'처럼 대기하게 됩니다. 이것을 **스케줄링 큐**라고 부르게 됩니다.

<br>

![img.png](ready_queue.png)

<br>

운영체제는 메모리로 적재되고 싶은 프로세스들을 큐에 삽입하여 줄을 세우고, CPU를 사용하고 싶거나, 특정 입출력장치를 사용하거 싶은 프로세스들을 줄세웁니다.
이 과정에서 사용할 자원에 따라 다른 큐에서 대기하게 됩니다.

운영체제가 관리하는 큐로는 **준비큐**와 **대기큐**로 이루어 져 있습니다. **준비 큐**는 말그대로 CPU를 이용하고 싶은 프로세스들이 대기하게 되고,

<br>

![img.png](wait_queue.png)

<br>

**대기 큐**는
입출력장치를 이용하기 위한 대기 상태에 돌입한 프로세스들이 서는 줄입니다.
큐에 들어와 있다고 해도 항상 순서대로 작동하는 것은 아니고 **우선 순위**를 고려합니다.

<br>

## 출처

---

[이미지 출처](https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard)
Binary file added contents/posts/operation-system/12/priority.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading