diff --git a/contents/posts/os/1/img.png b/contents/posts/os/1/img.png new file mode 100644 index 0000000..390a74c Binary files /dev/null and b/contents/posts/os/1/img.png differ diff --git a/contents/posts/os/1/img_1.png b/contents/posts/os/1/img_1.png new file mode 100644 index 0000000..12838a9 Binary files /dev/null and b/contents/posts/os/1/img_1.png differ diff --git a/contents/posts/os/1/img_3.png b/contents/posts/os/1/img_3.png new file mode 100644 index 0000000..f89bf16 Binary files /dev/null and b/contents/posts/os/1/img_3.png differ diff --git a/contents/posts/os/1/img_4.png b/contents/posts/os/1/img_4.png new file mode 100644 index 0000000..6e0c097 Binary files /dev/null and b/contents/posts/os/1/img_4.png differ diff --git a/contents/posts/os/1/index.md b/contents/posts/os/1/index.md new file mode 100644 index 0000000..cd70f96 --- /dev/null +++ b/contents/posts/os/1/index.md @@ -0,0 +1,93 @@ +--- +title: "1. 운영체제의 개념과 구조" +description: +date: 2025-09-03 +update: 2025-09-03 +tags: + - 운영체제 +series: "운영체제" +--- + +## 운영체제(OS, Operating System) + +[운영체제는 컴퓨터라는 기계 안에서 프로그램과 하드웨어 사이에서 문제없이 그리고 효율적으로 잘 돌아가도록 관리해주는 소프트웨어이다.](https://en.wikipedia.org/wiki/Operating_system#:~:text=An%20operating%20system%20(OS)%20is%20system%20software%20that%20manages%20computer%20hardware%20and%20software%20resources%2C%20and%20provides%20common%20services%20for%20computer%20programs.) + +![](img.png) + +운영체제가 없으면 어떻게 될까? 꼭 필요할까? + +> _A computer is a machine that can be programmed to automatically carry out sequences of arithmetic or logical operations_ +> (컴퓨터는 산술적 또는 논리적 연산(계산)의 순서를 자동으로 수행하도록 프로그래밍할 수 있는 기계이다). +> [ - wikepedia](https://en.wikipedia.org/wiki/Computer#:~:text=A%20computer%20is%20a%20machine%20that%20can%20be%20programmed%20to%20automatically%20carry%20out%20sequences%20of%20arithmetic%20or%20logical%20operations%20(computation).) + +운영체제가 없다면 컴퓨터는 그저 하드웨어의 집합체에 불과하다. +사용자는 프로그램을 실행하기 위해서 매번 하드웨어를 직접 제어해야 하며, 이렇게 하는 것은 매우 비효율적일거다. +또한 직접 제어를 한다고 해도 하드웨어의 성능은 제한적이므로 이 환경에서 최대한의 성능을 끌어내기 위해 최적화라는 고통스러운 작업을 해야 할 것이다. +이러한 상황을 상상해보면 "배보다 배꼽이 더 크다"라는 말이 떠오른다. + +실제로 운영체제라는 개념이 있기 전에는 사용자들이 하나의 작업을 위해 펀치카드를 소지하며 관리해야 했다. +그리고 단순 하드웨어에 올려 실행하는 과정의 방식이기에 한 번에 하나의 프로그램만 실행할 수 있었고, 해당 프로그램이 끝나야 다른 프로그램을 수행할 수 있었다. +지금처럼 복잡한 방식의 프로그램은 꿈도 꿀 수 없었을 것이다. + +이러한 문제를 해결하기 위해 운영체제가 나왔고, 다음과 같은 목적을 지닌다. + +- 사용자에게 컴퓨터의 프로그램을 쉽고 효율적으로 실행할 수 있는 환경을 제공한다. +- 컴퓨터 시스템 하드웨어 및 소프트웨어 자원을 여러 사용자 간에 효율적 할당, 관리, 보호하는 것 +- 운영체제는 제어 프로그램으로서 사용자 프로그램의 오류나 잘못된 자원 사용을 감시하는 것과 입출력 장치 등의 자원에 대한 연산과 제어를 관리한다. + +운영체제은 위와 같은 목적을 위해 다양한 방식을 가지고 있다. + +### 일괄 처리 시스템 (Batch Operating System) + +사용자의 개입없이 비슷한 작업들을 모아서 순차적으로 처리하는 방식이다. +한 작업이 끝나야 다음 작업이 실행되기 때문에 모든 작업이 완료될 때까지 기다릴 수 있는 환경에서 사용된다. +주로 대용량 데이터를 처리하거나 시간이 많이 소요되는 작업에 활용되며, 사용자의 개입이 필요하지 않고 반복적인 작업을 일괄적으로 처리할 수 있다. + +### 다중 프로그래밍 시스템 (Multi Programming System) + +이 방식은 CPU을 최대한 사용하고 하는 방식으로, +여러 응용프로그램을 메모리에 동시에 올라가 CPU가 쉬지 않고 여러 작업을 번갈아서 실행하며 항상 연산을 수행하는 상태로 활용하는 방식이다. +하나의 프로그램을 실행하는 동안 다른 프로그램은 대기하거나 I/O 작업 등을 수행하며 메모리에 올라간 상태로 대기하게 된다. +운영 체제는 이런 과정에서 CPU를 배분하는 작업 스케줄링과 CPU 스케줄링을 진행하며, +이를 통해 시스템 자원을 효율적으로 활용하고 응용 프로그램들이 서로 영향을 주지 않으면서 병렬적으로 실행된다. + +### 시분할 시스템 (Time Sharing System) + +이 방식은 CPU에 대해 일정 시간을 할당 받아 짧은 간격으로 번갈아 실행하는 방식이다. +다중 프로그래밍 시스템에서는 Context Switching(CPU 점유 권한 전환)이 I/O작업에서만 발생한다. +이를 통해서만 스케줄링을 할 경우 하나의 프로세스가 아주 오래 CPU를 독점하고 있는 상태가 발생할 수 있다는 문제점이 있다. +이를 해결하기 위한 것이 시분할 시스템으로, 다중 프로그래밍과 비슷하지만 모든 프로세스가 특정 시간만 CPU를 점유하고 다른 프로세스에 권한을 넘겨주는 방식으로 +Context Switching 기준 시간으로 시분할을 구현해서 RR(Round-Robin) 알고리즘으로 스케줄링을 한다. + +### 대화형 시스템(Interactive System) + +앞서 설명한 일괄 처리 시스템은 처리해야할 작업들을 한번에 정의하고 일괄적으로 처리하는 방식이었다. +이러한 일괄 처리 시스템의 문제점은 처리가 이루어지는 중에 시스템의 상태를 확인하기가 힘들고, +작업이 끝나 결과가 도출되기 전까지는 작업을 수정할 수도 없다는 문제점이 있었다. +이를 보완하기위해 등장한 시스템이 대화형 시스템으로, +작업 중에도 사용자가 데이터, 명령 또는 작업을 입력하면 컴퓨터가 즉각적으로 해당 입력에 응답하는 사용자와 컴퓨터 간의 상호작용을 통해 작동하는 방식이다. + +## 커널(Kernel) + +그럼 우리들의 컴퓨터 속 운영체제는 어떻게 이러한 기능을 수행하고 있을까? + +[운영체제의 이러한 핵심적인 부분을 담당하고 수행하는 것이 바로 커널이다.](https://en.wikipedia.org/wiki/Kernel_(operating_system)#:~:text=A%20kernel%20is%20a%20computer%20program%20at%20the%20core%20of%20a%20computer%27s%20operating%20system%20that%20always%20has%20complete%20control%20over%20everything%20in%20the%20system.) + +![](img_3.png) +커널을 한글로 번역하면 핵심이다! 재밌지 아니한가? 아무튼 다시 돌아와서 커널은 어떻게 운영체제의 기능을 수행할까? + +[커널은 하드웨어를 인터페이스로 제공하여 여러 사용자 또는 여러 프로세스가 하드웨어 즉 리소스를 효율적으로 관리하며 작업을 수행할 수 있도록 해준다.](https://en.wikipedia.org/wiki/Kernel_(operating_system)#:~:text=The%20kernel%27s%20interface%20is%20a%20low%2Dlevel%20abstraction%20layer.%20When%20a%20process%20requests%20a%20service%20from%20the%20kernel%2C%20it%20must%20invoke%20a%20system%20call%2C%20usually%20through%20a%20wrapper%20function.) +여기서 중요한 점은 커널은 사용자가 직접 제어할 수는 없다. +그 이유는 보안상 유저 어플리케이션이 함부로 운영체제의 리소스를 건들지 못하게 하기 위해서다. +그래서 커널에는 하드웨어에 접근이 허가된 커널모드와 그렇지 못한 유저모드로 분리가 되어있다. + +![](img_1.png) + +커널의 구조는 위 사진과 같은데, 간단한 흐름을 설명하자면 사용자가 유저모드인 어플리케이션을 실행하면서 발생하는 요청이 시스템 콜을 통해 커널 모드로 전환이 된다. +애플리케이션은 커널모드로 전환되었다가 작업을 끝낸 후 응답을 반환하면서 다시 유저모드로 되돌아 가게 된다. +여기서 시스템 콜은 뭐지 싶을텐데 [어플리케이션의 요청이 커널에 접근해 시스템에 요청하는 것](https://en.wikipedia.org/wiki/System_call#:~:text=In%20computing%2C%20a%20system%20call%20(syscall)%20is%20the%20programmatic%20way%20in%20which%20a%20computer%20program%20requests%20a%20service%20from%20the%20operating%20system%5Ba%5D%20on%20which%20it%20is%20executed.)으로 간단히 유저모드에서 커널모드로 전환하는 것이라고 생각하면 된다. + +![](img_4.png) + +이러한 방식을 통해 사용자의 프로세스가 직접적으로 운영체제의 리소스를 함부로 변경하지 못하게 보호해준다. + diff --git a/contents/posts/os/2/img.png b/contents/posts/os/2/img.png new file mode 100644 index 0000000..8dfbbbb Binary files /dev/null and b/contents/posts/os/2/img.png differ diff --git a/contents/posts/os/2/img_1.png b/contents/posts/os/2/img_1.png new file mode 100644 index 0000000..ac1f74c Binary files /dev/null and b/contents/posts/os/2/img_1.png differ diff --git a/contents/posts/os/2/img_2.png b/contents/posts/os/2/img_2.png new file mode 100644 index 0000000..33e4d72 Binary files /dev/null and b/contents/posts/os/2/img_2.png differ diff --git a/contents/posts/os/2/img_3.png b/contents/posts/os/2/img_3.png new file mode 100644 index 0000000..934762f Binary files /dev/null and b/contents/posts/os/2/img_3.png differ diff --git a/contents/posts/os/2/img_4.png b/contents/posts/os/2/img_4.png new file mode 100644 index 0000000..f66afd8 Binary files /dev/null and b/contents/posts/os/2/img_4.png differ diff --git a/contents/posts/os/2/index.md b/contents/posts/os/2/index.md new file mode 100644 index 0000000..fb5e4c0 --- /dev/null +++ b/contents/posts/os/2/index.md @@ -0,0 +1,75 @@ +--- +title: "2. 커널의 작동 방식" +description: +date: 2025-09-04 +update: 2025-09-04 +tags: + - 운영체제 +series: "운영체제" +--- + +앞서, 운영체제란 무엇인지 그리고 커널에 대해 간단하게 알아봤다. +이제 커널이 어떻게 작동하는지 제대로 알아보자. + +먼저 인터럽트(Interrupt)에 대해 알아야 한다. + +![img_3.png](img_3.png) + +컴퓨터는 위 사진처럼 주변 입출력 기기와 서로 통신하는데 +이 과정에서 서로 입출력 요청이 오가는데 이때 입출력 메커니즘들이 발생된다. +이중 하나가 인터럽트이다. + +![](img.png) +인터럽트는 중단시키다라는 의미로 초인종과 같다고 할 수 있다. +즉, 인터럽트가 발생하면 잠깐 멈추고 다시 실행된다. + +![](img_1.png) + +실제 발생하는 대부분의 인터럽트는 I/O 인터럽트이다. +예를들면, 우리가 자바에서 print을 할 때 print라는 API를 파일이라는 인터페이스를 통해서 유저모드에서 커널 모드로 시스템 콜이 발생한다. +유저모드 API에서 커널모드 구성요소에서 시스템 콜이 이어지고 디바이스 드라이버를 제어하기 시작하는데 +[이때 디바이스 드라이버가 인터럽트를 CPU에 요청한다. 이 행위를 IRQ라고 한다.](https://en.wikipedia.org/wiki/Interrupt_request#:~:text=In%20a%20computer,or%20mouse%20movements.) +이러한 IRQ는 장치마다 다른 번호로 관리하게 된다. +아무튼 출력기기에 출력이 되면, 다시 역순으로 디바이스(하드웨어)에서 디바이스 드라이버로, +디바이스 드라이버에서 커널 모드로 해서 최종적으로 유저 모드로 다시 돌아오게 된다. + +![](img_4.png) +이때, 이러한 행위 도중 wait을 걸면 블라킹(동기) 안걸면 논블라킹(비동기)으로 동작하게 된다. + +인터럽트에는 우선순위가 있고 외부 인터럽트인지 내부 인터럽트인지에 따라 우선순위가 달라진다. + +먼저, 외부 인터럽트로 내부 인터럽트보다 우선 시 된다. + +그 중에서도 우선 순위가 있는데, 다음과 같다. +- 전원 이상 인터럽트: 말 그대로 정전 또는 파워 이상 +- 기계 착오 인터럽트: CPU의 기능적인 오류. +- 외부 신호 인터럽트: 타이머 또는, 키보드 인터럽트 키(Ctrl + Alt + Delete). 외부장치로부터 인터럽트 요청이 있는 경우. I/O 인터럽트와 다른 개념이다. +- 입출력 인터럽트: 입출력 장치가 데이터 전송을 요구하거나 전송이 끝나 다음 동작이 수행되어야 할 경우. 입출력 데이터에 이상이 있는 경우. 우리가 자주 다루게 될 인터럽트 부분이다. + +이제 내부 인터럽트인데, 사실 우리가 주로 다루게 될 것은 외부 인터럽트에 있어 내부 인터럽트는 뭐가 있는지만 대강 본다. + +- 명령어 잘못 인터럽트: 잘못된 명령어나 잘못된 데이터를 사용할 때 발생하며 Trap이라 부른다, +- 프로그램 검사 +- 소프트웨어 인터럽트(=SVC, SuperVisor Call) + +인터럽트 동작 순서에 대해 다시 살펴보면 다음과 같은데, + +1. 인터럽트 요청 +2. 프로그램 실행 중단 +3. 현재 프로그램 상태 보존 -> PCB(Process Control Block), PC(Program Counter) 등 +4. 인터럽트 서비스 루틴 실행: 인터럽트 처리 코드 +5. 상태 복구 +6. 중단 프로그램 실행 재개 + +![](img_2.png) + +이 과정에서 유저모드에서 커널모드로 넘어갈 떄 컨텍스트 스위칭이 되면서 오버헤드가 발생하는데 이로 인해 시스템 상 지연이 발생한다. +하지만 고성능 어플리케이션을 할 때 이 지연은 꽤나 치명적일 것이다. +그래서 위와 같이 DMA(Direct Memory Access)라는 기술을 사용하게 됐다. +예를들어, DirectX라는 것이 있는데 이는 게임을 할 때 이러한 컨텍스트 스위칭 되는 부분을 건너뛰어 직접 드라이버까지 가는 방식이 있다. +이렇듯 DirectX처럼 인터럽트 시 컨텍스트 스위칭으로 인한 오버헤드가 발생하면서 지연이 발생하는데 이걸 해소하는 것이 DMA인 것이다. +정리하자면, [DMA는 RAM에 일정 부분을 예약해 불필요한 컨텍스트 스위칭을 스킵해 오버헤드 방지 및 지연을 획기적으로 줄이는 방식이다.](https://en.wikipedia.org/wiki/Direct_memory_access#:~:text=DMA%20(%20Direct%20Memory%20Access%20)%EB%8A%94%20%ED%8A%B9%EC%A0%95%20%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4%20%ED%95%98%EC%9C%84%20%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%B4%20%EC%A4%91%EC%95%99%20%EC%B2%98%EB%A6%AC%20%EC%9E%A5%EC%B9%98%20(CPU)%20%EC%99%80%20%EB%8F%85%EB%A6%BD%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EC%A3%BC%20%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EC%97%90%20%EC%95%A1%EC%84%B8%EC%8A%A4%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%8F%84%EB%A1%9D%20%ED%95%98%EB%8A%94%20%EC%BB%B4%ED%93%A8%ED%84%B0%20%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%98%20%EA%B8%B0%EB%8A%A5%EC%9E%85%EB%8B%88%EB%8B%A4%20.) + + + + diff --git a/contents/posts/os/3/img.png b/contents/posts/os/3/img.png new file mode 100644 index 0000000..61552c6 Binary files /dev/null and b/contents/posts/os/3/img.png differ diff --git a/contents/posts/os/3/img_1.png b/contents/posts/os/3/img_1.png new file mode 100644 index 0000000..59f1ceb Binary files /dev/null and b/contents/posts/os/3/img_1.png differ diff --git a/contents/posts/os/3/img_2.png b/contents/posts/os/3/img_2.png new file mode 100644 index 0000000..3c39dda Binary files /dev/null and b/contents/posts/os/3/img_2.png differ diff --git a/contents/posts/os/3/img_3.png b/contents/posts/os/3/img_3.png new file mode 100644 index 0000000..9da3b71 Binary files /dev/null and b/contents/posts/os/3/img_3.png differ diff --git a/contents/posts/os/3/index.md b/contents/posts/os/3/index.md new file mode 100644 index 0000000..69fda68 --- /dev/null +++ b/contents/posts/os/3/index.md @@ -0,0 +1,106 @@ +--- +title: "3. 프로세스" +description: +date: 2025-09-08 +update: 2025-09-08 +tags: + - 운영체제 +series: "운영체제" +--- + +## 프로세스란? + +![](img.png) + +컴퓨팅에서 프로세스란 운영체제로부터 메모리 공간을 할당받아 실행 중인 프로그램의 [인스턴스](https://ko.wikipedia.org/wiki/%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)#:~:text=%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4(instance)%EB%8A%94%20%ED%95%B4%EB%8B%B9%20%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98%20%EA%B5%AC%EC%A1%B0%EB%A1%9C%20%EC%BB%B4%ED%93%A8%ED%84%B0%20%EC%A0%80%EC%9E%A5%EA%B3%B5%EA%B0%84%EC%97%90%EC%84%9C%20%ED%95%A0%EB%8B%B9%EB%90%9C%20%EC%8B%A4%EC%B2%B4%EB%A5%BC%20%EC%9D%98%EB%AF%B8%ED%95%9C%EB%8B%A4.)를 의미합니다. +여기서 논하는 프로그램이란, 일반적으로 하드 디스크와 같은 저장장치에 저장되어 있는 실행 코드를 뜻합니다. + +## 프로세스의 메모리 공간 + +프로세스는 다음 4개의 메모리 영역으로 구성되고 [가상 메모리](https://ko.wikipedia.org/wiki/%EA%B0%80%EC%83%81_%EB%A9%94%EB%AA%A8%EB%A6%AC#:~:text=%EA%B0%80%EC%83%81%20%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EB%98%90%EB%8A%94%20%EA%B0%80%EC%83%81%20%EA%B8%B0%EC%96%B5%20%EC%9E%A5%EC%B9%98(%EB%AC%B8%ED%99%94%EC%96%B4%3A%20%EA%B0%80%EC%83%81%EA%B8%B0%EC%96%B5%EA%B8%B0%2C%20virtual%20memory%2C%20virtual%20storage)%EB%8A%94%20%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EA%B4%80%EB%A6%AC%20%EA%B8%B0%EB%B2%95%EC%9D%98%20%ED%95%98%EB%82%98%EB%A1%9C%2C%20%EC%BB%B4%ED%93%A8%ED%84%B0%20%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%20%EC%8B%A4%EC%A0%9C%EB%A1%9C%20%EC%9D%B4%EC%9A%A9%20%EA%B0%80%EB%8A%A5%ED%95%9C%20%EA%B8%B0%EC%96%B5%20%EC%9E%90%EC%9B%90%EC%9D%84%20%EC%9D%B4%EC%83%81%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EC%B6%94%EC%83%81%ED%99%94%ED%95%98%EC%97%AC%5B1%5D%20%EC%82%AC%EC%9A%A9%EC%9E%90%EB%93%A4%EC%97%90%EA%B2%8C%20%EB%A7%A4%EC%9A%B0%20%ED%81%B0%20(%EC%A3%BC)%20%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%A1%9C%20%EB%B3%B4%EC%9D%B4%EA%B2%8C%20%EB%A7%8C%EB%93%9C%EB%8A%94%20%EA%B2%83%EC%9D%84%20%EB%A7%90%ED%95%9C%EB%8B%A4.%5B2%5D%20%EA%B0%81%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%97%90%20%EC%8B%A4%EC%A0%9C%20%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EC%A3%BC%EC%86%8C%EA%B0%80%20%EC%95%84%EB%8B%8C%20%EA%B0%80%EC%83%81%EC%9D%98%20%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EC%A3%BC%EC%86%8C%EB%A5%BC%20%EC%A3%BC%EB%8A%94%20%EB%B0%A9%EC%8B%9D%EC%9D%B4%EB%8B%A4.) 공간에 독립적으로 형성됩니다. + +- 코드 영역(Code) : 프로그램 실행 코드가 적재되는 영역입니다. 읽기 모드만 지원합니다. +- 데이터 영역(Data) : 프로세스의 초기화 된 데이터들인 전역 변수와 정적 변수들이 적재되는 영역입니다. +- 힙 영역(Heap) : 런타임 동안 생성된 데이터를 보관하기 위해 동적으로 할당받는 영역입니다. +- 스택 영역(Stack) : 지역변수, 매개변수, 리턴 값, 복귀 주소 등이 저장되는 영역입니다. + +이렇게 영역이 나눠진 이유는 최대한 중복적인 데이터를 방지하여 메모리 사용량을 줄이는데 목적이 있습니다. + +> 예를 들면, 코드에서 공통으로 사용하는 부분을 전역 변수로 지정하는 행위와 같다. + +## PCB(프로세스 제어 블록) + +커널은 시스템 전체에 대해 레지스터에 하나의 프로세스 테이블을 두고 모든 프로세스의 정보를 관리합니다. +여기서의 프로세스 정보는 해당 프로세스를 실행하기 위해 필요한 정보들로 컨텍스트라고 부릅니다. +여기서 프로세스의 상태에 따라 프로세스를 교체하는 작업인 컨텍스트 스위칭 작업 이루어 지는데, +이와 같은 상황에서 여러 프로세스를 관리하기 위해 각 프로세스들에 대해 식별이 가능해야 관리가 가능하기에 해당 프로세스의 정보가 필요합니다. + +예를 들어, 인터럽트가 발생해서 자원을 할당받은 프로세스가 대기 상태가 되고 다른 프로세스를 실행 상태로 올릴 때 +대기 중인 프로세스를 나중에 다시 수행하기 위해 대기 중인 프로세스의 상태와 같은 정보를 알아야 할 것입니다. + +운영체제의 커널은 이러한 이유로 활성된 프로세스를 관리하기 위해 해당 프로세스에 대한 정보를 PCB(프로세스 제어 블록)이라는 데이터 구조에 저장합니다. +("PCB는 운영 체제가 프로세스를 표현한 것이다."라는 말도 있습니다.) + +![](img_1.png) + +> PCB는 해당 프로세스가 실행되면 생성되어 종료 시 제거가 되는데 이 과정에서 PCB의 삽입 및 삭제가 용이한 연결 리스트(Linked List) 방식으로 관리됩니다. + +## Process Metadata + +그럼 PCB에는 어떤 정보가 담겨있을까요? +PCB에는 아래와 같은 프로세스의 메타데이터들이 담겨져 있습니다. + +- 프로세스 번호(PID, Process ID): 각 프로세스의 고유 식별 번호입니다.(PPID: 부모 프로세스 ID) +- 프로세스 상태(Process State): 프로세스가 현재 어떤 상태인지를 나타내는 정보(new, ready, running, waiting, end)입니다. +- 프로그램 카운터(PC, Program Counter): 이 프로세스에서 실행될 다음 명령어의 주소를 가리키는 포인터(주소)입니다. +- 레지스터 상태(Register State): 프로세스의 레지스터 값 세트로, 프로세스를 다시 실행할 때 현재 상태를 복원하는 데 사용됩니다. +- 스케줄링 정보(Scheduling Information): CPU 시간 스케줄링에 대한 정보입니다. +- 메모리 관리 정보 (Memory Management Information): 프로세스의 메모리 할당과 사용에 관한 정보입니다. +- 입출력 상태 (I/O Status): 프로세스가 입출력 작업을 수행 중인 경우, 해당 상태 정보 및 장치 정보입니다. + +## 프로세스 상태 + +운영체제의 커널은 프로세스를 관리하기 위해 프로세스 정보를 알아야 해서 PCB를 생성하는 것을 알았습니다. +여기서 커널의 프로세스 관리는 프로세스 상태를 관리하는 것이기도 합니다. + +프로세스 상태는 위에서 언급한대로 프로세스가 현재 어떤 상태인지를 나타내는 정보로, +프로세스의 상태에 따라 CPU를 할당하거나 대기 상태로 전환하는 등의 작업이 이루어집니다. +프로세스 상태는 일반적으로 다음과 같은 상태로 구분됩니다. + +![](img_2.png) + +- New(생성) : 프로세스는 저장장치에서 메모리로 로드되어 생성됩니다. 이후 커널은 메모리를 할당하고 PCB를 생성하고 프로세스 테이블에 등록합니다. 실행 준비를 마치면 ready 상태로 전이됩니다. +- Ready(준비) : 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, 해당 상태의 프로세스들은 커널에 있는 준비 큐([우선순위 큐](https://ko.wikipedia.org/wiki/%EB%B9%84%EC%9C%A8_%EB%8B%A8%EC%A1%B0_%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81))에 들어갑니다. 스케줄러가 컨텍스트 스위칭을 수행할 때, 준비 큐에서 우선순위가 높은 프로세스가 CPU 스케줄링에 따라 리소스를 할당받아 running 상태로 전이(디스패치)됩니다. +- Running(실행) : 프로세스가 CPU를 차지하여 명령어들이 실행되고 있는 상태입니다. 할당된 시간을 모두 사용(타임아웃)했다면 타이머 인터럽트가 발생되어 준비 상태로 전이되고, 입출력 요청이나 자원 요청 등으로 인해 대기 상태로 전이될 수도 있습니다. +- Waiting(대기) : 프로세스 실행 도중 입출력 완료(주된 원인)와 같은 수신 등을 대기하는 상태를 말합니다. +- End(=terminated, 종료) : 프로세스의 실행이 종료된 상태입니다. 이떄, PCB와 프로세스의 메모리를 해제 또는 정리합니다. + +## 프로세스 계층 구조 + +프로세스는 실행 도중 시스템 콜을 통해 다른 프로세스를 생성할 수 있습니다. +이때 시스템 콜을 호출한 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라 합니다. + +> 서로 다른 프로세스라 서로 다른 PID를 가집니다. +> 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID (PPID)가 기록되기도 합니다. + +프로세스 생성 기법은 복제와 교체 과정을 통한 방식을 사용합니다. + +![](img_3.png) + +흐름의 시작인 부모 프로세스는 fork(복제) 시스템 콜을 통해 자신의 복사본을 자식 프로세스로 생성합니다. +자식 프로세스는 exec(교체) 시스템 콜을 통해 자신의 메모리 공간을 다른 프로그램으로 교체합니다. +이때, 자식 프로세스의 메모리 공간을 새로운 프로그램으로 덮어쓰게 합니다.(코드/데이터는 내용만 바꾸고, 나머지는 초기화) +자식 프로세스가 exec 시스템 콜을 호출하지 않을 경우, 부모 프로세스와 자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 됩니다. +이러한 과정을 통해 프로세스는 계층 구조를 이루어 관리할 수 있습니다. + +많은 운영체제에서는 이처럼 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리합니다. +컴퓨터가 부팅될 때 실행되는 최초의 프로세스가 자식 프로세스들을 생성하고, +생성된 자식 프로세스들이 새로운 프로세스들을 낳는 형식으로 여러 프로세스가 동시에 실행되는 것입니다. + +## 프로세스 간 통신 + +앞서 언급했던 것처럼 프로세스는 서로 독립된 메모리 공간을 가지므로, 프로세스끼리는 서로의 영역에 접근 또는 간섭할 수 없습니다. +이러한 이유로 통신이 필요할 경우, [IPC](https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EA%B0%84_%ED%86%B5%EC%8B%A0#:~:text=%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%20%EA%B0%84%20%ED%86%B5%EC%8B%A0(Inter%2DProcess%20Communication%2C%20IPC)%EC%9D%B4%EB%9E%80%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%93%A4%20%EC%82%AC%EC%9D%B4%EC%97%90%20%EC%84%9C%EB%A1%9C%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%EC%A3%BC%EA%B3%A0%EB%B0%9B%EB%8A%94%20%ED%96%89%EC%9C%84%20%EB%98%90%EB%8A%94%20%EA%B7%B8%EC%97%90%20%EB%8C%80%ED%95%9C%20%EB%B0%A9%EB%B2%95%EC%9D%B4%EB%82%98%20%EA%B2%BD%EB%A1%9C%EB%A5%BC%20%EB%9C%BB%ED%95%9C%EB%8B%A4.)를 통해 프로세스 간에 통신을 할 수 있습니다. +IPC에는 공유 메모리를 이용한 통신과 파일을 통한 프로세스 간 통신 이렇게 두 가지 방법이 있습니다. + +> IPC 통신 시, 프로세스 간 데이터를 동기화하고 보호하기 위해 [세마포어](https://ko.wikipedia.org/wiki/%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4)와 [뮤텍스](https://ko.wikipedia.org/wiki/%EC%83%81%ED%98%B8_%EB%B0%B0%EC%A0%9C)를 사용합니다. \ No newline at end of file diff --git a/contents/posts/os/4/img.png b/contents/posts/os/4/img.png new file mode 100644 index 0000000..c48a254 Binary files /dev/null and b/contents/posts/os/4/img.png differ diff --git a/contents/posts/os/4/img_1.png b/contents/posts/os/4/img_1.png new file mode 100644 index 0000000..8cdb98b Binary files /dev/null and b/contents/posts/os/4/img_1.png differ diff --git a/contents/posts/os/4/img_2.png b/contents/posts/os/4/img_2.png new file mode 100644 index 0000000..00c615c Binary files /dev/null and b/contents/posts/os/4/img_2.png differ diff --git a/contents/posts/os/4/img_3.png b/contents/posts/os/4/img_3.png new file mode 100644 index 0000000..3bdb369 Binary files /dev/null and b/contents/posts/os/4/img_3.png differ diff --git a/contents/posts/os/4/index.md b/contents/posts/os/4/index.md new file mode 100644 index 0000000..baca002 --- /dev/null +++ b/contents/posts/os/4/index.md @@ -0,0 +1,85 @@ +--- +title: "4. 쓰레드 " +description: +date: 2025-09-08 +update: 2025-09-08 +tags: + - 운영체제 +series: "운영체제" +--- + +## 쓰레드란? + +쓰레드는 프로세스를 구성하는 실행 흐름의 단위를 의미합니다. + +![](img.png) + +그래서 하나의 프로세스는 1개 이상의 쓰레드를 가집니다. +이로 인해 하나의 프로세스에서 여러 작업을 동시에 수행할 수 있습니다. + +> #### 사용자 수준 쓰레드와 커널 수준 쓰레드의 차이 +> 사용자 수준 쓰레드란, 라이브러리를 통해 구현한 쓰레드를 의미합니다. +> 쓰레드와 관련된 모든 행위를 사용자 영역에서 하기 때문에, +> 커널은 사용자 수준 쓰레드의 존재를 알지 못하고 쓰레드 교환에 개입하지 않습니다. +> 커널 수준 쓰레드란, 커널이 직접 생성하고 관리하는 쓰레드를 의미합니다. + +## 쓰레드의 메모리 공간 + +같은 프로세스의 쓰레드는 프로세스로부터 각각의 스택을 나눠갖지만 Code, Data, Heap 메모리 영역을 공유합니다. +하지만, 쓰레드 ID, 스택, PC나 레지스터 같은 쓰레드 컨텍스트에 대해서는 각기 다른 값을 가지고 있습니다. + +![](img_1.png) + +이렇게 각자의 PC, 레지스터, 스택을 가지고 있기에 쓰레드마다 독립적으로 실행할 수 있습니다. + +여기서 중요한 점은 프로세스의 쓰레드들은 실행에 필요한 최소한의 정보(PC, 레지스터, 스택)만을 유지한 채 +프로세스 자원을 공유하며 실행된다는 점입니다. + +## TCB(쓰레드 제어블록) + +쓰레드 또한 프로세스의 PCB(프로세스 제어 블록)처럼 TCB(쓰레드 제어 블록)을 통해 관리됩니다. +TCB는 각 쓰레드에 위치하고, 커널은 TCB를 통해 쓰레드를 관리합니다. + +그럼 TCB에는 어떤 정보가 담겨있을까요? +TCB에는 아래와 같은 쓰레드의 메타데이터들이 담겨져 있습니다. + +![](img_2.png) + +- 쓰레드 번호(TID, Thread ID): 각 쓰레드의 고유 식별 번호입니다. +- 스택 포인터 (Stack Pointer): 쓰레드가 존재하는 프로세스의 PCB에 대한 포인터 +- 프로그램 카운터(PC, Program Counter): 이 쓰레드에서 실행될 다음 명령어의 주소를 가리키는 포인터(주소)입니다. +- 쓰레드 상태(Thread State): 쓰레드가 현재 어떤 상태인지를 나타내는 정보(new, ready, running, waiting, end)입니다. +- 레지스터 상태(Register State): 쓰레드의 레지스터 값 세트입니다. + +각 프로세스에 대한 중요 정보를 강조하는 특정 정보가 쓰레드 제어 블록에 저장됩니다. + +## 프로세스와 쓰레드의 차이 + +프로세스는 각각 독립된 메모리 영역(Code, Data, Heap, Stack)을 할당받고 고유 프로세스 ID를 가지는 특성으로 인해, +프로세스끼리는 서로의 영역에 접근할 수 없습니다. +그래서 한 프로세스가 다른 프로세스의 자원에 접근하려면 IPC(inter-process communication)을 사용해야 합니다. + +하지만, 쓰레드는 IPC와 같은 별도의 통신 방법 없이도 앞서 언급한 것처럼 프로세스의 Code, Data, Heap 메모리 영역을 공유합니다. + +이처럼 프로세스들 사이의 통신에 대한 어려움 해소 및 빠른 컨텍스트 스위칭으로 인해 쓰레드가 프로세스보다 더 가벼운 실행 단위로 사용됩니다. +이로 인해 현대에 와서 운영체제의 실행단위는 프로세스에서 쓰레드로 바뀌어 가고 있습니다. + +## 동시성 환경에서의 차이 + +동시성 환경에서는 어떤지 알아볼까요? +여러 프로세스를 동시에 실행하는 멀티 프로세스와 한 프로세스에서 여러 쓰레드를 동시에 실행하는 멀티 쓰레드가 있습니다. + + +![](img_3.png) + +여기서 가장 큰 차이점은 프로세스끼리는 기본적으로 공유하지 않지만, 쓰레드끼리는 같은 프로세스 내의 자원을 공유한다는 점입니다. + +즉, 멀티 프로세스는 여러 프로세스를 동시에 실행해 각각의 독립적인 프로세스 간 자원을 공유하지 않기 때문에 프로세스 간 통신 (IPC) 방식을 써야 합니다. +또한, 메모리에 동일한 내용들이 중복해서 존재하기 때문에 메모리에도 부담이 될 수 있습니다. +그러나 한편으로는 자원을 공유하지 않는 덕분에 하나의 프로세스에 문제가 생겨도 다른 프로세스들에는 문제가 발생하지 않는다는 장점이 있기도 합니다. + +반면, 멀티 쓰레드는 실행에 필요한 최소한의 정보(PC, 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행되기에 +커널의 개입 없이 쓰레드간 통신을 할 수 있고, 메모리에도 부담이 덜합니다. +또한 fork로 인한 생성이 공유하는 부분을 제외한 부분만 복사하면 되기 때문에 프로세스보다 빠릅니다.(쓰레드가 접근하는 공유 데이터에 대해 동기화 작업을 수행해야 합니다) +
+하지만, 하나의 쓰레드에 문제가 생기면 같은 프로세스 내의 다른 쓰레드들에도 문제가 발생할 수 있다는 단점이 있습니다. diff --git a/contents/posts/os/5/index.md b/contents/posts/os/5/index.md new file mode 100644 index 0000000..c8206bb --- /dev/null +++ b/contents/posts/os/5/index.md @@ -0,0 +1,134 @@ +--- +title: "5. CPU 스케줄링" +description: +date: 2025-09-12 +update: 2025-09-12 +tags: + - 운영체제 +series: "운영체제" +--- + +## 기아 상태와 CPU 스케줄링 + +프로세스들은 실행할 때 컴퓨터 자원을 사용하는데, 이때 CPU도 사용합니다. +그런데 만약 하나의 프로세스가 오랜 시간 동안 CPU를 점유하거나, +너무 짧은 텀동안만 실행되는 경우 공정하지 못한 방법으로 자원을 할당하게 될 것이고 +이는 시스템의 효율적이지 못한 방법으로 돌아가게 하는 길을 초래할 수 있을 겁니다. +이를 컴퓨팅에서는 기아 현상이라고 하는데, +이로 인해 프로세스들에게 CPU 자원 할당을 배분해주는 CPU 스케줄링이 개발되었고, +운영체제에 반드시 필요로 하게 되었습니다. + +> 기아 현상에 대한 대표적인 해결 방법은 에이징 기법을 이용하는 것입니다. +> 오랫동안 대기한 프로세스의 우선순위에 대해 가중치를 주어, +> 처음에 우선순위가 낮아도 언젠가는 우선순위가 높아져 기아 현상을 막을 수 있습니다. +> 이와 같이 CPU 스케줄링에서는 이러한 문제 해결을 위한 다양한 방식들이 있습니다. + +## 프로세스 우선 순위 + +스케줄링을 지정하는 것은 순서를 지정하는 것과 같습니다. +그런데 어떻게 프로세스들 간의 순위를 공정하게 지원하고 있을까요? + +### 순차방식 + +가장 단순하게 생각해보면 요청이 들어온 순서대로 할당하는 방식입니다. +그러나 이 방식은 빨리 처리해야 하는 프로세스가 있을 수 있는 상황에서 대응하지 못한다는 것입니다. + +예시로 CPU를 많이 사용하는 프로세스가 I/O 작업을 하는 프로세스 보다 늦게 들어올 경우, +순서상으로는 뒤에 있어야 하지만, CPU 자원을 할당한다는 측면에서 볼 떄에는 앞 순위로 두는 것이 효울적일 것입니다. + +### 우선순위 지정 방식 + +위 순차적인 방식이 아닌, 별도의 우선순위를 지정하는 방식도 있습니다. +이때, 우선순위에 대한 정보는 PCB에 저장이 됩니다. + +이로 인해 프로세스의 중요도에 맞게 프로세스가 CPU를 이용할 수 있도록 운영체제가 부여하는 것이 우선순위이며, +운영체제는 PCB를 기반으로 어떤 프로세스가 CPU를 얼마나 사용하게 될 것인지 등을 결정합니다. + +프로세스 우선순위는 간단한 명령어나 프로그램 등으로 확인이 가능한데, +일부 우선순위의 경우에는 사용자가 직접 설정 가능한 것도 있습니다. + +### 스케줄링 큐 + +프로세스가 여러 개일 경우, 다음 CPU 자원을 이용할 프로세스를 선택하기 위해 매번 모든 프로세스들의 PCB를 다 뒤져보는 것은 매우 비효율적일 것입니다. +또한, CPU 말고도, 메모리, 입출력 장치를 사용하고자 하는 경우에도 비슷한 상황을 겪을 것입니다. + +때문에 운영체제는 어떤 자원을 이용하고자 할 때 대기 하는 스케줄링 큐를 활용하고 있습니다. + +이때, 큐라고 해서 반드시 선입선출(FIFO)에 국한되지 않습니다. + +## 선점형 스케줄링과 비선점형 스케줄링 + +스케줄링 방식에는 선점형 스케줄링과 비선점형 스케줄링 방식이 있습니다. + +### 선점형 스케줄링 + +선점형 스케줄링은 현재 CPU를 사용 중인 프로세스로부터 CPU 자원을 뺴앗아 요청한 프로세스에 할당하는 방법입니다. +어느 한 프로세스의 자원 독점을 막고 프로세스에 골고루 자원을 배분할 수 있으나, 그 만큼 컨텍스트 스위칭 과정에서 오버헤드가 발생할 수 있습니다. + +### 비선점형 스케줄링 + +비선점형 스케줄링은 현재 CPU를 사용 중인 프로세스의 작업이 끝날 때까지 기다리는 방식입니다. + +선점형 스케줄링과 반대되는 개념으로, 컨텍스트 스위칭에서 발생하는 오버헤드가 적지만, 한편으로는 모든 프로세스가 골고루 자원을 이용하기 어렵습니다. + +## CPU 스케줄링 알고리즘 + +선점형 스케줄링과 비선점형 스케줄링을 기반으로 다양한 CPU 스케줄링 알고리즘이 있습니다. + +### 선입 선처리 스케줄링 + +FCFS(First Come First Served) 스케줄링으로, 준비 큐에 삽입된 순서대로 처리하는 비선점 스케줄링 방식입니다. +CPU를 먼저 요청한 프로세스부터 CPU를 할당합니다. +이로 인해 프로세스들이 기다리는 시간이 매우 길어질 수 있는 부작용이 있으며, +이를 convoy effect, 호위 효과라고 합니다. + +### 최단 작업 우선 스케줄링 + +SJF(Shortest Job First) 스케줄링으로, +사용 시간이 긴 프로세스를 나중에 실행하고, +시간이 짧은 프로세스를 먼저 실행함으로써 평균 대기 시간을 줄일 수 있습니다. +이 알고리즘은 기본적으로는 비선점형 스케줄링 방식에 속하지만, +선점형과 비선점형 스케줄링 방식으로 모두 가능합니다. + +### 라운드 로빈 스케줄링 + +RR(Round Robin) 스케줄링으로, +선입 선처리 스케줄링과 시분할 시스템의 타임 슬라이스(time slice) 개념이 결합된 방식입니디. +정해진 타임 슬라이스만큼의 시간 동안 돌아가며 CPU를 이용하게 하는 선점형 스케줄링입니다. + +### 최소 잔여 시간 우선 스케줄링 + +SRT(Shortest Remaining Time) 스케줄링으로, +최단 작업 우선 스케줄링과 라운드 로빈 스케줄링이 결합된 형태입니다. +정해진 시간만큼 CPU를 이용하되, +다음으로 CPU를 사용할 프로세스로는 남은 작업 시간이 가장 적은 프로세스를 선택합니다. + +### 우선순위 스케줄링 + +프로세스들에 우선순위를 부여하고, 우선순위가 높은 프로세스부터 실행하는 방식입니다. +우선순위가 같은 프로세스들은 선입 선처리 스케줄링으로 돌아가고, +최단 작업 우선 스케줄링이나 최소 잔여 시간 스케줄링은 포괄적인 의미에서 우선순위 스케줄링에 속한다고 할 수 있습니다. + +### 다단계 큐 스케줄링 + +멀티 레벨 큐 스케줄링으로도 불리는데, 우선순위 스케줄링의 발전된 형태입니다. +우선순위 별로 준비 큐를 여러 개 사용하고, 우선순위가 높은 큐에 있는 프로세스를 먼저 실행합니다. +우선순위가 높은 큐가 비어 있다면, 그 다음 우선순위 큐에 있는 프로세스를 처리합니다. +이러한 방식은 프로세스 유형별로 우선순위를 구별하게 하여 관리가 쉬워집니다. +큐 별로 타임 슬라이스를 여러 개 지정할 수도 있고, 큐마다 다른 스케줄링 알고리즘을 사용할 수도 있습니다. +기본적으로 큐 간 이동이 불가능하기 때문에, 우선순위가 낮은 프로세스는 계속해서 우선순위가 낮을 수 밖에 없고, +그로 인해 기아 현상을 겪을 수도 있습니다. + +### 다단계 피드백 큐 스케줄링 + +멀티 레벨 피드백 큐 스케줄링으로도 불리는 이 방식은 다단계 큐 스케줄링의 발전된 형태로, +큐 간 이동이 가능합니다. +새로 준비 상태로 된 프로세스가 있으면 가장 우선순위가 높은 큐에 삽입합니다. +일정 시간 즉, 타임 슬라이스 만큼 CPU를 사용할 수 있는데, +만약 작업이 끝나지 않았다면, +그때 우선순위가 다음으로 높은 곳에 삽입을 합니다. +작업을 많이 있는 프로세스일수록 우선순위가 점점 낮아지게 되고, +따라서 CPU 집중 프로세스는 상대적으로 우선순위가 낮아지고, 입출력 집중 프로세스는 높아지게 될 겁니다. +일정 시간 이상 낮은 우선순위에서 기다리고 있던 프로세스가 있었다면 이 프로세스의 우선순위를 점차 높임으로써 기아 현상을 방지할 수 있습니다. +다단계 피드백 큐 스케줄링은 CPU 사용 시간이 길면 우선순위가 점점 낮아지고, 동시에 어떤 프로세스가 낮은 우선순위 큐에서 너무 오래 기다리면 우선순위를 높일 수도 있습니다. +다단계 피드백 큐 스케줄링은 복잡하지만, CPU 스케줄링의 가장 일반적인 형태로 알려져 있습니다.