1. 프로세스(Process)
- 프로세스란 실행 중인 프로그램을 의미하며, 메모리에 로딩된 형태로 존재합니다. 이는 태스크(Task)와 동의어로 사용됩니다.
- PCB(Process Control Block): 프로세스에 대한 정보를 담고 있는 데이터 구조로, 프로세스 ID, 프로세스 상태, 프로그램 카운터, 메모리 제한 등 다양한 정보를 포함합니다.
2. 멀티프로세스(Multi-Process)
- 멀티프로세스는 여러 프로세스를 동시에 실행하여 성능을 향상시키는 기술입니다.
- 예시: 크롬 웹 브라우저에서 각 탭이 독립된 프로세스로 관리됩니다. 이를 통해 성능 향상과 장애 발생 시 전체 브라우저가 중단되는 문제를 방지할 수 있습니다.
- 크롬에서의 3가지 종류 프로세스 : Browser, Renderer, Plug-in
3. 프로세스 상태(Process State)
- Ready (준비 상태): 프로세스가 CPU에서 실행될 준비가 된 상태.
- Running (실행 상태): 프로세스가 CPU에서 실제로 실행 중인 상태.
- Blocked (보류 상태): 프로세스가 입출력 작업 등의 이유로 실행되지 않고 대기 중인 상태.
4. 문맥 교환(Context Switch)
- 문맥 교환은 CPU가 현재 실행 중인 프로세스의 상태를 저장하고, 다른 프로세스의 상태를 불러오는 과정을 의미합니다. 문맥 교환이 빈번하게 일어나면 시스템 성능이 저하될 수 있습니다.
5. 프로세스 관리(Process Management)
- 프로세스 생성 (Creation): 프로세스는 fork() 시스템 호출을 통해 생성됩니다. 자식 프로세스는 부모 프로세스의 PID를 받아 구분됩니다.
- 프로세스 종료 (Termination): 프로세스는 정상적으로 종료되거나 비정상적으로 종료될 수 있습니다. 비정상적 종료는 타임아웃, 파일 입출력 실패, 오류 발생 등이 원인이 될 수 있습니다.
6. 스레드(Thread)
- 스레드는 프로세스 내에서 실행되는 작은 실행 단위입니다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이들 스레드는 동일한 메모리 공간을 공유합니다.
- 멀티스레드(Multi-Thread): 스레드 여러 개를 병렬로 실행하여 응답성을 높이고, 자원을 효율적으로 사용하게 합니다.
7. 스레드 제어 블록(Thread Control Block, TCB)
- TCB는 스레드의 상태, 프로세서 레지스터, 프로그램 카운터, 스케줄링 정보, 우선순위 등의 정보를 담고 있는 데이터 구조입니다.
8. 사용자 수준 스레드(User Level Thread)와 커널 수준 스레드(Kernel Level Thread)
- 사용자 수준 스레드: 커널의 개입 없이 사용자 영역에서 실행되는 스레드로, 성능이 좋습니다.
- 커널 수준 스레드: 커널이 직접 관리하는 스레드로, 트랩이나 시스템 호출 등의 비동기적 실행 시 다른 스레드의 실행을 방해할 수 있습니다.
9. 혼합형 스레드(Hybrid Level Thread)
- 혼합형 스레드는 사용자 영역에서 시작하여 커널 영역으로 매핑되는 스레드 모델입니다.
10. 멀티프로세스 및 멀티스레드 프로그래밍
- 멀티프로세스: 부모 프로세스가 fork()를 호출하여 자식 프로세스를 생성하고, 두 프로세스가 독립적으로 실행됩니다.
- 멀티스레드: pthread_create() 함수를 사용하여 스레드를 생성하고, 두 스레드가 병렬로 실행됩니다.
11. 스레드 상태(Thread State)
- Ready (준비 상태): 스레드가 CPU에서 실행될 준비가 된 상태입니다. 이 상태에서는 스레드가 실행을 기다리고 있는 상태로, 준비 큐(Ready Queue)에 들어가게 됩니다.
- Running (실행 상태): 스레드가 CPU에서 실제로 실행 중인 상태입니다. 이 상태에서는 스레드가 프로세서를 점유하고 명령을 수행하고 있습니다.
- Blocked (대기 상태): 스레드가 입출력 작업이나 특정 이벤트가 발생하기를 기다리는 상태입니다. 예를 들어, 파일 읽기나 쓰기 작업이 완료될 때까지 스레드는 블록 상태로 대기하게 됩니다.
- Terminated (종료 상태): 스레드의 작업이 완료되었거나, 더 이상 실행되지 않을 때 이 상태가 됩니다. 스레드가 종료되면 자원 해제가 이루어지며, 레지스터 문맥과 스택 할당이 제거됩니다.
12. 프로세스 이미지(Process Image)
- 프로세스 이미지는 운영체제(OS)가 메모리에 프로세스를 로딩했을 때의 메모리 구조를 나타냅니다. 프로세스 이미지는 프로그램 실행에 필요한 모든 정보를 포함하고 있으며, 이는 다음과 같은 요소로 구성됩니다:
- 코드(Code) 섹션: 실행할 프로그램의 명령어들이 저장된 영역입니다. 이는 프로그램의 실행을 위한 기계어 코드로 구성되어 있습니다.
- 데이터(Data) 섹션: 전역 변수와 정적 변수가 저장되는 영역입니다. 프로그램이 실행되는 동안 변하지 않는 데이터들이 이곳에 위치합니다.
- 힙(Heap) 섹션: 동적으로 할당된 메모리가 저장되는 영역입니다. 이 영역은 프로그램 실행 중에 크기가 변경될 수 있으며, malloc과 같은 함수로 메모리를 할당받을 때 사용됩니다.
- 스택(Stack) 섹션: 함수 호출과 관련된 지역 변수, 반환 주소, 함수 인자 등이 저장되는 영역입니다. 함수 호출 시마다 새로운 프레임이 쌓이고, 함수가 종료되면 해당 프레임이 제거됩니다.
- PCB vs Process Image: 프로세스 제어 블록(PCB, Process Control Block)은 프로세스에 대한 메타데이터를 포함하고 있는 반면, 프로세스 이미지는 프로세스가 실행될 때 메모리에 로드되는 실제 데이터 구조입니다. PCB는 운영체제가 프로세스를 관리하기 위한 정보이며, 프로세스 이미지는 프로세스 자체의 실행을 위한 데이터입니다.
13. 프로세스 분류 (Process Classification)
프로세스는 주로 시스템(커널) 프로세스와 사용자 프로세스로 분류됩니다. 또한, 병행 프로세스라는 개념으로도 분류할 수 있습니다.
- 시스템(커널) 프로세스 (System/Kernel Process):
- 시스템 프로세스는 운영체제의 핵심 기능을 수행하는 프로세스로, 시스템의 안정성과 성능에 중요한 역할을 합니다. 예를 들어, 메모리 관리, 프로세스 스케줄링, 입출력 관리 등 운영체제의 다양한 기능을 담당하는 프로세스가 여기에 해당됩니다.
- 이들은 일반적으로 높은 우선순위를 가지며, 사용자 프로세스보다 우선적으로 실행됩니다.
- 사용자 프로세스 (User Process):
- 사용자 프로세스는 사용자가 직접 실행하는 프로그램을 의미합니다. 예를 들어, 텍스트 편집기, 웹 브라우저, 게임 등이 사용자 프로세스에 해당합니다.
- 사용자 프로세스는 시스템 자원을 요청할 때 시스템 호출(System Call)을 통해 커널에 접근하며, 커널의 보호를 받습니다.
- 병행 프로세스 (Concurrent Process):
- 병행 프로세스는 동시에 실행될 수 있는 프로세스들로, 시스템에서 독립적으로 또는 협력적으로 수행될 수 있습니다.
- 독립 프로세스 (Independent Process): 다른 프로세스와 상호작용하지 않으며, 독립적으로 실행되는 프로세스입니다. 예를 들어, 서로 다른 사용자 응용 프로그램들이 독립 프로세스일 수 있습니다.
- 협동 프로세스 (Cooperative Process): 다른 프로세스와 데이터를 공유하거나 상호작용하며 실행되는 프로세스입니다. 예를 들어, 하나의 응용 프로그램 내에서 여러 프로세스가 데이터를 공유하며 작업을 수행할 수 있습니다.
추가 개념
- 프로세스 상태: 프로세스의 상태는 실행, 준비, 보류 등의 상태로 전환될 수 있으며, 각 상태는 프로세스가 시스템 자원을 어떻게 사용하는지에 따라 달라집니다.
14. 프로세스 상태 전환 (Process State Transition)
프로세스는 실행 중에 여러 상태 간을 전환하게 되며, 주요 상태와 전환 과정은 다음과 같습니다:
- New (신규 상태):
- 프로세스가 생성된 상태로, 아직 실행 준비가 되지 않은 초기 상태입니다. 이 상태에서 프로세스는 운영체제에 의해 필요한 자원을 할당받고 준비됩니다.
- Ready (준비 상태):
- 프로세스가 CPU에서 실행되기를 기다리고 있는 상태입니다. 프로세스가 필요한 모든 자원을 할당받았으며, CPU 스케줄러에 의해 선택되기를 기다립니다.
- Ready Queue: 준비 상태에 있는 프로세스들은 준비 큐에 대기하게 됩니다.
- Running (실행 상태):
- 프로세스가 실제로 CPU를 점유하여 실행되고 있는 상태입니다. 이 상태에서는 프로세스의 명령어가 실제로 수행됩니다.
- 프로세스는 스케줄러에 의해 선택되어 이 상태로 전환됩니다.
- Blocked (보류 상태):
- 프로세스가 입출력 작업이나 다른 이벤트를 기다리는 상태입니다. 예를 들어, 파일을 읽는 동안 CPU를 사용할 수 없기 때문에, 프로세스는 보류 상태로 전환됩니다.
- 보류 상태에서는 필요한 이벤트가 완료되면 다시 준비 상태(Ready)로 돌아갑니다.
- Terminated (종료 상태):
- 프로세스의 실행이 완료되어, 더 이상 실행될 필요가 없는 상태입니다. 이 상태가 되면 운영체제는 프로세스가 사용하던 자원을 회수하고, 프로세스 제어 블록(PCB)을 삭제합니다.
- Swap Out (교체 상태):
- 프로세스가 메모리에서 디스크로 이동하여 일시적으로 대기하는 상태입니다. 이는 시스템 메모리가 부족할 때 발생하며, 다시 실행되기 위해서는 Swap In 상태로 전환되어 메모리로 복귀해야 합니다.
- Context Switch (문맥 교환):
- 프로세스가 실행 중에 다른 프로세스로 교체되는 과정입니다. 문맥 교환 시, 현재 실행 중인 프로세스의 상태(레지스터, 프로그램 카운터 등)를 저장하고, 새로운 프로세스의 상태를 로드합니다. 문맥 교환이 자주 발생하면 시스템 성능이 저하될 수 있습니다.
15. 프로세스 우선순위 (Process Priority)
- 우선순위 (Priority): 운영체제에서 각 프로세스에 할당되는 숫자 값으로, 이 값이 낮을수록 높은 우선순위를 의미합니다. 우선순위는 운영체제가 어떤 프로세스를 먼저 실행할지를 결정하는 데 사용됩니다.
- 디스패처 (Dispatcher): 디스패처는 준비 큐(Ready Queue)에서 대기 중인 프로세스 중에서 우선순위가 높은 프로세스를 선택하여 CPU에 할당하는 역할을 합니다. 디스패처는 프로세스의 우선순위를 고려하여 프로세스 실행 순서를 결정합니다.
- 우선순위에 따른 프로세스 종류:
- 프로세서 중심의 프로세스 (CPU-bound Process): 주로 계산 작업에 집중하는 프로세스로, CPU 시간을 많이 요구합니다. 이 프로세스는 일반적으로 높은 우선순위를 갖습니다.
- 입출력 중심의 프로세스 (I/O-bound Process): 입출력 작업에 집중하는 프로세스로, 입출력 장치와의 상호작용이 많습니다. 이 프로세스는 CPU를 많이 사용하지 않기 때문에 상대적으로 낮은 우선순위를 가질 수 있습니다.
- Unix & Linux 우선순위 관리:
- Nice Value: Unix와 Linux 시스템에서는 nice 값이라는 우선순위 조정 매개변수를 사용합니다. 기본값은 0이며, 이 값을 높이면 우선순위가 낮아지고, 낮추면 우선순위가 높아집니다. 이 값은 프로세스 실행 중에도 조정할 수 있습니다.
- Nice 값의 범위: 일반적으로 -20에서 19까지의 범위를 가지며, -20은 최고 우선순위, 19는 최저 우선순위를 나타냅니다.
- 우선순위 조정의 중요성:
- 우선순위는 시스템의 응답성을 높이고, 중요한 작업을 신속하게 처리하는 데 중요합니다. 운영체제는 중요한 시스템 프로세스에 높은 우선순위를 부여하고, 덜 중요한 사용자 프로세스에는 낮은 우선순위를 부여하여 시스템의 효율성을 극대화합니다.
16. 스레드 구조 vs 프로세스 구조 (Thread Structure vs Process Structure)
스레드와 프로세스는 모두 실행 단위를 의미하지만, 이들의 구조와 동작 방식은 다릅니다.
프로세스 구조 (Process Structure)
- 프로세스는 운영체제에서 실행 중인 프로그램의 독립적인 실행 단위입니다. 프로세스는 자체 메모리 공간과 자원을 가지고 있으며, 다른 프로세스와 메모리를 공유하지 않습니다.
- 프로세스의 구성 요소:
- 코드(Code) 섹션: 실행할 프로그램의 명령어들이 저장된 영역.
- 데이터(Data) 섹션: 전역 변수와 정적 변수가 저장된 영역.
- 힙(Heap) 섹션: 동적으로 할당된 메모리가 저장되는 영역.
- 스택(Stack) 섹션: 함수 호출과 관련된 지역 변수, 반환 주소 등이 저장되는 영역.
스레드 구조 (Thread Structure)
- 스레드는 프로세스 내에서 실행되는 작은 실행 단위로, 프로세스의 작업을 병렬로 수행할 수 있도록 해줍니다. 여러 스레드는 동일한 프로세스 내에서 자원을 공유합니다.
- 스레드의 구성 요소:
- 스레드 ID: 스레드를 식별하는 고유 ID.
- 프로그램 카운터(Program Counter): 스레드가 실행 중인 현재 명령어를 가리키는 포인터.
- 레지스터(Register) 집합: 스레드의 현재 작업 상태를 저장하는 레지스터들.
- 스택(Stack): 스레드의 함수 호출과 관련된 정보를 저장하는 스택.
스레드와 프로세스의 차이점
- 메모리 공유: 스레드는 동일한 프로세스 내에서 메모리(코드, 데이터, 힙)를 공유하지만, 프로세스는 독립적인 메모리 공간을 사용합니다.
- 생성 및 관리 비용: 스레드는 프로세스보다 생성 및 관리 비용이 적습니다. 스레드는 동일한 주소 공간을 공유하기 때문에 프로세스 간의 문맥 교환보다 훨씬 빠르게 문맥 교환이 이루어집니다.
- 병렬 처리: 여러 스레드를 통해 한 프로세스 내에서 병렬 처리가 가능하지만, 프로세스 간의 병렬 처리는 독립적으로 이루어져야 합니다.
17. 스레드의 구조 (Structure of a Thread)
스레드의 구조는 프로세스 구조와 비교할 때 좀 더 가벼운 구조로, 프로세스의 메모리 자원을 공유하면서 동시에 여러 작업을 수행할 수 있도록 설계되었습니다.
스레드 구조의 세부 사항
- 공유된 메모리 공간: 스레드는 프로세스 내에서 코드, 데이터, 힙 영역을 다른 스레드들과 공유합니다. 하지만 스택은 독립적으로 관리됩니다.
- 독립적인 실행 흐름: 각 스레드는 독립적인 실행 흐름을 가지며, 각각의 프로그램 카운터와 레지스터를 통해 실행 상태를 유지합니다.
- 컨텍스트 스위칭 비용: 스레드 간의 문맥 교환(Context Switching)은 프로세스 간의 문맥 교환보다 적은 비용이 듭니다. 이는 스레드가 동일한 메모리 공간을 공유하기 때문에 필요한 정보의 양이 적기 때문입니다.
스레드의 병렬 수행 (Thread Parallel Execution)
- 스레드는 동일한 프로세스 내에서 병렬로 실행되며, 이를 통해 응답성을 높이고 자원을 효율적으로 사용할 수 있습니다. 스레드의 병렬 수행은 다중 스레드를 지원하는 멀티코어 프로세서에서 특히 효과적입니다.
- 스레드의 잇점:
- 응답성 향상: 사용자 응용 프로그램에서 멀티스레드를 사용하면, 긴 작업 중에도 다른 작업을 동시에 수행할 수 있어 응답성이 향상됩니다.
- 자원 공유: 스레드들이 동일한 프로세스 내에서 자원(메모리, 파일 등)을 공유함으로써 자원의 효율적 활용이 가능해집니다.
- 경제성: 스레드 간의 문맥 교환 비용이 낮아, 동일한 작업을 수행하는데 드는 자원의 비용이 줄어듭니다.
18. 단일 스레드 vs 다중 스레드 (Single Thread vs Multi-Thread)
단일 스레드 프로세스 모델 (Single-Thread Process Model)
- 단일 스레드 (Single Thread): 하나의 스레드만을 가진 프로세스입니다. 이 스레드는 독립적으로 프로그램의 모든 명령을 순차적으로 실행합니다.
- 특징:
- 단순성: 구현이 간단하고, 동기화 문제가 거의 발생하지 않습니다.
- 제한된 성능: 단일 스레드에서는 동시에 여러 작업을 처리할 수 없기 때문에, 복잡한 작업이나 긴 연산을 수행할 때 프로그램의 응답성이 떨어질 수 있습니다.
- 구성 요소:
- 프로세스 = 1 코드(Code) + 1 레지스터(Register) + 1 스택(Stack)
- 예시: 대부분의 간단한 명령줄 기반 프로그램이나, 병렬 처리가 필요하지 않은 간단한 애플리케이션이 단일 스레드로 동작합니다.
다중 스레드 프로세스 모델 (Multi-Thread Process Model)
- 다중 스레드 (Multi-Thread): 하나의 프로세스 내에서 여러 개의 스레드가 동시에 실행되는 모델입니다. 각 스레드는 동일한 코드, 데이터, 힙 영역을 공유하면서 독립적으로 실행됩니다.
- 특징:
- 응답성 향상: 긴 작업을 수행하는 동안에도 다른 스레드가 사용자 입력을 처리하는 등 프로그램이 멈추지 않고 작동할 수 있습니다.
- 성능 향상: 멀티코어 프로세서 환경에서 병렬 처리를 통해 성능을 극대화할 수 있습니다.
- 자원 공유: 스레드 간 자원을 공유함으로써 메모리 사용을 효율적으로 관리할 수 있습니다.
- 복잡성 증가: 동기화 문제, 경쟁 조건(Race Condition), 교착 상태(Deadlock) 등의 복잡한 문제를 관리해야 합니다.
- 구성 요소:
- 프로세스 = 1 코드(Code) + (n개의 레지스터(Register) + 스택(Stack)) x n 스레드
- 예시: 웹 서버, 데이터베이스 서버, 게임 엔진 등은 다중 스레드를 사용하여 여러 요청이나 작업을 동시에 처리합니다.
단일 스레드 vs 다중 스레드의 사용 사례
- 단일 스레드 사용 사례:
- 단일 작업이 주로 이루어지는 애플리케이션.
- 동기화 문제를 피하고자 할 때.
- 성능 요구사항이 낮은 프로그램.
- 다중 스레드 사용 사례:
- 동시에 여러 작업을 처리해야 하는 애플리케이션.
- 사용자 인터페이스가 필요한 프로그램에서, 사용자 응답성을 높이기 위해 사용.
- 데이터베이스 서버, 웹 서버 등 대규모 병렬 처리가 필요한 애플리케이션.
19. 멀티 프로세스 프로그래밍 (Multi-Process Programming) 사례 연구
설명
멀티 프로세스 프로그래밍은 하나의 프로그램이 여러 개의 프로세스를 생성하여 병렬로 작업을 수행하는 방식입니다. 각 프로세스는 독립적인 메모리 공간을 가지며, 서로 간섭하지 않고 독립적으로 실행됩니다.
사례 연구
- 코드 예시: 다음은 멀티 프로세스 프로그래밍의 예시입니다.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int count = 5; // 전역 변수
int Parent_process() {
while (1) {
printf("Parent:(%d)\n", count++);
sleep(2); // 2초 대기
}
}
int Child_process() {
while (1) {
printf("\t\tChild:(%d)\n", count++);
sleep(1); // 1초 대기
}
}
void main() {
int pid;
if ((pid = fork()) == 0) { /* 자식 프로세스 */
printf("child process!\n");
Child_process();
}
else { /* 부모 프로세스 */
printf("parent process!(child:%d)\n", pid);
Parent_process();
}
}
#include <unistd.h>
#include <stdlib.h>
int count = 5; // 전역 변수
int Parent_process() {
while (1) {
printf("Parent:(%d)\n", count++);
sleep(2); // 2초 대기
}
}
int Child_process() {
while (1) {
printf("\t\tChild:(%d)\n", count++);
sleep(1); // 1초 대기
}
}
void main() {
int pid;
if ((pid = fork()) == 0) { /* 자식 프로세스 */
printf("child process!\n");
Child_process();
}
else { /* 부모 프로세스 */
printf("parent process!(child:%d)\n", pid);
Parent_process();
}
}
- 설명:
- fork() 시스템 호출을 사용하여 자식 프로세스를 생성합니다.
- 부모 프로세스는 2초마다 count 변수를 증가시키고 출력합니다.
- 자식 프로세스는 1초마다 count 변수를 증가시키고 출력합니다.
- 이 두 프로세스는 서로 독립적으로 실행되며, count 변수는 부모와 자식 프로세스 간에 복사된 별도의 변수를 사용합니다.
20. 멀티 스레드 프로그래밍 (Multi-Thread Programming) 사례 연구
설명
멀티 스레드 프로그래밍은 하나의 프로세스 내에서 여러 개의 스레드를 생성하여 병렬로 작업을 수행하는 방식입니다. 모든 스레드는 동일한 메모리 공간을 공유하며, 자원을 효율적으로 사용합니다.
사례 연구
- 코드 예시: 다음은 멀티 스레드 프로그래밍의 예시입니다.
- #include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int count = 5; // 전역 변수
void *thread1() {
while (1) {
printf("Thread1 (%d)\n", count++);
sleep(2);
}
}
void *thread2() {
while (1) {
printf("\t\tThread2 (%d)\n", count++);
sleep(1);
}
}
int main() {
pthread_t p_thread[2]; // 스레드 ID
int status;
pthread_create(&p_thread[0], NULL, thread1, NULL);
pthread_create(&p_thread[1], NULL, thread2, NULL);
pthread_join(p_thread[0], (void **)&status);
pthread_join(p_thread[1], (void **)&status);
return 0;
}
설명:- pthread_create() 함수를 사용하여 두 개의 스레드를 생성합니다.
- 첫 번째 스레드는 2초마다 count 변수를 증가시키고 출력합니다.
- 두 번째 스레드는 1초마다 count 변수를 증가시키고 출력합니다.
- 이 두 스레드는 동일한 메모리 공간을 공유하므로, count 변수는 공유된 상태에서 증가합니다.
21. 멀티 프로세스와 멀티 스레드의 차이점
1. 메모리 공간
- 멀티 프로세스:
- 각 프로세스는 독립된 메모리 공간을 사용합니다. 자원 공유를 위해서는 IPC(Inter-Process Communication) 같은 메커니즘이 필요합니다.
- 멀티 스레드:
- 스레드들은 동일한 프로세스 내에서 메모리 공간을 공유합니다. 따라서 전역 변수나 힙 공간을 쉽게 공유할 수 있습니다.
2. 문맥 교환(Context Switching)
- 멀티 프로세스:
- 프로세스 간의 문맥 교환은 비용이 큽니다. 프로세스마다 독립적인 메모리 공간이 있어, 문맥 교환 시 메모리 상태를 완전히 저장하고 불러와야 하기 때문입니다.
- 멀티 스레드:
- 스레드 간의 문맥 교환은 상대적으로 비용이 적습니다. 스레드들은 동일한 메모리 공간을 공유하기 때문에, 상태를 저장하고 불러오는 작업이 간단합니다.
3. 안정성 및 복잡성
- 멀티 프로세스:
- 프로세스가 독립적으로 실행되기 때문에, 한 프로세스가 문제가 생겨도 다른 프로세스에 영향을 미치지 않습니다. 하지만 프로세스 간 통신과 자원 공유는 복잡합니다.
- 멀티 스레드:
- 스레드 간 자원 공유가 쉬운 반면, 동기화 문제나 교착 상태(Deadlock) 같은 문제가 발생할 수 있습니다. 한 스레드가 오류를 일으키면 전체 프로세스가 영향을 받을 수 있습니다.
4. 성능 및 효율성
- 멀티 프로세스:
- CPU 코어 수가 많을수록 성능이 향상될 수 있지만, 문맥 교환과 메모리 사용이 비효율적일 수 있습니다.
- 멀티 스레드:
- 스레드 간 메모리 공유로 인해 성능이 더 효율적일 수 있으며, 특히 I/O 작업이 많은 애플리케이션에서 성능이 개선됩니다.
결론
- 멀티 프로세스는 안정성이 중요한 경우나 독립적으로 실행되어야 하는 작업에 적합합니다.
- 멀티 스레드는 메모리 공유가 필요하고, 응답성을 높여야 하는 작업에 적합합니다.
'운영체제' 카테고리의 다른 글
IPC, 사례연구 (0) | 2024.10.12 |
---|---|
동기화와 세마포어 (0) | 2024.10.10 |
병행 프로세스와 병렬 프로세스 (1) | 2024.09.29 |
비동기 병렬프로세스 (1) | 2024.09.29 |
운영체제- (1) | 2024.09.24 |