[Kernel]
📌 Kernel
운영체제는 규모가 매우 큰 프로그램이므로 운영체제의 모든 부분을 메모리에 올려놓는 것은
메모리 측면에서 봤을 때 굉장히 비효율적이다.
따라서 운영체제는 필요한 부분만을 메모리에 올려서 사용하게 되는데,
이때 메모리에 상주하는 운영체제의 핵심 부분을 <커널>이라 한다.
커널은 메모리에 상주하는 부분이므로 운영체제의 핵심 부분이라고 볼 수 있기 때문에,
주로 "운영체제 = 커널" 이라고도 한다.
[Kernel의 구조 및 기능]
📌 Process
실행 파일을 클릭했을 때, 메모리(RAM)할당이 이루어지고, 이 메모리 공간으로 코드가 올라간다.
이 순간부터 이 프로그램은 process라 불리게 되고 실행 중인 프로그램을 process라 한다.
(Process : 실행 중인 프로그램의 인스턴스)
프로세스는 독립된 메모리 영역을 할당받아
자신만의 실행 공간(주소 공간, 레지스터, 스택, 힙 등을 포함한 여러 자원)을 가진다.
✅ 주소 공간은 코드와 데이터를 저장하고,
✅ 레지스터는 CPU 연산에 필요한 정보를 담고,
✅ 스택은 함수 호출과 관련된 데이터를 보관하며,
✅ 힙은 동적으로 할당된 메모리를 관리한다.
요약하면, 커널의 프로세스는 실행 중인 프로그램을 나타내며, 이 프로그램의 코드와 데이터,
실행 상태 등을 관리하고 스케쥴링하여 시스템의 효율성과 동시성을 유지한다.
Thread
스레드는 하나의 프로세스 내에서 실행되는 작은 실행 단위를 나타낸다.
한 프로세스 내에서 여러 개의 스레드가 동시에 실행될 수 있으며,
스레드는 해당 프로세스의 자원을 공유하면서 실행되고,
스레드는 프로세스 내에서의 경량화된 실행 단위로,
프로세스의 생성과 종료보다 빠르고 경제적이다.
멀티 스레딩은 한 프로세스 내에서 여러 스레드가 동시에 실행되는 것을 의미한다.
📌 Task
Task는 일련의 명령어나 작업을 수행하는 최소 단위를 의미하며,
이는 Process로 실행될 수 있고 주로 운영체제의 관점에서 작업을 나타내는 용어로 사용됨과 동시에
시스템 내에서 실행되는 작업을 추상화하는 개념이다.
즉, 프로세스와 스레드를 의미한다.
Task는 일반적으로 코드, 데이터, 실행 상태, 메모리 할당 등을 가질 수 있고,
운영체제는 작업을 관리하고 스케쥴링하여 여러 작업이 공평하게 실행되며
시스템 리소스를 효율적으로 사용할 수 있도록 한다.
Task와 Job의 차이
Task와 Job 둘 다 비슷한 개념이지만, 약간의 차이가 존재한다.
① Task
- 주로 운영체제 관련 용어로,
실행 중인 프로그램이나 작업의 작은 단위를 의미한다.
- 하나의 프로세스 내에서 여러 개의 작업 또는 동작이 동시에 진행될 수 있을 때,
각 작은 동작을 Task라고 부른다.
- 예시 : 워드 프로세싱 프로그램에서 문서를 편집하고 있는 도중에도
철자 검사 및 자동저장과 같은 별도의 작업이 Task로 존재할 수 있다.
② Job
- Task의 실행 단위로서 테스크 내부에 정의된 동작을 의미한다.
- 주로 배치 처리 시스템에서 사용되며,
비슷한 유형의 작업을 모아서 일괄적으로 실행하고 관리한다.
- 예시 : Task A가 10ms마다 한 번씩 실행된다면,
각 주기마다 실행되는 instance를 job이라 부른다.
요약하면,
✅ Task는 작업의 작은 단위를 의미하며 주로 운영체제와 연관되어 사용되고,
✅ Job은 테스크의 실행 단위로서 Job들의 묶음이 Task이다.
📌 Scheduling
작업을 진행하다 보면, CPU는 하나지만 동시에 여러 작업을 수행해야 하는 경우가 많이 발생한다.
하지만 CPU는 한 번에 한 작업만 수행할 수 있기 때문에 여러 개의 프로세스를 번갈아 가며 실행시키는 방법을 채택하였고
CPU는 매우 고속이기 때문에 번갈아 가며 실행해도, 우리 눈에는 동시에 실행되는 것처럼 보이게 된다.
이러한 멀티프로세스 OS에서 프로세스의 CPU 할당 순서 및 방법을 결정짓는 것을 "Scheduling"이라 한다.
[Scheduling Algorithm]
📌 FCFS(First-Come, First-Served)
먼저 도착한 작업을 먼저 실행하는 방식이다.
즉, Queue에 도착한 순서대로 작업을 처리하는 방식을 말한다.
이 스케쥴링 알고리즘은 간단하고 직관적인 특징을 가지고 있으며,
작업이 큐에 도착한 순서대로 처리되므로 공정한 실행 순서를 보장해준다.
하지만 작업의 실행 시간이 다양하거나 긴 작업이 먼저 도착하면,
작업이 늦게 끝나는 "대기 시간 폭발" 문제가 발생할 수도 있다.
즉, 짧은 작업이 긴 작업의 뒤에 위치하면서 짧은 작업들이 오래 기다려야 하는 상황이 발생할 수 있다.
또한 작업이 블록 상태에 들어가면 해당 작업의 실행이 중단되고 다음 작업이 실행된다.
블록된 작업이 다시 준비 상태에 돌아와도 그 작업이 큐에 먼저 도착한 순서대로 실행되므로
블록된 시간만큼의 지연이 발생할 수 있다.
즉, FCFS 스케쥴링은 먼저 도착한 작업을 먼저 실행하는 방식으로
공정성을 제공하지만 대기 시간문제와 블록된 작업의 지연 문제를 가지고 있다.
📌 Round-Robin Scheduling(라운드-로빈 스케쥴링)
Round-Robin 알고리즘은 선점형(Preemptive) 알고리즘으로 ,시분할 시스템을 위해 설계되었다.
FCFS 스케쥴링과 비슷하지만 시스템이 프로세스들 사이를 옮겨 다닐 수 있도록 "선점"이 추가되고
시간 할당량(Time Quantum) 또는 Time slice라는 시간의 단위를 정의하여 구현한다.
일반적으로 Time Quantum은 10~100ms 이다.
기본 아이디어는 각 프로세스에 일정한 시간 할당량을 부여하고,
할당된 시간이 지나면 해당 프로세스를 일시적으로 중단한 뒤 다음 프로세스로 넘어가게 되며,
이러한 방식으로 모든 프로세스가 번갈아 실행되는 것처럼 보이게 된다.
(여기서 넘어가는 과정이 Context Switching)
만약 할당된 시간 내에 프로세스가 종료되거나 블록 상태에 들어간다면,
다음에 실행될 프로세스가 선택된다.
RR Scheduling의 장단점
라운드 로빈 스케쥴링의 장점은 공정성(Fairness)을 제공한다는 점이다.
모든 프로세스가 동일한 시간을 얻어 실행되므로, 어떤 프로세스가 계속해서 CPU를 독점하는 상황을 방지할 수 있으며,
또한 빠른 응답 시간을 제공할 수 있어 사용자 경험을 향상시킬 수 있다.
하지만 RR 스케쥴링에는 시간 할당량을 어떤 값으로 설정하느냐에 따라 성능이 크게 달라진다는 단점이 있다.
✅ 시간 할당량을 너무 작게 설정하면 프로세스 전환이 너무 빈번해져 Overhead가 발생하고,
✅ 시간 할당량을 너무 크게 설정하면 응답 시간이 늦어지는 문제가 발생할 수 있다.
[Context Switching]
📌 Context Switching이란?
Context Switching은 프로세스 전환 동작 방식 중 하나로,
운영체제에서 다른 프로세스나 스레드로 제어권을 넘기는 작업을 의미한다.
현재 실행 중인 프로세스 또는 스레드의 상태 정보(레지스터 값, 프로그램 카운터 등)를 저장하고
다음에 실행될 프로세스 또는 스레드의 상태 정보를 불러오는 과정을 포함한다.
또한 Context Switching은 멀티태스킹 환경에서 다른 프로세스나 스레드로 전환할 때 필요한 기술적인 작업이며,
다중 프로세스 또는 스레드 환경에서 여러 작업이 동시에 실행되기 때문에
CPU의 제어권을 효율적으로 관리하기 위해 필요하다.
실행되는 프로세스의 변경 과정에서 발생하는 컨텍스트 스위칭은 시스템에 많은 부담을 주고
레지스터의 갯수가 많을수록, 프로세스별로 관리되어야할 데이터 종류가 많을수록 더 큰 부담이 된다.
따라서 CS에 소요되는 시간을 줄이려면, 저장하고 복원하는 컨텍스트 정보의 갯수를 줄여주면 된다.
PCB(Process Control Block)
(1) OS가 관리상 사용하는 정보
- Process state, Process ID
- Scheduling information, Priority
(2) CPU 수행 관련 H/W value
- Program counter, registers
(3) Memory 관련
- code data stack의 위치 정보 파일 관련
: Open file descriptors 등
📌 Context Switching Sequence
① 현재 실행 중인 프로세스 또는 스레드의 상태 정보를 저장한다.
이는 레지스터 값, 프로그램 카운터, 스택 포인터 등이 포함된다.
② 다음에 실행할 프로세스 또는 스레드의 상태 정보를 불러온다.
이 정보는 저장된 상태에서 복원된다.
③ 제어권이 전환되고, CPU는 새로운 프로세스나 스레드의 코드를 실행한다.
CS는 Overhead가 발생하는 작업이므로,
상태 정보를 저장하고 복원하는 과정은 CPU 연산이 소요되고
이로 인해 시스템 성능에 영향을 줄 수 있다.
따라서 효율적인 스케쥴링과 함께 CS의 빈도를 최소화하는 것이 중요하다.
'# Programming > - Embedded 관련 지식' 카테고리의 다른 글
신개념 컴퓨터 아키텍쳐, CXL이란? (0) | 2023.09.20 |
---|---|
임베디드 시스템의 핵심 기술, RTOS란? - Part.2 (CPU 동작 단계, CPU Scheduling, Process, Task vs Thread) (0) | 2023.09.04 |
공유 자원을 관리하는 두 가지 방법 : Mutex / Semaphore (0) | 2023.09.01 |
Computer Architecture, RISC & CISC란? (0) | 2023.08.17 |
임베디드 시스템의 핵심 기술, RTOS란? - Part.1 (기본 개념 및 특징, FreeRTOS, OSEK/VDX, 용어 정리-Task, Deadline 등) (0) | 2023.08.16 |