-
[운영체제] 프로그램, 프로세스, 스레드 비교운영체제 2023. 11. 10. 16:57
프로그램과 프로세스, 스레드 구분하기
https://www.rtos.be/2013/08/programs-processes-and-threads-part-1/ 프로그램(Program)
컴퓨터에게 주어진 작업을 수행하도록 만들어진 일련의 명령어 집합을 가리킵니다. 이 명령어는 특정 프로그래밍 언어로 작성되며 , 그 언어에 따라 컴퓨터가 이해하고 실행할 수 있는 형태로 변환됩니다.
프로세스(Process)
프로세스란 활성 프로그램, 즉 실행 중인 프로그램입니다.
각 프로세스는 주 메모리에 상주하며, 운영체제에 의해 실행에 필요한 자원들을 할당받아 자신만의 메모리 공간, 실행 상태, 시스템 리소스 등을 가집니다. 또한 프로세스는 여러 프로세스가 서로 영향을 미치지 않고 독립적으로 동시에 실행될 수 있고, 프로세스 간에 데이터를 주고받는 통신이 필요한 경우, 운영체제가 제공하는 통신 메커니즘을 이용하여 데이터를 주고받을 수 있습니다.
스레드(Thread)
스레드는 프로세스 내에서 실행되는 일련의 명령어 집합으로, 프로세스의 실행 단위입니다. 스레드는 경량 프로세스(lightweight process)로도 불리며, 한 프로세스 내에서 여러 개의 스레드가 동시에 실행될 수 있습니다. 하나의 프로세스 내에 존재하는 여러 스레드는 프로세스의 자원(메모리, 파일 디스트럽터 등)을 공유합니다. 스레드는 작업을 효율적으로 분배함으로써 성능 향상의 이점이 있으나 스레드 간 동기화와 공유 자원 관리에 대한 주의가 필요합니다.
사용자 수준 스레드(User-Level Thread)
사용자 수준에서 관리되는 스레드로, 운영체제는 해당 스레드의 존재를 알지 못합니다. 스레드 스케줄링이 사용자 수준에서 이루어지며, 커널은 단일 스레드만 실행 중인 것으로 간주합니다. 이로 인해 스레드 간 전환은 빠르지만, I/O 블로킹 등의 이벤트가 발생하면 전체 프로세스가 영향을 받을 수 있습니다.
ULT의 장점 :
- 멀티스레딩을 지원하지 않는 OS에서 구현할 수 있습니다.
- 스레드에는 프로그램 카운터, 레지스터 세트, 스택 공간만 있으므로 간단한 표현입니다.
- 커널의 개입이 없기 때문에 생성이 간단합니다.
- OS 호출이 필요하지 않으므로 스레드 전환이 빠릅니다.
ULT의 단점 :
- 스레드와 커널 간의 조정이 없거나 적습니다.
- 하나의 스레드가 페이지 오류를 일으키면 전체 프로세스가 차단됩니다.
커널 수준 스레드(Kernel-Level Thread)
운영체제 커널이 직접 관리하는 스레드로, 각각의 스레드가 별도의 커널 스레드로 인식됩니다. 커널은 스레드 스케줄링을 담당하며, 여러 스레드가 병렬로 실행될 수 있습니다. I/O 블로킹 등의 이벤트가 발생해도 해당 스레드만 영향을 받습니다
KLT의 장점 :
- 커널은 시스템의 스레드에 대해 완전한 지식을 갖고 있으므로 스케줄러는 스레드 수가 많은 프로세스에 더 많은 시간을 할당하기로 결정할 수 있습니다.
- 자주 차단되는 애플리케이션에 적합합니다.
KLT의 한계 :
- 비효율적이며 속도가 느립니다.
- 스레드 제어 블록이 필요하므로 오버헤드가 발생합니다.✔️프로세스와 스레드의 차이점
프로세스와 스레드는 둘 다 독립적인 실행 단위로 병렬로 처리된다는 점에서 유사합니다. 그러나 스레드는 다른 스레드와 자원을 공유한다는 점에서 프로세스와 큰 차이가 있으며, 이 차이로 발생하는 여러 가지 특징이 있습니다.
프로세스 스레드 정의 실행 중인 프로그램, 활성 프로그램 스케줄러에 의해 독립적으로 관리될 수 있는 경량 프로세스 컨텍스트 전환 시간 프로세스가 무거워지면 컨텍스트 전환에 더 많은 시간이 소요됨 프로세스보다 가볍기 때문에 컨텍스트 전환에 보다 적은 시간이 소요됨 자원 공유 독립적인 데이터와 코드 세그먼트 주변 스레드와 데이터 세그먼트, 코드 세그먼트, 파일 등을 공유 자원 소비 많은 리소스 필요 일반적으로 프로세스보다 적은 리소스 필요 통신 시간이 많이 소요됨 프로세스 간 통신보다 시간이 적게 소요됨 장애 프로세스가 장애가 발생해도 나머지 프로세스는 계속 실행될 수 있음 사용자 수준 스레드가 멈추면 해당 주변 스레드도 모두 멈춤 처리 단위 각각의 프로세스는 운영 체제에 의해 별도로 처리 각각의 스레드는 운영 체제에서 단일 작업으로 처리 사용 예시 워드 프로세서, 웹 브라우저, 게임 애플리케이션 등 동시에 여러 프로그램 이용 게임 애플리케이션의 그래픽처리, 사용자 입출력 처리를 각각의 다른 스레드에서 처리 ✔️프로세스와 스레드의 메모리 구조
프로세스의 메모리 공간
프로세스의 메모리 구조는 일반적으로 텍스트, 데이터 , BSS, 힙, 스택으로 나뉩니다. 이 메모리 구조는 운영체제에 의해 관리되며, 각 섹션은 특정 규칙과 권한에 따라 접근할 수 있습니다.
텍스트(Text / Code)
코드 섹션이라고도 부르며 프로그램의 기계어 코드가 저장되는 공간입니다. CPU는 이 부분의 명령어를 읽어와 실행합니다.
컴파일(compile) 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only로 되어 있습니다. 또한 읽기 전용이기 때문에 여러 프로세스가 동일한 프로그램 코드를 공유할 수 있습니다.
데이터(Data)
초기화된 전역 변수, static 변수, 상수 등이 저장되는 공간입니다. 프로세스가 시작될 때 초기값을 가지는 데이터들이 이곳에 할당됩니다.
BSS (Block Started by Symbol)
초기화되지 않은 전역 변수와 정적 변수가 저장되는 공간입니다. 프로세스가 시작될 때 이 부분의 변수들은 0으로 초기화됩니다.
힙 (Heap)
동적으로 할당된 메모리가 저장되는 영역입니다. 프로그램 실행 중에 동적으로 메모리를 할당하거나 해제할 수 있습니다. 주로 동적 자료구조(배열, 구조체)가 이곳에 할당됩니다. 자바에서는 객체가 heap영역에 생성되고 GC에 의해 정리됩니다.
스택(Stack)
함수 호출과 관련된 지역 변수, 매개 변수, 함수의 복귀주소 등이 저장되는 영역입니다. 스택은 함수가 호출될 때마다 프레임이 추가되고, 함수가 반환될 때 프레임이 제거됩니다. 이로써 함수 호출의 재귀적인 구조를 지원하며, 또한 지역변수의 유효 범위를 제한합니다. LIFO(Last In First Out) 방법을 따른다. 컴파일 시 stack 영역의 크기가 결정되기 때문에 무한정 할당 할 수 없다. 따라서 재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 너무 많이 가지고 있다면 stack overflow가 발생합니다.
스레드의 메모리 공간
스레드는 프로세스 내에서 실행되는 작은 실행 단위로, 프로세스의 메모리 공간(텍스트 섹션, 데이터 섹션, 힙)을 공유하여 스레드 간에 효율적인 데이터 공유가 가능합니다. 그러나 함수 호출과 관련된 정보를 저장하는 스택과 스레드의 상태와 실행 경로를 기록하는 레지스터는 공유하지 않고 각각의 스레드마다 가지고 있습니다. 때문에 각 스레드는 병렬로 실행될 수 있습니다.
✔️프로세스 제어블록(PCB) vs 스레드 제어블록(TCB)
프로세스 제어블록(Process Control Block)
그러나 우리가 사용하는 컴퓨터 자원은 한정적입니다. 때문에 프로세스들은 이 자원을 제한된 시간만큼 돌아가면서 사용합니다.
이렇게 빠르게 번갈아 수행되는 프로세스를 운영체제가 관리하기 위해 사용하는 자료구조가 프로세스 제어블록(PCB)입니다. PCB는 프로세스 생성 시 커널 영역에 생성되며 프로세스가 종료되면 제거됩니다.
PCB에 담기는 정보 운영체제마다 차이가 있으나 일반적으로 포함하는 정보는 아래와 같습니다.
포인터(Pointer) : 상위 프로세스에 대한 포인터 위치입니다.
프로세스 상태(Process State) : 현재 프로세스의 상태(대기, 실행, 준비 등)에 관한 정보를 포함합니다.
프로세스 식별자 (Process ID) : 각 프로세스는 고유한 식별자가 있으며 , 운영체제는 이를 이용해 특정 프로세스를 식별합니다.
프로그램 카운터 (Program Counter) : 현재 실행 중인 명령어의 주소 정보입니다. 프로세스 라인의 다음 명령어 주소를 저장합니다.
CPU 레지스터 (Registers) : 프로그램을 실행하기 전에 프로세스를 저장해야 하는 CPU를 등록합니다.
스케줄링 정보 : 우선순위 및 스케줄링에 관련된 정보를 저장합니다. 스케줄러가 프로세스를 관리하고 스케줄링 결정을 내릴 때 사용합니다.
메모리 관리 정보(Memory Limits) : 프로세스의 메모리 요구사항과 할당된 메모리 영역에 대한 정보를 저장합니다.
스레드 제어블록(Thread Control Block)
https://eunajung01.tistory.com/55 하나의 프로세스는 여러 개의 스레드를 가질 수 있습니다. 때문에 PCB(프로세스 제어블록)은 여러 TCB(스레드 제어블록)의 집합이라고 볼 수 있습니다. 스레드가 생성될 때마다 PCB내부에 TCB가 생성됩니다.
✔️멀티프로세스 vs 멀티스레드
멀티 프로세스와 멀티 스레드는 다중 작업 환경에서 병렬로 작업을 처리하는 두 가지 주요 접근 방식입니다.
문맥교환 (Context Switching)
CPU는 한번에 하나의 프로세스만 실행 가능합니다. 우리가 느끼기에 동시에 실행되는 프로그램들은 사실 빠른 속도로 CPU를 번갈아 사용하여 병렬로 실행되는 것처럼 보이는 것입니다. 이때 CPU가 여러 프로세스를 돌아가면서 작업을 처리할 수 있도록 상태 (Context)를 저장하고 다음 실행할 작업의 상태(Context)를 복원하는 과정을 문맥교환(Context Switching)이라고 합니다.멀티 프로세스
여러 개의 프로세서가 하나 이상의 작업을 동시에 처리하는 것입니다. 각 작업에 메모리 공간의 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용합니다.
장점
- 독립된 구조로 안전성이 높습니다.
- 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않아, 에러 발생 시 다른 프로세스가 정지되거나 하는 문제가 발생하지 않습니다.
- 여러 개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세서(CPU)가 이를 공유하면 비용적을 줄일 수 있습니다.
단점
- 독립된 메모리 영역이기 때문에 작업량이 많아 Context Switching이 잦은 경우 오버헤드가 발생하여 성능저하가 발생 할 수 있다.
멀티스레드
하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것이다.
장점
- 프로세스 내 스택영역을 제외한 메모리 영역을 공유하여 자원을 효율적으로 이용할 수 있으며, 때문에 스레드 간의 통신이 간단하고 빠릅니다.
- 스레드 사이 작업량이 작아 Context Switching이 빠르다. (캐시 메모리를 비우지 않아도 된다.)
단점
- 자원을 공유하기에 동기화 문제가 발생할 수 있다. (병목현상, 데드락 등)
- 주의 깊은 설계가 필요하고 디버깅이 어렵다. (불필요 부분까지 동기화하면, 대기시간으로 인해 성능저하 발생)
- 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
✔️프로세스 상태
New
생성되었지만 아직 OS에서 실행을 승인하지 않은 새로운 프로세스 입니다. 프로세스가 메인 메모리에 로드되지는 않았지만 해당 프로세스의 제어블록(PCB)이 생성됩니다.
Ready
CPU를 할당 받는 것을 기다리는 상태입니다. 스케줄림 큐에서 대기하며, 언제든지 CPU를 할당받을 수 있습니다.
Running
현재 실행 중인 프로세스를 의미합니다. 한 번에 하나의 프로세스만 실행이 가능합니다.
Waiting / Blocked
프로세스가 입출력 작업 완료와 같은 특정 이벤트가 발생하기를 기다리는 상태입니다. 이벤트가 발생할 때까지 프로세스는 실행될 수 없습니다.
Exit/Terminate
일부 문제로 인해 중단되었거나 프로세스가 실행을 완료하여 운영체제가 자원을 해제한 상태입니다.
프로세스의 상태 변화
- Null -> New : 프로세스 실행을 위해 새 프로세스가 생성됩니다.
- New -> Ready : 시스템은 프로세스를 신규에서 준비 상태로 이동하고 이제 실행할 준비가 되었습니다. 여기서 시스템은 여러 프로세스가 발생할 수 없도록 제한을 설정할 수 있습니다. 그렇지 않으면 성능 문제가 발생할 수 있습니다.
- Ready -> Running : 이제 OS는 실행을 위한 프로세스를 선택하고 시스템은 실행 준비 상태에 있는 프로세스 하나만 선택합니다.
- Running -> Exit/Terminate : 프로세스가 이제 완료되었음을 나타내거나 중단된 경우 시스템은 프로세스를 종료합니다.
- Running -> Ready : 이 전환이 발생하는 이유는 실행 중인 프로세스가 중단 없이 실행될 수 있는 최대 실행 시간에 도달했기 때문입니다. 이에 대한 예로 일부 유지 관리 또는 기타 기능을 주기적으로 수행하는 백그라운드에서 실행되는 프로세스를 들 수 있습니다.
- Running -> Waiting / Blocked : 프로세스가 대기 중인 항목을 요청하면 차단 상태가 됩니다. 마찬가지로 프로세스는 해당 시점에 사용할 수 없는 일부 리소스를 요청할 수도 있고 I/O 작업을 기다리거나 프로세스가 계속되기 전에 다른 프로세스가 완료되기를 기다릴 수도 있습니다.
- Waiting / Blocked -> Ready : 프로세스는 기다리고 있던 이벤트가 발생하면 Blocked 상태에서 Ready 상태로 이동합니다.
- Ready -> Exit/Terminate : 일부 시스템에서는 부모가 언제든지 자식 프로세스를 종료할 수 있기 때문에 이 전환은 일부 경우에만 존재할 수 있습니다.
'운영체제' 카테고리의 다른 글
[운영체제] 스케줄링 종류와 기아상태 (0) 2023.11.22 [운영체제] Scheduler와 Dispatcher (0) 2023.11.16 [운영체제] 동기(sync) vs 비동기(async), 블로킹(Blocking) vs 논블로킹(Non-Blocking) (0) 2023.11.08 [운영체제] 입출력(I/O) 제어 - 폴링, 인터럽트, DMA (0) 2023.11.08 [운영체제] 시스템 콜 (System Call) (0) 2023.11.06