본문 바로가기
[ComputerScience]

[CS Interview :: OS ] 프로세스와 스레드(Process vs Thread)

by Inkim 2020. 10. 8.

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

brunch.co.kr/@kd4/3

magi82.github.io/process-thread/

jaybdev.net/2017/06/05/Java-3/

includestdio.tistory.com/6

lalwr.blogspot.com/2016/02/process-thread.html

you9010.tistory.com/136

'[ComputerScience]' 카테고리의 다른 글

[CS : Interview ]  (0) 2020.10.07
[ CS ] 한글 인코딩 정리(EUC-KR , UTF-8)  (0) 2019.08.19