728x90
반응형
프로세스, 쓰레드
프로세스(Process) | 쓰레드(Thread) |
운영체제(OS)로부터 자원을 할당받은 작업의 단위 | 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위 |
프로세스(Process)
프로그램과 프로세스의 차이 | 프로그램(실행 X) | 프로세스(실행 O) |
- 어떤 작업을 하기 위해 실행할 수 있는 파일 - 파일이 저장 장치에는 있지만 메모리에 올라가지 않은 정적인(Static) 상태 |
- 실행되어 작업중인 컴퓨터 프로그램 - 메모리에 적재되어 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태 |
프로세스의 자원 구조 | - 코드 영역(Code / Text) : 프로그램 함수들의 코드가 CPU가 해석 가능한 기계에 형태로 저장 - 데이터 영역(Data) : 전역 변수나 각종 데이터들이 저장(.data, .rodata, .bss) - .data : 전역 변수 또는 static 변수 - .rodata : const 같은 상수 키워드 또는 문자열 상수 - .bss : 초기화되지 않은 변수(0으로 초기화된 변수 포함) 또는 static 변수 - 스택 영역(Stack) : 지역 변수와 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간 / 함수의 호출과 함께 할당되며, 함수 종료시 소멸 / stack 영역 초과시 stack overflow 발생 - 힙 영역(Heap) : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터가 저장되는 공간 / 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨 |
|
프로세스의 자원 공유 | - IPC(Inter-Process Communication) - LPC(Local inter-Process Communication) - 별도로 공유 메모리를 만들어서 정보를 주고받음 - 프로세스는 기본적으로 다른 프로세스의 메모리에 직접 접근할 수 없음 - 자원 부담이 크기 때문에, 다중 작업이 필요한 경우 쓰레드를 이용하는 것이 훨씬 효율적 |
|
쓰레드(Thread)
프로세스의 한계 | - 동시의 작업을 위해서 프로세스를 여러개 만들게 되면 그만큼 메모리를 차지하고, CPU에서 중복된 자원을 할당받게됨 - 쓰레드는 프로세스 특성의 한계를 해결하기 위해 탄생 |
쓰레드의 개념 | - 동시에 진행되는 작업 갈래, 실행 흐름의 단위 - 하나의 프로세스는 반드시 하나 이상의 쓰레드를 가짐(기본적으로 main 쓰레드가 생성) |
|
|
쓰레드의 자원 공유 | - 같은 프로세스 내의 쓰레드는 프로세스의 자원을 공유함 - 쓰레드는 Stack만 할당받아 복사하고 Code, Data, Heap은 다른 프로세스들과 공유 |
[출처] Inpa Dev 블로그 |
프로세스와 쓰레드의 동시 실행 원리
동시 실행 원리 | - 프로세스와 쓰레드를 동시에 처리하는 멀티 태스킹(multi tasking)기술 |
멀티 코어와 쓰레드 (4코어 8 쓰레드 CPU 기준) |
- CPU 한 개는 여러 개의 코어를 가질 수 있음 - 물리적 코어 -> 4 코어, 논리적 코어 -> 8 쓰레드(코어 하나가 쓰레드 두 개 이상을 동시에 실행 가능) - 운영체제가 8개의 작업을 동시에 처리할 수 있음(하이퍼쓰레딩(Hyper-Threading)) |
CPU의 작업 처리 방식
병렬성(Parallelism) |
- 여러 개의 코어에 맞춰 여러 개의 프로세스, 쓰레드를 돌려 병렬로 작업들을 동시에 수행하는 것 - 듀얼코어, 쿼드코어, 옥타코어 등 멀티코어 프로세서가 달린 컴퓨터에서 할 수 있는 방식 |
동시성(Concurrency) | - 둘 이상의 작업이 동시에 실행되는 것처럼 보이게 하는것(병렬성은 실제로 물리적으로 동시에 실행) - 프로세스들을 매우 빠르게 번갈아가면서 처리함(Context Switching(문맥 전환)) |
동시성의 필요성 | - 하드웨어적 한계 : 수십 수백개의 프로세스를 돌리기 위해서 동시성이 필요 - 논리적인 효율 : 오래 걸리는 작업이 처리를 선점하고 있으면 다른 짧은 작업이 대기해야하는 경우가 생길 수 있음 / 작업을 아주 잘게 나눠 번갈아 가면서 처리함 |
CPU Scheduling 알고리즘
프로세스 스케줄링 목적 | - CPU가 끊임없이 일할 수 있도록 스케줄을 짜주는 것 - 한정된 자원으로 높은 성능을 이끌어내기 위해서 CPU가 놀지 않도록 적절한 타이밍에 계속 일을 줌 |
FCFS (First Come First Served) |
- 선입선출 알고리즘은 비선점 스케줄링 기법 - 먼저 도착한 순서에 따라 처리함(반응형보다는 배치형(일괄처리) 시스템에 적합) - 비선점 스케줄링을 사용해 오버헤드가 낮음 - 긴 수행시간을 가진 프로세스가 자원을 점유하는 경우, 다른 프로세스들이 대기시간을 가짐(Convey Effect) |
공식 -대기시간: 프로세스가 생성되어 작업을 마치고 종료될 때까지 큐에서 기다리는 시간 (공식: 왕복 시간 - 수행 시간) -소요시간: 프로세스가 생성되어 작업을 마치고 종료될 때까지의 걸리는 시간 (공식: 종료 시간 - 도착한 시간) -정규화(Nomalized): 일의 효율성 측정, 총 소요된 시간 (공식: 수행시간 / 대기시간) |
|
SJF (Shortest Job First) |
- 최소작업 우선 알고리즘은 각 작업의 프로세서 실행 시간을 이용해 실행 시간이 가장 짧은 작업에 할당하는 방법 - 항상 실행 시간이 짧은 작업을 신속하게 실행하므로 평균 대기 시간이 가장 짧음 - 기본적으로 실행 시간이 가장 짧은 작업이 실행되므로 불공정한 작업 - 실행 시간을 예측하기 어려워 실용적이 못함 - 비선점 SJF 스케줄링 반환 시간 = 실행 순서에 따른 실행 시간 + 대기 시간 대기 시간 = 반환 시간 - 실행 시간 - 선점 SJF 스케줄링 반환 시간 = 종료까지 걸린시간 + 시작 시간(중복 시간) 대기 시간 = 반환 시간 - 시작 시간(중복 시간) || - 실행시간 |
SRTF (Shortest Remaining Time First) |
- 프로세스를 비교해 최소 잔여시간이 적은 프로세스를 먼저 실행하는 알고리즘 - 공정성, 응답시간 측면에서 문제가 있음 |
Round Robin |
- Ready Queue에 있는 모든 프로세스들에게 공정하게 실행시간을 배분해주는 알고리즘 - SRTF에서 실행시간이 많이 남은 프로세스가 CPU를 계속 할당받지 못하는 공평성 문제를 해결(응답시간 대폭 개선) - 새로 Ready 상태가 되거나 실행시간을 마친 프로세스는 Ready Queue의 맨 뒤로 감 - 반환시간 관점으로 최악의 알고리즘 - 잦은 Context Switch는 성능 저하를 발생시킴 |
Multilevel Queue Scheduling |
- Ready Queue를 여러 개로 분할하고 각각의 Queue에 우선순위를 정하고, 각각의 프로세스는 해당 프로세스의 우선 순위에 따라 각각의 Queue에 배치되고, Queue간 경쟁을 통해 하나의 Queue가 CPU를 점유 - Foreground Queue(Round Robin 방식) : CPU burst가 짧은 Queue로서 우선순위가 높음 - Background Queue(FCFS 방식) : batch 등 긴 시간을 필요로 하는 작업 |
Multi-level Feedback Queue Scheduler (MLFQS) |
- 여러 레벨의 큐 : MLFQS는 다양한 우선순위 레벨을 가진 여러 개의 큐를 사용. 각 큐는 특정 우선순위를 가진 프로세스들을 담고 있으며, 우선순위가 높은 큐의 프로세스가 먼저 CPU를 할당 받음 - 동적 우선순위 조정 : 프로세스가 시스템에서 실행되면서, 그 특성(예: CPU 사용량, 대기 시간)에 따라 우선순위가 동적으로 조정. 이를 통해, CPU를 많이 사용하는 프로세스의 우선순위를 낮추고 I/O 작업 등으로 대기하는 프로세스 우선순위를 높여 공정성 유지 - 우선순위 상속 : 프로세스가 다른 프로세스를 기다릴 때(예: 락을 기다림), 대기 중인 프로세스의 우선순위를 기다리고 있는 프로세스에게 "상속"하여, 우선순위가 높은 프로세스가 낮은 프로세스 때문에 오랫동안 대기하는 것을 방지 |
장점 - 공정성: 모든 프로세스가 공평하게 CPU 시간을 할당 받을 수 있도록 함 - 응답성: I/O 작업이 많은 프로세스나 사용자 상호작용이 필요한 프로세스에 빠른 응답 제공 - 자원 활용 최적화: 프로세스의 실행 특성에 따라 우선순위를 조정함으로써, CPU와 같은 시스템 자원 활용도 높임 |
|
4BSD 스케줄러 - 4BSD(Berkeley Software Distribution) 스케줄러는 UNIX 시스템에서 사용되는 스케줄링 알고리즘 - 스케줄러의 주요 목표는 시스템의 반응성과 효율성을 최적화하는 것 - 4BSD 스케줄러는 CPU 사용 패턴(예: CPU 집중적인 작업 vs I/O 집중적인 작업)에 따라 프로세스의 우선순위를 동적으로 조정 - 인터랙티브 프로세스 우선순위 향상 : 사용자와의 상호작용이 필요한 프로세스(예: 텍스트 편집기, 그래픽 인터페이스)는 빠른 반응 시간이 중요. 4BSD 스케줄러는 이러한 프로세스가 자주 CPU를 양보하는 경향을 감지하고, 그들의 우선순위를 높여 반응성 개선 - 백그라운드 작업 우선순위 감소 : CPU 사용량이 매우 높은 프로세스(예: 컴파일러, 대규모 계산 프로그램)는 시스템의 전반적인 반응성에 영향을 줄 수 있음. 이러한 프로세스의 우선순위는 시간이 지남에 따라 점차 감소하여, 인터랙티브 프로세스에게 CPU 사용 기회를 더 많이 제공 |
|
nice - UNIX 및 UNIX 계열 운영 체제에서 프로세스의 우선순위를 조정하는 데 사용되는 값 - nice 값은 사용자가 프로세스의 기본 우선순위를 조정할 수 있게 해주며, 이 값은 프로세스의 우선순위에 직접적인 영향을 미침 - nice 값의 범위 : 일반적으로 nice 값은 -20에서 19 사이. 낮은 값(예: -20)은 높은 우선순위를 의미하고, 높은 값(예: 19)은 낮은 우선순위를 의미. 기본 값은 0 - nice 값의 사용 : 사용자는 nice 명령어를 사용하여 실행 중이거나 새로 시작하는 프로세스의 nice 값을 설정할 수 있음. nice 값을 높이면(양수 방향으로), 프로세스는 더 낮은 우선순위를 갖게 되어 CPU 접근이 더 적게 됨. 반대로, nice 값을 낮추면(음수 방향으로), 프로세스의 우선순위가 높아져 CPU를 더 많이 사용할 수 있게 됨 - nice 값은 시스템의 부하가 높을 때 특정 프로세스의 우선순위를 조정하거나, 백그라운드 작업을 실행할 때 유용하게 사용 - 예를 들어, 시스템의 자원을 많이 사용하는 대규모 계산 작업을 백그라운드에서 실행할 때, nice 값을 높여 다른 사용자 또는 인터랙티브 작업에 더 많은 CPU 시간을 할당할 수 있음 |
|
비선점 스케줄링 | - 프로세스가 자원을 할당받으면 스스로 자원을 반납하거나, 작업이 끝날때까지 프로세스 전환이 일어나지 않음 - 우선순위 높은 스케줄링이 와도 작업 순서가 바뀌지 않고, 수행시간이 긴 프로세스가 있으면 모든 작업 처리 시간에 영향을 줌 |
세마포어, 뮤텍스
동시성 프로그래밍에서 가장 큰 숙제는 '공유자원 관리'
공유자원을 안전하게 관리하기 위해서 상호배제(Mutual exclusion)를 달성하는 기법이 필요
상호 배제 (Mutual exclusion) |
- 프로세스 / 쓰레드가 필요로 하는 공유자원에 대해 통제권을 요구하는 것 - 하나의 프로세스 / 쓰레드가 공유자원을 사용할 때 다른 프로세스 / 쓰레드가 공유자원에 접근할 수 없도록 통제하는 것 |
뮤텍스 (Mutex) |
- 여러 프로세스 / 쓰레드를 실행하는 환경에서 공유자원에 대한 접근에 제한을 강제하기 위한 동기화 메커니즘 - 프로세스 / 쓰레드가 소유하는 어떠한 오브젝트(Key)를 소유한 프로세스 / 쓰레드만이 공유자원에 접근할 수 있음 |
세마포어 (Semaphore) |
- 현재 공유자원에 접근할 수 있는 프로세스 / 쓰레드의 수를 나태내는 값을 두어 상호배제를 달성 |
레이스 컨디션
레이스 컨디션 (Race Condition) |
- 두 개 이상의 프로세스 / 쓰레드가 공유 자원을 서로 사용하려고 경합(Race)하는 현상 - 멀티 스레드 환경에서 프로세스 내의 모든 자원을 공유하기 때문에 동기화 문제가 발생 |
교착 상태 (Deadlock) |
- 공유 자원에 대한 요구가 엉키거나 자원 관리를 잘못해 프로세스나 스레드가 자원의 락을 획득하기 위해 무한히 대기하는 것 - 상호 배제(Mutual exclusion) 조건을 두어 한 자원에 한 쓰레드만 접근하게 하면 쓰레드가 자원을 독점으로 사용해 다른 쓰레드가 접근하려고 락(키, Key)을 획득하기 위해 무한 대기하는 상황일 때 발생(점유 상태로 대기) - 선점 불가 : 다른 쓰레드가 자원을 선점하고 있어서 자원을 뺏어올 방법이 없는 것(락을 뺏어올 방법이 없음) - 순환성 대기 : 프로세스가 어느 자원을 점유하고 있고 다른 자원을 요청해 대기하고 있을 때 순환전인 구조를 가지는 경우 |
기아 상태 | - 쓰레드들에게 우선 순위를 부여해 공유 자원에 접근할 때 우선순위가 낮은 쓰레드가 소외되어 아무 일도 하지 못하는 상태 |
라이브 락 (Live Lock) |
- 쓰레드가 동시에 실행되면서 락의 획득과 해제를 반복적으로 하면서 정상적으로 동작하는 것으로 보이나 아무것도 하지 않는 상태(교착 상태와 동일한 결과) |
임계 영역 | - 여러 개의 쓰레드가 수행되는 시스템에서 각 쓰레드들이 공유하는 데이터를 변경하는 코드 영역 - 상호 배제, 진행, 제한된 대기 조건을 만족해야 임계 영역을 통해 레이스 컨디션을 예방할 수 있음 상호 배제 : 한 쓰레드가 임계 영역에서 작업 중인 상태에서는 다른 쓰레드가 접근하지 못하는 것 진행 : 대기하는 쓰레드 중 누가 먼저 들어갈 것인가에 대한 결정이 유효 시간 내에 일어나야 함 제한된 대기 : 모든 쓰레드는 유한 시간 이내에 해당 임계 구역으로 진입할 수 있어야 함(기아 상태를 피하기 위해 한 번 임계 영역에 들어간 쓰레드가 다시 임계 영역에 들어갈 때는 제한을 두어야 함) |
컨텍스트 스위칭
컨텍스트 스위칭 (Context Switching) |
- CPU가 다음 프로세스를 수행하도록 프로세스의 상태 혹은 컨텍스트를 교체하는 작업 - 다음 프로세스를 실행해야 할 때 레지스터(register) 값, 즉 컨텍스트(Context)를 저장 - 기존 프로세스의 Context를 저장하고, 다음 프로세스를 실행할 수 있도록 Context를 교체하는 작업(PCB의 정보를 토대로 이루어짐) |
발생 상황(interrupt가 발생할 때) - 입출력 요청 - CPU 사용시간 만료 - 자식 프로세스 생성 - interrupt 처리를 기다릴 때 |
|
문제점 - 프로세스를 메모리와 디스크에서 올리고 내리는 작업은 많은 비용이 들고, 컨텍스트 스위칭 중에는 CPU는 아무 작업을 하지 못하기 때문에 비효율적임 |
|
PCB (Process Control Block) |
- 프로세스를 컨트롤하기 위한 정보 - PID(process ID), 프로세스 상태, 다음에 실행할 명령어의 주소, 이전에 작업했던 내용, CPU 스케줄링 정보, 프로세스의 주소 공간 등이 담겨 있음 |
프로세스 컨텍스트 스위칭 | - 프로세스 간의 컨텍스트 스위칭은 각각의 프로세스가 독립적인 메모리 공간을 가지고 있기 때문에 추가 작업이 필요하고, 오버헤드가 더 큼 |
쓰레드 컨텍스트 스위칭 | - 동일한 프로세스 내에서 발생하며, 각 쓰레드는 같은 메모리 공간을 공유하기 때문에 오버헤드가 적음 |
[참고]
728x90
반응형
'크래프톤 정글 - TIL' 카테고리의 다른 글
크래프톤 정글 5기 TIL - Day 53 ~ 59 (0) | 2024.05.13 |
---|---|
크래프톤 정글 5기 TIL - Day 52(알고리즘) (0) | 2024.05.13 |
크래프톤 정글 5기 TIL - Day 48 (0) | 2024.05.07 |
크래프톤 정글 5기 TIL - Day 47(CS:APP) (0) | 2024.05.07 |
크래프톤 정글 5기 TIL - Day 46 (2) | 2024.05.04 |