프로세스와 쓰레드에 대한 개념 정리
프로세스와 쓰레드에 대해 비교하기 전, 쓰레드와 프로세스에 대한 개념을 확실하게 정리해야한다.
프로세스(Process) 란?
하나 혹은 그 이상의 Thread로 실행되고 있는 컴퓨터 프로그램의 instance (독립적 개체)이다. 즉, 프로세스는 실행되고 있는 프로그램
프로그램(Program) vs 프로세스(Process)
- 프로그램(Program): 어떤 작업을 위해 실행할 수 있는 파일
- 프로세스(Process): 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램 또는 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적 개체)
간단히 말해, 실행중이냐 아니느냐 차이
프로세스 메모리의 구조
Code 영역
Text 영역이라고도 한다.
- 사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간이다.
- 프로그램을 시작할 때, 컴파일한 프로그램(기계어)이 저장된다. 읽기 전용(Read-Only) 이기 때문에 프로세스에서 변경할 수 없고 변경시 오류를 발생 시킨다.
- 코드 자체를 구성하는 메모리 영역으로 Hex 파일이나 Bin 파일 메모리이다. (이진 정보 형식이라는 얘기.)
Data 영역
필요에 의해 메모리를 동적으로 할당할 때 사용하는 메모리 영역으로 동적 메모리 영역이라고 부른다.
- 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장하는 공간이다. 이 변수들은 프로그램이 시작될 때 할당되어 프로그램 종료 시 소멸된다.
- 전역 변수 또는 static 값을 참조한 코드는 컴파일이 완료되면 data 영역의 주소값을 가르키도록 바뀐다. 전역변수가 변경 될 수도 있어 Read-Write로 되어 있다.
- 더 자세히 들어가면 BSS(Block Stated Symbol) 영역이 있다. 이 영역에는 초기화 되지 않은 전역변수가 저장된다. 초기화 된 전역변수는 Data 영역에 저장되어 비휘발성 메모리인 ROM에 저장되는데 이 부분은 비용이 많이 들어 RAM에 저장될 것과 ROM에 저장될 것을 구분하기 위해 영역을 구분해 사용한다.
Stack 영역
호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(지역변수, 매개변수, 리턴값 등)를 임시로 저장하는 공간이다.
- 이 영역은 함수 호출시 기록하고 함수의 수행이 완료되면 사라진다.
- 컴파일 시 stack 영역의 크기가 결정되기 때문에 무한정으로 할당 할 수 없기 때문에 재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 너무 많이 가지고 있다면 stack overflow가 발생한다.
Heap 영역
프로그래머가 필요할 때마다 사용하는 메모리 영역이다.
- 동적 데이터 영역이라고도 할 수 있다. 메모리 주소 값에 의해서만 참조되고 사용되는 영역이기 떄문에 프로그램 동작 시(런타임)에 크기가 결정된다.
- heap 영역은 런타임에 결정되지만, 자바에서는 객체가 heap영역에 생성되고 GC에 의해 정리된다.
프로세스의 특징
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)구조를 할당받게 되며, 프로세스당 최소 1개의 메인쓰레드를 가진다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 만약, 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스간의 통신(IPC, inter-process communication)을 사용해야한다.(예를 들어 pipe, file, socket)
프로세스 컨텍스트
프로세스 컨텍스트(Process Context)는 운영체제가 실행 중인 프로세스를 관리하기 위해 유지하는 모든 상태 정보를 말한다. 이는 프로세스가 CPU에서 실행되는 동안 필요한 정보를 포함하며, 프로세스를 일시 중지하고 나중에 재개할 수 있도록 한다. 프로세스 컨텍스트에는 다음과 같은 요소가 있다.
- 프로세스 상태(Process State)
- 프로세스가 현재 어떤 상태인지 나타낸다.
- 일반적으로 실행 중(running), 준비 상태(ready), 대기 상태(waiting) 등이 있다.
- 프로세스 제어 블록(PCB, Process Control Block)
- 각 프로세스의 상태 정보를 저장하는 데이터 구조
- PCB에는 프로세스 ID(PID), 프로세스 상태, 프로그램 카운터, CPU 레지스터, 메모리 관리 정보, 계정 정보 및 입출력 상태 정보가 포함된다.
- CPU 레지스터
- 프로세스가 실행되는 동안 사용되는 모든 CPU 레지스터의 값.
- 여기에는 프로그램 카운터, 스택 포인터, 일반 목적 레지스터 등이 포함된다.
- 메모리 관리 정보
- 프로세스가 사용하는 메모리 영역에 대한 정보
- 여기에는 페이지 테이블, 세그먼트 테이블, 베이스 및 리미트 레지스터 등이 포함된다.
- 스케줄링 정보
- 프로세스 스케줄러가 사용하는 정보로, 프로세스의 우선순위, 스케줄링 큐에 대한 포인터 등이 포함된다.
- 입출력 상태 정보
- 프로세스가 현재 수행 중인 입출력 작업에 대한 정보
- 여기에는 열려 있는 파일의 목록, 입출력 장치의 상태 등이 포함된다.
- 계정 정보
- 프로세스의 소유자, CPU 사용 시간, 실제 사용 시간 등의 정보
프로세스 컨텍스트 전환(Context Switching)
프로세스 컨텍스트 전환 단계
- 현재 프로세스의 상태 저장
- 현재 실행 중인 프로세스의 모든 CPU 레지스터와 프로그램 카운터의 값을 PCB에 저장
- 다음 프로세스의 상태 복원
- 다음 실행할 프로세스의 PCB에서 CPU 레지스터와 프로그램 카운터의 값 복원
- CPU 제어권 전환
- CPU가 새로운 프로세스의 명령어를 실행하도록 제어권 전환
컨텍스트 전환은 필수적이지만 비용이 많이 드는 작업이다. 전환 중에는 유효한 작업이 수행되지 않으므로, 가능한 최소화하는 것이 중요하며, 운영체제는 효율적인 스케줄링 알고리즘을 사용하여 컨텍스트 전환의 빈도를 최소화하려고 노력한다.
쓰레드(Thread)란?
- 프로세스 내에서 프로세스의 자원을 이용하여 실행되는 여러 흐름의 단위
- 쓰레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체
쓰레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 시퀀스이다.
또한, 하나의 프로세스는 하나 이상의 쓰레드를 갖고 있다.
쓰레드의 구조
프로그램 카운터, 레지스터 셋 이 두가지는 분명 프로세스의 문맥(context)의 구성정보와 일치한다. 따라서 쓰레드의 동작에 따라서 프로세스의 컨텍스트 또한 변경될 수 있다.
-
프로그램 카운터 (Program Counter): 쓰레드가 다음에 실행할 명령어의 주소를 가리키는 포인터이다.
-
레지스터 집합 (Register Set): 쓰레드가 현재 실행되는 상태를 저장하는 데 사용되는 레지스터 집합이다.
-
스택 (Stack): 쓰레드에서 함수 호출 및 반환을 관리하기 위해 사용되는 스택이다.
위의 큰 구성정보 이외에도 식별을 위한 쓰레드ID, 상태, 쓰레드의 우선순위, 지역변수 등을 포함하고 있다.
쓰레드의 특징
스레드는 독립적으로 동작하는 프로세스와 달리, 프로세스 내에서 스레드끼리 일부 메모리를 공유하여 동작한다.
- 메모리 공유(Shared Memory)
- 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
- 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
- 경량성(Lightweightness)
- 프로세스에 비해 스레드는 더 적은 자원을 사용한다. 스레드는 프로세스 내에서 메모리와 자원을 공유하기 때문에, 프로세스를 생성하는 것보다 더 적은 메모리를 사용한다. 또한, 스레드 간의 전환은 프로세스 간의 전환보다 빠르기 때문에 더 경량적이다.
- 상호 협력성(Cooperativeness)
- 스레드는 다른 스레드와 상호 협력하여 작업을 수행할 수 있다. 프로세스간의 통신에서는 IPC기능을 통한 통신이 이루어지는 반면 스레드는 데이터, 힙 영역을 공유함으로 데이터를 주고 받을 수 있다. 이러한 협력성은 프로세스와는 달리 더 높은 수준의 동시성을 제공해 준다.
멀티프로세스
- 멀티프로세스는 여러 프로세스를 동시에 실행하여 병렬 처리를 구현하는 방식
- 각 프로세스는 독립적으로 실행되며, 서로 다른 메모리 공간을 사용
- 한 프로세스의 오류가 다른 프로세스에 영향을 미치지 않음
멀티쓰레드
- 멀티쓰레드는 하나의 프로세스 내에서 여러 쓰레드를 동시에 실행하여 병렬 처리를 구현하는 방식
- 모든 쓰레드는 동일한 메모리 공간을 공유
- 쓰레드 간의 통신이 빠르지만, 동기화 문제를 적절히 처리
프로세스와 스레드의 비교
프로세스 | 스레드 | |
---|---|---|
개념 | 프로그램이 동작중인 상태 운영체제로부터 자원을 할당받는 작업의 단위 | 프로세스의 실행 가능한 가장 작은 단위 프로세스의 자원을 이용하여 실행되는 여러 흐름의 단위 |
자원공유 | 독립적인 메모리를 가지고 있다 | 코드, 데이터, 힙 영역의 메모리를 공유한다 |
문맥교환의 비용 | 문맥교환의 비용이 크다 | 문맥교환의 비용이 적다 |
동기화 | 독립적인 특징으로 동기화를 필요로 하지않는다. | 공유자원에 대해 접근 시 동기화가 필요하다 |
Comments