프로세스와 스레드
프로세스
프로세스란?
- Process is a program in execution
- 프로세스란 실행중에 있는 프로그램
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
- 스케줄링의 대상이 되는 작업(task)와 같은 의미로 쓰인다.
- 프로세스 내부에는 최소 하나의 스레드(thread)를 가지고 있는데, 실제로는 스레드(thread) 단위로 스케줄링을 한다.
- 하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라 불린다.
프로세스의 문맥
- 프로세스가 실행 중인 상태를 저장하거나 복원하는 데 필요한 정보를 포함
- CPU 수행 상태를 나타내는 하드웨어 문맥
- Program Counter: 현재 실행 중인 명령어의 주소를 저장합니다.
- Register: 연산에 필요한 데이터와 CPU 상태 정보를 저장하는 레지스터들(예: 일반 레지스터, 상태 레지스터 등).
- 프로세스의 메모리 영역
- 코드, 데이터, 스택 세그먼트로 구분된 프로세스 고유의 메모리 공간.
프로세스 메모리 영역
- Code 영역
- 실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역입니다.
- CPU는 이 영역에 저장된 명령어를 순차적으로 가져와 실행합니다.
- Data 영역
- 코드에서 선언된 전역 변수와 정적 변수가 저장되는 영역입니다.
- 프로그램이 실행되면서 할당되며, 프로그램 종료 시 소멸합니다.
- Stack 영역
- 함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소 등이 저장되는 영역입니다.
- LIFO(Last In, First Out) 구조로 관리되며, 함수 실행이 끝나면 해당 스택 메모리는 해제됩니다.
- Heap 영역
- 개발자가 필요에 따라 동적으로 할당하고 관리할 수 있는 자유로운 메모리 공간입니다.
- 명시적으로 할당 및 해제해야 하며, 이를 관리하지 않을 경우 메모리 누수(memory leak)가 발생할 수 있습니다.
스레드
스레드란?
- 스레드는 프로세스 내에서 실행 흐름의 단위로, 프로세스가 할당받은 메모리와 자원을 공유합니다.
- 프로세스와 달리 스레드 간에는 메모리를 공유하므로, 메모리 사용 효율이 높아집니다.
-
스레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 가장 작은 실행 단위이며, 하나의 프로세스는 하나 이상의 스레드를 가질 수 있습니다.
- 스레드는 프로세스 내의 코드(Code), 데이터(Data), 힙(Heap) 영역을 공유하며, 자신만의 고유한 스택(Stack) 영역을 가집니다.
프로세스와 스레드의 차이
- 가장 큰 차이점은 공유하는게 존재 유무입니다.
- 프로세스
- 프로세스는 자신만의 독립적인 메모리 공간(코드, 데이터, 힙, 스택)을 가지고 실행됩니다.
- 다른 프로세스와 메모리를 공유하지 않으며, 프로세스 간 통신(IPC, Inter-Process Communication)이 필요합니다.
- 스레드
- 스레드는 동일한 프로세스 내에서 코드(Code), 데이터(Data), 힙(Heap) 영역을 공유합니다.
- 하지만 각 스레드는 자신만의 스택(Stack)을 가지고 독립적으로 실행됩니다.
- 스레드 간에는 메모리 공유로 인해 데이터 접근이 빠르지만, 동기화 문제가 발생할 수 있습니다.
멀티태스킹
- 멀티태스킹은 하나의 운영체제에서 여러 프로세스를 동시에 실행하는 것처럼 보이게 하는 기능입니다.
- 실제로는 CPU가 짧은 시간 간격으로 프로세스를 전환하며 실행하기 때문에, 사용자 입장에서는 여러 작업이 동시에 수행되는 것처럼 느껴집니다.
- 이를 구현하기 위해 SJF(Shortest Job First), FIFO(First In First Out), 라운드로빈(Round Robin)과 같은 스케줄링 기법이 사용됩니다.
멀티스레드
- 멀티스레드는 하나의 프로세스 내에서 여러 작업을 여러 스레드로 동시에 처리하는 것을 의미합니다.
- 멀티프로세스에 비해 Context Switching 비용이 적어 더 효율적입니다.
- 스레드는 같은 메모리 공간을 공유하므로, Context Switching 시 메모리 복사가 필요 없기 때문입니다.
- 그러나 자원을 공유하기 때문에, 하나의 스레드 오류가 전체 프로세스에 영향을 미칠 수 있습니다.
- 또한, 자원 공유로 인해 동기화 문제가 발생할 수 있으며, 이로 인해 교착 상태(Deadlock)가 발생할 위험이 있습니다.
- 이를 위해 뮤택스, 세마포어, 락 등의 동기화 도구를 사용한다.