Goal
- 프로세스와 스레드의 개념
- 프로세스와 스레드의 차이
- 멀티 프로세스 대신 멀티 스레드 사용 이유
♬ 프로그램
(개념)
- 특정 작업 수행을 목적으로 실행하는 파일
- 실행 가능한 명령어(instruction)의 집합
(형태)
- 디스크에 저장되어 컴파일된 바이너리 이미지 형태
- 파이썬 스크립트 처럼 해석되는(Interpret) 고급어 형태
♬ 프로세스
(개념)
- 동적 개념 : 메모리에 적재(load) 되어 순차-연속적으로 실행되는 프로그램
→ not, 정적 개념의 프로그램. 동적으로 실행 중인 프로그램
- 프로그램의 인스턴스 (독립적인 개체)
- 운영체제로부터 시스템 자원을 할당받는 작업 단위
(cf) 시스템에서 할당 받는 자원
- CPU 사용시간
- 메모리 주소 공간
- Code, Stack, Data, Heap로 되어있는 독립된 메모리 영역
(특징)
- 1개 프로그램은 다수의 프로세스 동시 존재 가능 (Window10에서 메모장 n개 실행 ) → OS가 각 프로세스를 독립적으로 관리하며, 다른 프로세스가 겹치지 않고 사용 자원 영역이 중복되지 않는다.
(단) 같은 프로그램 내 프로세스는 Code 영역 공유 : 내용상 동일한 프로그램 코드를 여러 복사해서 프로세스마다 갖고있기 보다 메모리 상 코드 공간을 주소로 참조.
- 프로세스는 커널에 의해 관리되며, 커널 메모리 안에는 각 프로세스별 관리중인 프로세스 관련 데이터가 PCB에 담겨있음. 해당 정보는 커널 스케줄러의 프로세스 제어에 필요
- OS는 독립적 프로세스간 타 프로세스 정보 변경 주의. 필요 시 인터페이스를 통한 소통 권장 (IPC: Inter Process Communication ) : (ex) 파이프 라이닝
- 프로세스는 각 독립된 메모리 영역(Code, Stack, Data, Heap)을 할당받음
- 프로세스당 최소 1개의 메인 스레드 보유
- 각 프로세스는 별도의 주소 공간에서 실행 → 한 프로세스에서 다른 프로세스의 변수와 자료구조에 접근할 수 있다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간 통신 IPC(inter-process-communication)을 사용.
(ex) 파이프, 소켓, 파일
▶ 프로세스 정보 2가지
1. 커널 메모리 내에서 관리되는 PCB 정보
2. 유저가 사용하는 메모리 공간 상 프로세스 정보
※ PCB(Process Control Block) 포함 정보 및 자원
- 프로그램 관련 실행 가능한 기계어 이미지
- OS 에서 할당된 자원의 식별자 (Unix의 파일 디스크립터 , 윈도우즈 Handle 등)
- 프로세스 소유자 등 프로세스 관련 Permission 정보
- Context로 일컬어지는 프로세스 상태, 물리적 메모리 주소 및 CPU 내 레지스터 내용, 실행중 명령어를 지정하는 Program Counter 포함
- 실행되는 프로세스에 대한 메모리 주소
※ 메모리 공간 상 프로세스 정보 집합 4가지
- Code(text) : 프로그램의 실제 코드 저장
- Data : 프로세스 실행 시 정의된 전역 변수, Static 변수 저장
- Heap : 프로세스 런타임 중 동적으로 할당되는 변수 저장 ( 함수 내 할당되는 변수)
- Stack : 함수에서 타 함수 실행하는 등 서브루틴 정보 저장 ( 재귀, 스택 관련)
♬ 스레드
(개념)
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스의 특정한 수행 경로
- 프로세스가 할당받은 자원을 이용하는 실행 단위
(특징)
- 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code,Data,Heap 영역은 공유한다.
- 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름
- 스레드는 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행
- 같은 프로세스 내 스레드들은 같은 힙 공간을 공유한다. But, 프로세스는 다른 프로세스 메모리 직접 접근 불가
- 각 스레드는 별도의 레지스터와 스택을 갖고 있지만 힙 메모리는 서로 읽고 쓸 수 있다.
- 한 스레드가 프로세스 자원 변경 시, 다른 이웃 스레드(sibling thread)도 변경 결과를 즉시 볼 수 있다.
♬ 자바 스레드(JAVA Thread)
(특징)
- 일반 스레드와 차이 없으며 JVM이 운영체제 역할 담당
- 자바에는 프로세스가 아닌 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케줄링 되는 실행 단위 코드 블록.
- 자바에서 스레드 스케줄링은 전적으로 JVM에 의해 이루어짐.
- 스레드 관련 정보는 JVM이 관리
º 스레드 갯수
º 스레드로 실행되는 프로그램 코드의 메모리 위치
º 스레드 상태
º 스레드 우선순위
- 자바로 스레드로 작동할 코드를 작성 한 후, 스레드 관련 코드가 생명을 가지고 실행 시작하도록 JVM에 요청
♬ 멀티 태스킹
(개념)
- 1개 컴퓨터에서 여러 작업을 동시에 진행함
(특징)
- 현대적 운영체제는 모두 멀티태스킹을 지원한다.
- 프로세스는 동시에 실행되는 것이 아닌 Time sharing 기법 내 매우 짧은 순간 동안 작업(= CPU 점유) 하고 다른 프로세스에 CPU 자원을 양보한다.
- 작업 중단 시, 프로세스 정보인 Context 정보는 프로세스가 전환될 때 PCB에 저장한 후, 차례가 돌아올 때 PCB에 저장된 상태의 작업을 재개한다.
- Context Switch ( 프로세스가 전환되면서 Context 전환하기) 시 오버헤드 발생
Bc, 작업 중인 Context 저장 후 새로운 Context를 로드하며 CPU 레지스터 상태 변환, 스택포인터 추적, 명령어 추적하는 Program Counter작업을 처리하므로.
- 멀티태스킹의 수요로 인해 OS는 Context Switch 최적화에 집중한다.
♬ 멀티 프로세스 vs 멀티 스레드
▶ 멀티 프로세스
- 멀티 프로세싱
(개념)
- 하나의 응용프로그램을 여러 프로세스로 구성하여 각 프로세스가 1개 작업(Task) 처리하기
(장점)
- 여러 자식 프로세스 중 하나에 문제가 발생해도, 해당 프로세스 오류 이상으로 영향 확산x
(단점)
- Context Switching 의 오버헤드
※ Context Switching
- CPU에서 여러 프로세스가 순차적으로 작업 처리하는 과정
- 동작 중 프로세스가 대기 후 , 해당 프로세스 상태(Context)보관하고, 대기하던 다음 순서 프로세스가 동작하며
이전 보관 프로세스 상태 복구 작업
→ Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업 진행 및 시간 소모와 오버헤드 발생
→ 프로세스는 독립된 메모리 영역 할당 받고, 프로세스 사이에 공유한 메모리가 없어서 Context Switching 발생 시, 캐쉬에 있는 모든 데이터를 리셋한 후 다시 캐시 정보를 불러와야한다.
- 프로세스 사이의 복잡한 통신(IPC)
→ 프로세스는 독립된 메모리 영역 할당 받았기 때문에 1개 프로그램에 속하는 프로세스 사이에 변수 공유 불가
▶ 멀티 스레드
- 멀티 스레딩
(개념)
- 1개 응용프로그램을 여러 스레드로 구성한 후 각 스레드로 하여금 1개의 작업을 처리하도록 하기
- 다양한 OS가 멀티 프로세싱을 지원하지만 기본적으로 멀티 스레딩이다.
- (ex) 웹서버는 대표적 멀티 스레드 응용 프로그램
(장점)
- 시스템 자원 소모 감소 ( 자원의 효율성 증대)
① 프로세스 생성 후, 자원할당하는 시스템 콜 감소로 자원의 효율적 관리가 가능하다
- 시스템 처리량 증가 ( 처리 비용 감소)
① 스레드 간 데이터 교환이 간단하고 시스템 자원 소모 감소
② 스레드 간 작업량이 작아 Context Switching이 빠르다
- 간단한 통신 방식으로 프로그램 응답 시간 단축
☞ 스레드는 프로세스 내 Stack 영역 제외 모든 메모리를 공유하여 통신 부담 적음
(단점)
- 주의 깊은 설계 필요
- 까다로운 디버깅
- 단일 프로세스 시스템의 경우 효과 기대 어려움
- 다른 프로세스에서 스레드 제어 불가 ( 프로세스 밖에서 개별 스레드 제어 불가)
- 멀티 스레드의 경우 자원 공유 문제 발생
- 하나의 스레드에 문제 발생 시, 전체 프로세스 영향 미침
♬ 멀티 프로세스 대신 멀티 스레드 사용 이유
- N개 프로그램 구동보다 1개 프로그램 내 N개 작업 해결이 쉬움
- N개 프로세스(멀티 프로세스) 로 할 수 있는 작업을 1개 프로세스에서 N개 스레드로 나눠 진행하는 이유
1) 자원의 효율성 증대
① 프로세스 생성 후 자원을 할당하는 시스템콜이 줄어들어 자원의 효율적 관리 가능
Bc, 프로세스 간 Context Switching 시 CPU 레지스터 교체이외 RAM, CPU 사이 캐시 메모리 데이터 초기화되므로 오버헤드가 크다.
② 스레드는 프로세스 내 메모리 공유로 인해 독립적 프로세스와 달리 스레드 간 데이터 교환이 단순하며 시스템 자원 소모 감소.
2) 처리 비용 감소 및 응답 시간 단축
① 프로세스 간 통신(IPC)보다 스레드 간 통신 비용이 적으므로 작업 간 통신 부담 감소
Bc, 스레드는 Stack 영역을 제외한 모든 메모리를 공유함
② 프로세스 간 전환 속도보다 스레드 간 전환 속도가 빠름
Bc, Context Switcing 시, 스레드는 Stack 영역만 처리
※ 주의사항
- 동기화 문제
- 스레드 간 자원 공유는 전역 변수 (데이터 세그먼트)를 이용하므로 상용 시 충돌 발생 가능
gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
magi82.github.io/process-thread/
jaybdev.net/2017/06/05/Java-3/
'[ComputerScience]' 카테고리의 다른 글
[CS : Interview ] (0) | 2020.10.07 |
---|---|
[ CS ] 한글 인코딩 정리(EUC-KR , UTF-8) (0) | 2019.08.19 |