프로세스 & 스레드 정리
정적 프로그램(Static Program) : 컴퓨터에서 실행 할 수 있는 파일
윈도우의 *.exe 파이이나 Mac의 *.dmg 파일등을 말 하는데
파일을 실행하지 않은 상태이기 때문에 정적 프로그램 줄여서 프로그램이라고 부른 것이다.
프로세스(Process) : 컴퓨터에서 실행중인 프로그램(동적)
프로세스는 운영체제에 의해 관리되고, 프로그램 실행을 위해 필요한 자원과 실행 상태 정보를 가지고 있다.
※ 특징
- 독립성: 각 프로세스는 독립된 메모리 공간을 할당받아 실행되며, 다른 프로세스의 영향을 받지 않는다.
이를 통해 한 프로세스의 오류나 비정상적인 종료가 다른 프로세스에 영향을 미치지 않도록 보장된다. - 자원 할당: 프로세스는 실행을 위해 CPU 시간, 메모리, 파일, 네트워크 등의 자원을 필요로 함.
운영체제는 이러한 자원을 관리하고 프로세스에 할당하여 실행을 지원한다. - 스케줄링: 여러 개의 프로세스가 동시에 실행될 때, 운영체제는 CPU 시간을 적절히 할당하여 각 프로세스가
공정하게 실행될 수 있도록 스케줄링을 수행한다. 이는 CPU를 효율적으로 활용하고 응답성을 향상시킨다. - 상태 전이: 프로세스는 다양한 실행 상태를 가질 수 있으며, 이러한 상태는 상태 전이(transition)에 의해 변경된다.
일반적으로 생성(created), 준비(ready), 실행(running), 대기(waiting), 종료(terminated) 등의 상태를 가진다. - 프로세스 간 통신: 프로세스는 운영체제의 지원을 받아 다른 프로세스와 통신할 수 있다.
이를 통해 데이터의 교환, 동기화, 협력적인 작업 수행 등이 가능해진다.
프로세스는 컴퓨터 시스템에서 핵심적인 개념으로 사용되며, 운영체제는 프로세스를 관리하여 안정적이고 효율적인 실행을 지원한다.
프로세스 자원구조
코드 영역(Code / Text) : 프로그래머가 작성한 프로그램 함수들의 코드가
CPU가 해석 가능한 기계어 형태로 저장되어 있다.
데이터 영역(Data) : 코드가 실행되면서 사용하는 전역 변수나 static변수 등 각종 데이터들이 모여있다.
데이터영역은 .data ,.rodata, .bss 영역으로 세분화 된다.
.data : 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장
.BSS : 초기값 없는 전역 변수, static 변수가 저장
.rodata : const같은 상수 키워드 선언 된 변수나 문자열 상수가 저장
스택 영역(Stack) : 지역 변수와 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 임시 메모리 영역이다. Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 만일 Heap이 stack 영역을 침범하면 Heap overflow가 발생한다.
힙 영역(Heap) : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 위해 존재하는 공간이다.
사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
마찬가지로 Stack이 Heap영역을 초과하면 Stack overflow가 발생한다.
쓰레드(Thread) : 프로세스 내에서 실행되는 독립적인 실행 단위
한 프로세스 내에서 여러개의 쓰레드를 생성하고 관리하여 동시에 여러 작업을 수행할 수 있다.
※ 특징
- 경량성: 쓰레드는 프로세스의 자원을 공유하며, 독립적인 스택 영역만을 갖는다.
따라서 쓰레드 간의 전환은 프로세스 간의 전환보다 빠르고 경량한다. - 동시성: 쓰레드는 동시에 실행될 수 있기 때문에 여러 작업을 병렬로 처리할 수 있습니다.
각 쓰레드는 독립적인 실행 경로를 가지며, CPU 시간을 공유하면서 실행됩니다. - 자원 공유: 같은 프로세스 내의 쓰레드는 힙 메모리, 파일 핸들 등의 자원을 공유할 수 있습니다.
이를 통해 데이터의 공유와 효율적인 작업 분할이 가능해집니다. - 동기화: 쓰레드는 동시에 실행되기 때문에 공유 자원에 대한 접근 제어와 데이터의 일관성 유지가 중요합니다.
쓰레드 간의 동기화 메커니즘을 사용하여 상호 작용하고, 데이터의 동시 접근 문제를 해결할 수 있습니다.
쓰레드를 사용하면 병렬 처리, 응답성 향상, 자원 효율성 등의 이점이 있다.
예를 들어, GUI 애플리케이션에서는 사용자 인터페이스 응답성을 유지하기 위해 메인 쓰레드와 별도의 작업 쓰레드를
분리하여 작업을 처리할 수 있다.
또한, 다중 코어 프로세서 시스템에서는 쓰레드의 병렬 처리 특징으로 수행하여 성능을 향상 시킬 수 있다.
쓰레드 사용 시 주의해야 할 점은 쓰레드 간의 동기화 문제나 경합 조건과 같은 문제가 발생 할 수 있고,
이로 인해 예기치 않은 동작이 발생 할 수있다.
쓰레드를 안전하게 사용하기 위해서는 동기화 기법 및 쓰레드 안전성에 대한 고려가 필요하다.
JVM의 Garbage Collection이 작동할 때 쓰레드를 정지 시켜버린다.
< 쓰레드가 프로세스보다 컨텍스트 스위칭이 빠른 이유 >
메모리 공간 공유: 쓰레드는 같은 프로세스 내에서 실행되므로, 프로세스의 메모리 공간을 공유한다. 이로 인해 쓰레드 간의 컨텍스트 스위칭은 스택 영역만을 전환하면 되기 때문에 비교적 빠르다. 반면에 프로세스 간의 컨텍스트 스위칭은 메모리 매핑 및 페이지 테이블 변경과 같은 추가 작업이 필요하기 때문에 시간이 더 걸린다.
자원 공유: 쓰레드는 같은 프로세스 내에서 자원을 공유하므로, 컨텍스트 스위칭 시에는 자원에 대한 추가적인 초기화나 정리 작업이 필요하지 않다.
프로세스 간의 컨텍스트 스위칭에서 필요한 자원 할당 및 해제 작업에 비해 더 빠른 스위칭을 가능하게 한다.
스케줄링 단위: 쓰레드는 운영체제의 스케줄러에 의해 스케줄링되는 최소 실행 단위다.
이는 쓰레드의 실행 시간이 짧고, 프로세스와 비교하여 스케줄링 단위가 작기 때문에 컨텍스트 스위칭
비용이 감소한다. 프로세스는 쓰레드를 포함하는 단위로 스케줄링되기 때문에 프로세스 간의 스케줄링은 더 큰 규모의 작업을 수행하므로 비용이 더 크다.
운영체제의 최적화: 많은 운영체제는 쓰레드를 지원하기 위해 컨텍스트 스위칭을 빠르게 수행하기 위한 최적화를 적용한다. 이러한 최적화는 커널 수준의 작업을 최소화하거나, 미리 계산된 컨텍스트 정보를 캐시하는 등의 방식으로 이루어집니다. 이로 인해 쓰레드 간의 컨텍스트 스위칭이 더 효율적으로 수행됩니다.
스택(Stack) :
<CPU 작업 처리 방식>
병렬성(Parallelism)
여러개의 코어에 맞춰 프로세스와 스레드를 돌려 병렬로 작업들을 동시 수행하는 것을 말한다.