프로세스와 스레드
- 컴퓨터의 구조
1. 프로세스
- 운영체제 안에서 실행 중인 프로그램, 프로세스는 프로그램의 인스턴스
- 실행되기 전 프로그램은 보조기억장치에 저장된 데이터였다가 운영체제가 메모리에 적재하고 실행되는 순간 프로세스가 만들어짐
- 프로그램 실행 = 프로세스 안의 코드가 한 줄씩 실행되는 것
- 종류 : foreground process(사용자가 볼 수 있는 프로세스), background process(유닉스 - 데몬, 윈도우 - 서비스)
- 역할
- 실행 환경을 제공(메모리 공간, 파일 핸들, 시스템 자원(네트워크 연결)) - 컨테이너 역할
- 프로세스 자체는 운영체제의 스케줄러에 의해 직접 실행되지 않으며, 프로세스 내의 스레드가 실행됨
프로세스 제어 블록(Process Control Block)
- 운영체제가 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분하기 위해 사용하는 것
- 프로세스와 관련된 정보를 저장하는 자료 구조(커널 영역에 생성 됨)
- 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기됨
- 담기는 정보
- 프로세스 ID(PID), 레지스터 값, 프로세스 상태, CPU 스케줄링 정보, 메모리 관리 정보, 사용한 파일과 입출력장치 목록
문맥 교환(Context Swithcing)
- 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
- 문맥 : 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보 (PCB에 기록될 정보)
- 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있음
프로세스의 메모리 영역
- 프로세스가 생성되면 커널 영역 - PCB, 사용자 영역 - 프로세스가 저장됨
- 사용자 영역에 코드, 데이터, 힙, 스택 영역으로 나뉘어 저장됨
- 정적 할당 영역
- 코드 영역(Code Segment) - 텍스트 영역
- 실행할 수 있는 코드, 기계어로 이루어진 명령어가 저장됨
- 데이터가 아닌 CPU가 실행할 명령어가 담겨있기 때문에 쓰기가 금지되어 있음(READ_ONLY 공간)
- 데이터 영역(Data Segment)
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간 (전역 변수같은 데이터)
- 동적 할당 영역
- 힙 영역(Heap Segment)
- 프로그래머가 직접 할당할 수 있는 저장 공간, 할당하고 사용 후 반환해야 함
- 스택 영역(Stack Segmnet)
- 메서드 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역(스레드에 포함)
- 데이터를 일시적으로 저장하는 공간(매개 변수, 지역 변수 등)
- 일시적으로 저장할 데이터는 스택 영역에 push되고, 더 이상 필요하지 않을 때 pop되어 사라짐
2. 스레드
- 프로세스 : 실행되는 프로그램
- 스레드 : 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러 스레드를 가질 수 있음
- 스레드를 이용해 하나의 프로세스에서 여러 부분을 동시에 실행 가능
스레드의 구성 요소
- 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택
→ 그래서 스레드마다 각기 다른 코드 실행 가능
→ 프로세스의 스레드들은 실행에 필요한 레지스터 값, 스택만을 유지한 채 프로세스 자원을 공유하며 실행됨
스레드의 메모리 구성
- 공유 메모리 : 같은 프로세스의 코드 섹션, 데이터 섹션, 힙(메모리)은 프로세스 안의 모든 스레드가 공유
- 개별 스택 : 각 스레드는 자신의 스택을 가지고 있음
3. 멀티태스킹, 멀티 프로세스, 멀티 스레드
- 프로세스는 실행 환경과 자원을 제공하는 컨테이너 역할을 하고, 스레드는 CPU를 사용해서 코드 하나하나를 실행
- 멀티 태스킹 (운영체제 소프트웨어적 관점)
- 단일 CPU(단일 CPU core)가 여러 작업을 동시에 수행하는 것처럼 보이게 하는 것을 의미
- 소프트웨어 기반으로 CPU 시간을 분할하여 각 작업에 할당
- 예) 현대 운영체제에서 여러 어플리케이션이 동시에 실행되는 환경
- 멀티 프로레싱 (하트웨어 장비 관점)
- 여러 CPU(여러 CPU core)를 사용하여 동시에 여러 작업을 수행하는 것을 의미
- 하드웨어 기반으로 성능 향상시킴
- 예) 다중 코어 프로세서를 사용하는 현대 컴퓨터 시스템
→ 여러 CPU 코어를 사용하며 (멀티 프로세싱), 동시에 각각의 단일 CPU 코어에 여러 작업을 분할해서 수행(멀티 태스킹) 가능
Reference
자바 고급 1편 - 멀티스레드와 동시성
개발 서적 - 혼자 공부하는 컴퓨터 구조 & 네트워크 (강민철 지음)