
☑️ Process
실행 중인 프로그램의 OS에서의 관점을 프로세스라고 한다.
OS에서 프로그램을 실행하면 HDD에서 RAM으로 로드된다. 그리고 OS에서 정해둔 일련의 과정을 따라서 프로그램을 실행하게 되는데, 이때 메모리에 담긴 프로그램의 정보 집합을 프로세스라고 한다.
⭐ 왜 프로세스라는 개념이 있을까?
프로세스는 현대의 컴퓨터에서 중요한 개념이다. 컴퓨터는 추상화 기법을 사용해서 대부분의 동작을 처리한다. 만약에 추상화 기법이 존재하지 않는다면, 여러 개의 프로그램을 개발하고 컴퓨터에서 실행하려고 할 때 프로그램 실행을 위해서 각각에 알맞은 방법들을 지정을 해주어야 한다.
추상화 개념을 적용하게 된다면 OS 입장에서는 필요한 정보를 미리 정해둠으로써, 프로그램은 OS가 요구하는 정보를 전달함으로써 별도의 추가 개발 없이 프로그램을 실행할 수 있게 된다. 필요한 정보나 규격에 대해서 약속을 해둔 것이 프로세스다.
⭐ 프로세스의 구조
어떤 방식으로 프로세스가 프로그램의 추상화를 만들었을까? 이러한 생각을 풀어내기 위해서는 프로세스의 구조를 생각하면 된다. 하지만, 그전에 한 가지 생각을 가져가보자. 프로그램은 데이터 집합이다.
유동적으로 변경되는 프로그램은 동적이고 살아있는 존재로 느껴지지만, 프로그램은 코드와 코드에 필요한 리소스의 집합이다. 즉, 단순히 프로그램은 실행에 필요한 데이터를 뭉쳐둔 집합이다.
그렇기 때문에 프로세스는 OS에서 실행에 용이하도록, 데이터 집합을 규격에 맞춰서 배열해 둔 논리적 그룹으로 정리할 수 있다.

위 이미지를 통해서 프로세스 구조를 단순하게 4가지의 영역으로 생각할 수 있다.
- 코드 영역
- 실행에 필요한 프로그램의 코드가 저장된다.
- 데이터 영역
- 전역 변수, 정적 변수, 상수, 등의 데이터를 저장한다.
- 초기화된 데이터 영역(Initialized data)와 초기화되지 않은 영역(Bss)으로 나뉜다.
- 힙 영역
- 동적 할당된 데이터를 저장하는 영역
- 스택 영역
- 함수 호출 시 매개 변수, 지역 변수, 등의 데이터가 저장되는 영역
⭐ 프로세스의 상태
OS에서 좋은 성능을 가지기 위해서는 프로세스를 잘 관리해야 한다. 이번 주차의 키워드들도 결국 프로세스를 효율적으로 관리하는 방법들이다. 프로세스는 효율적인 관리를 위해서 다음과 같이 여러 상태를 가진다.
- New
- 프로세스가 처음 생성된 상태
- Ready
- 실행을 위해 CPU 할당을 기다리는 상태
- Running
- 실행 중인 상태
- 한 번에 하나의 프로세스만 Running 상태를 가진다.
- Blocked/Wait
- I/O 혹은 다른 이벤트를 기다리는 상태
- 다른 사유로 인해서 지연될 때
- 프로세스 우선순위에 따라 달라진다.
- Terminated
- 프로세스 실행이 완료된 상태
⭐ 정리
- 프로세스는 실행 중인 프로그램을 추상화한 결과다.
- 프로세스는 OS에서 관리하는 작업의 단위를 의미한다.
- 데이터 집합을 논리적으로 나열한 규격을 프로세스라고 한다.
- 프로세스는 효율적인 관리를 위해서 여러 상태를 가진다.
☑️ Threads
CPU에서 처리하는 작업의 단위
쓰레드는 프로세스와 밀접한 관련이 있다. 프로세스가 없으면, 스레드도 존재할 수 없다. 앞서 프로세스는 OS에서 관리하는 작업의 단위로 규정했다. 스레드는 CPU 입장에서 실행 가능한 일의 단위를 의미한다.
⭐ 왜 쓰레드가 필요한가?
프로그램의 작업을 모두 프로세스로 사용하게 된다고 가정하자. 프로세스는 앞서 이야기한 것처럼 실행 중인 프로그램의 데이터를 를 가지고 있다. 문맥 교환(Context-Switching)을 통해서 프로세스를 Swap 하면, 큰 단위의 데이터를 움직이게 된다.
또, 새로운 작업을 위해서 프로세스를 생성하는 것도 모든 데이터를 생성하게 된다. 즉, 프로세스 생성과 프로세스 교체는 무거운 작업이다. 이로 인해서 많은 성능적 비용이 들게 되었고 해결하기 위해서 더 가벼운 실행 단위가 필요하게 되었고, 스레드란 개념이 생겨났다.
⭐ 쓰레드의 특징
- 하나의 프로세스에서 단일/복수의 스레드를 가질 수 있다.
- 스레드는 서로 프로세스의 자원을 공유한다.
- 공유 자원이 존재하기 때문에 문제가 발생하게 된다.
- 문제가 발생하게 되는 영역을 임계 영역(Critical Section)이라고 한다.
- 공유 자원이 존재하기 때문에 문제가 발생하게 된다.
☑️ CPU Scheduling 알고리즘
⭐ FCFS (First Come First Served)
- CPU에서 동작해야 할 작업 A, B, C가 있다고 가정하자.
- 작업 A, B, C에 소요되는 작업 시간은 각자 10초씩 걸린다.
- 평균 반환 시간은 (작업 A + 작업 B + 작업 C) / 3으로 20초가 된다.
- 작업 A에 처리되는 시간 = 10초
- 작업 B에 처리되는 시간 = 20초
- 작업 A 다음에 실행되기 때문
- 작업 C에 처리되는 시간 = 30초
- 작업 B 다음에 실행되기 때문
- FCFS 알고리즘은 작업이 들어온 순서대로 작업을 처리하게 된다.
- 위 예시에서 작업 A의 소요 시간을 100초로 가정하면, 평균 반환 시간은 110으로 시간이 길어진다.
- ( 100초 + 110초 + 120초 ) / 3 = 110
- 이와 같이 CPU를 오래 사용하는 프로세스를 기다리는 현상을 호위 효과(Convoy Effect)라고 한다.
⭐ SJF (Shortest Job First)
- FCFS는 작업이 들어온 시간을 기준으로 처리하기 때문에 Convoy Effect가 나타남을 확인했다.
- SJF는 가장 빨리 끝나는 작업을 우선으로 할당하는 기법이다.
- 작업 A, B, C가 각각 100초, 5초, 10초가 걸린다면 작업 진행 순서는 B -> C -> A다.
- 단, 먼저 들어온 작업의 시간이 100초면 FCFS와 같이 Convoy Effect가 다시 일어난다.
- 작업 A가 수행되는 시간에 작업 C와 B가 들어온다면, A -> B -> C가 된다.
⭐ SRTF (Shortest Time-To-Completion First)
- SJF의 단점을 보완하기 위해 고안되었다.
- SJF에서 실행 중인 작업을 중단할 수 있는 개념이 추가되었음
- SJF의 예시에서 작업 A가 실행되는 중에 작업 B와 C가 들어온다면 A의 작업을 중지하고 B를 실행한다.
- 단, 작업 소요 시간이 적은 것을 우선적으로 처리하기 때문에 작업 소요 시간이 길다면, 수행까지 오래 걸릴 수 있는 단점이 존재한다.
⭐ Round Robin
- 위의 단점을 보완하기 위해서 응답 시간이라는 개념을 적용한 기법
- 응답 시간은 첫 스케줄 시간 - 도착 시간을 의미한다.
- 응답 시간 = (처음으로 작업이 수행된 시간) - (작업이 CPU로 도착한 시간)
- Round Robin 알고리즘은 모든 작업을 동일하게 N초 동안 수행한다.
- 이때, 수행되는 N초를 타임 슬라이스(Time Slice) 혹은 스케쥴링 퀀텀(Scheduling Quantum)이라고 부른다.
- 일반적으로 타이머 인터럽트의 배수로 지정된다.
- 작업 A, B, C가 있고, 5초간 실행되고 타임 슬라이스는 1이라고 가정하자.
- 작업 A 실행 -> 1초 뒤 -> 작업 B 실행 -> 1초 뒤 -> 작업 C 실행 -> 1초 뒤 -> 작업 A 실행 ->... -> 작업 C 종료
- 이로 인해서 평균 응답 시간은 1초가 된다.
- 타임 슬라이스 주기가 짧으면 라운드 로빈의 성능은 향상된다.
- 단, Context-Switching이 빈번하게 일어나므로, 낮추는 것은 한계가 존재한다.
- 성능과 시간의 트레이드 오프 발생
⭐ Multilevel Queue Scheduling
- 기본적으로 여러 개의 Queue를 사용하는 스케쥴링 방식이다.
- 프로세스가 한 번 Queue에 할당되면 다른 Queue로 이동이 불가능하다.
- 우선순위가 고정되어 있으며, 기아 현상의 발생 가능성이 높다.
☑️ Race Condittion
경쟁 상태(Race Condition)는 공유 자원에 쓰레드가 동시 접근했을 때, 실행된 결과가 접근 순서에 따라서 달라지는 상황을 의미한다.
- Int 타입 변수 Like에 +1을 더해주는 AddLike 함수가 있다.
- 쓰레드 A와 쓰레드 B가 동시에 AddLike 함수에 접근했다고 생각해 보자.
- 쓰레드 A와 쓰레드 B가 Like 변수를 찾았을 때, Like 변수의 값은 0이다.
- AddLike 함수는 단순히 +1만 처리하게 된다.
- 최종적으로 쓰레드 A와 쓰레드 B가 각각 1번씩 실행됐음에도 변수 Like의 값은 1이다.
- 의도한 결과는 Like의 값이 2가 되어야 한다.
☑️ Deadlock
프로세스 A와 프로세스 B가 다음 작업 진행을 위해서 다른 프로세스가 가진 자원을 무한히 대기하는 상태를 의미한다.
- 프로세스 A는 프로세스 B가 보유한 자원이 필요하다.
- 프로세스 B도 프로세스 A가 보유한 자원이 필요하다.
- 프로세스 A, B는 서로가 가진 자원이 필요하기 때문에 무한히 대기하게 된다.
☑️ Semaphore
여러 개의 프로세스가 공유 자원에 접근할 수 있도록 허용하는 카운터 기반의 동기화 도구를 의미한다.

☑️ Mutex
오직 하나의 프로세스만이 공유 자원에 접근할 수 있도록 이진 세마포어의 한 형태를 의미한다.

☑️ Context Switching
- CPU가 현재 실행 중인 프로세스/스레드에서 다른 프로세스/스레드로 전환하는 과정을 의미한다.
- 이 경우, 현재 실행 중인 프로세스/스레드의 상태(컨텍스트)를 저장해야 한다. ( PCB/TCB )
- 이후 다시 실행될 가능성이 있기 때문
- 새로운 프로세스/스레드의 상태를 CPU 레지스터에 적재한다.
- 이 경우, 현재 실행 중인 프로세스/스레드의 상태(컨텍스트)를 저장해야 한다. ( PCB/TCB )
- 컨텍스트 스위칭은 인터럽트 발생 시, 혹은 다른 이유로 인해서 발생한다.
☑️ Multi-Level Feedback Queue Scheduler
- 앞서 Multilevel Queue를 이야기할 때, 여러 개의 Queue를 사용하는 기법이라고 설명했다.
- MLFQ(Multi-Level Feedback Queue)도 동일하게 여러 개의 Queue를 사용한다.
- Multilevel Queue와는 다르게 다른 기법들이 추가되어 있다.
- MFLQ는 다음의 규칙을 따르는 Scheduler를 의미한다.
- 규칙 1. 우선순위(A) > 우선순위(B), A를 우선 실행한다.
- 규칙 2. 우선순위(A) = 우선순위(B), A와 B를 RR 방식으로 실행한다.
- 규칙 3. 작업이 시스템에 최초 할당되면 가장 높은 우선순위의 Queue에 진입한다.
- 규칙 4. 현재 Queue에서 주어진 TimeSlice를 다 소모하면 우선순위는 낮아진다.
- 규칙 5. 어떤 시간 N이 지나면 시스템의 모든 작업을 최상위 Queue로 이동한다.
'활동 > 크래프톤 정글' 카테고리의 다른 글
[크래프톤 정글/Week 08/PintOS] Priority Scheduling ( 높은 우선순위 먼저 실행하기 ) (0) | 2024.11.08 |
---|---|
[크래프톤 정글/Week 08/PintOS] Priority Scheduling ( 정리 ) (1) | 2024.11.07 |
[크래프톤 정글/Week 08/PintOS] Alarm Clock ( Busy-Waiting을 Sleep/Wakeup으로 바꿔보자 ) (8) | 2024.11.04 |
[크래프톤 정글/Week 07] 키워드 정리 (1) | 2024.10.29 |
[TIL/크래프톤 정글] Day 40 ~ 42 (4) | 2024.10.12 |