프로그램 (Program)
- 컴퓨터에서 실행할 수 있는 파일을 통칭 → 컴퓨터는 프로그램이 있어야 일을 함
- 코드 집합
프로세스 (Process)
- 프로그램이 활성화된 상태
- 컴퓨터에서 작업중인 프로그램
- 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있음
- 프로그램 실행 → 메모리에 컴퓨터 파일 올라감 → 운영체제로부터 시스템 자원(CPU) 할당받아 프로그램 코드 실행
스레드(Thread)
- 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위
- 한 순간에 하나의 작업밖에 하지 못함
프로그램 | 프로세스 |
어떤 작업을 하기 위해 실행할 수 있는 파일 | 실행되어 작업중인 컴퓨터 프로그램 |
파일이 저장 장치에 있지만 메모리에는 올라가 있지 않은 정적인 상태 | 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태 |
코드 덩어리 | 코드 덩어리를 실행한 것 |
프로세스 (Process) | 스레드 (Thread) |
운영체제로부터 자원을 할당받은 작업의 단위 | 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위 |
멀티 프로세스 vs 멀티 스레드
한 어플리케이션에 대한 처리 방식 + 동시에 여러 일 처리
멀티 프로세스(Multi Process)
- 운영체제에서 하나의 응용 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기술
- 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성함으로서 다중 프로세스 구조
- 부모 프로세스와 자식 프로세스는 독립적으로 실행되며, 독립적인 메모리 공간을 가지고 있어 서로 다른 작업 수행
- EX) 웹 브라우저의 상단 탭 → 같은 브라우저 프로그램 실행이지만, 각기 다른 사이트 실행
※ 멀티 프로세서(Multi Processer) : 여러 개의 CPU 코어가 하나의 시스템에서 동시에 실행되는 것
[장점]
1. 프로그램 안전성
: 각 프로세스가 독립적인 메모리 공간을 가지므로, 한 프로세스가 비정상적으로 종료되어도 다른 프로세스에 영향 X
→ 프로그램 전체의 안정성 확보 가능
2. 프로그램 병렬성
: 다중 CPU 시스템에서 각 프로세스를 병렬적으로 실행하여 성능 향상
(멀티 프로세스와 멀티 스레드 둘의 장점 → 멀티 스레드로 구성하는 것이 더 효율적)
3. 시스템 확장성
: 각 프로세스가 독립적이므로, 새로운 기능이나 모듈을 추가하거나 수정할 때 다른 프로세스에 영향 X → 쉽게 규모 확장 가능
[단점]
1. Context Switching Overhead
: 빈번한 context switching 작업으로 인해 비용 오버헤드 발생
[Context switching]
- Linix 커널의 Process Scheduler: 한정된 core에 여러 코드가 돌도록 전환(context switching)
- context switching은 생산성도 없고 쓰잘데기 없음 → 양이나 횟수를 최소화 하는게 좋음!
- 프로세스를 context switching하면, CPU는 다음 프로세스의 정보를 불러오기 위해 메모리를 검색하고, CPU 캐시 메모리를 초기화하며, 프로세스 상태를 저장하고, 불러올 데이터를 준비해야 함 → 비용 多
- 스레드는 프로세스 스위칭보다 가벼워 빠르고 좋음
2. 자원 공유 비효율성
: 멀티 프로세스는 각 프로세스가 독립적인 메모리 공간을 가지므로, 결과적으로 메모리 사용량 증가
(address space 공유 X)
→ 프로세스 간의 통신은 주로 IPC(Inter-Process Communication)를 통해 이루어짐
→ shared memory, pipe, socket 등이 포함됨
※ 프로세스 주소 공간(Process Address Space) : 프로그램이 실행되면 OS는 실행 파일의 명령들을 읽어 프로세스를 생성하고 메모리를 할당하게 되는데, 이를 프로세스 주소 공간이라고 함.
[폰 노이만 아키텍쳐]
- 중앙처리장치(CPU), 메모리, 프로그램 세 가지 요소로 구성
- CPU와 메모리는 서로 분리되어 있고 둘을 연결하는 버스를 통해 명령어 읽기, 데이터의 읽고 쓰기가 가능
- 메모리에 올라온 data만 쓸 수 있음 → data 공유해야 함
- cf) 양자 컴퓨터는 전통적인 폰노이만 구조와 다른 방식으로 작동(큐비트 사용)
멀티 스레드(Multi Thread)
- 하나의 프로세스 안에 여러 개의 스레드가 있는 것
- 하나의 프로그램에서 두가지 이상의 동작 동시 처리
- EX) 웹 서버 → 사용자가 서버 데이터베이스에 자료를 요청하는 동안 브라우저의 다른 기능을 이용할 수 있음
※ 웹 브라우저 예시
- 멀티 프로세스: 웹 브라우저에서의 여러 탭이나 여러 창
- 멀티 스레드: 웹 브라우저의 단일 탭 또는 창 내에서 브라우저 이벤트 루프, 네트워크 처리, I/O 및 기타 작업을 관리하고 처리
[장점]
1. 프로세스보다 가벼움
: 스레드는 프로세스 내에서 생성되기 때문에 스레드의 실행 환경을 설정하는 작업이 매우 간단하여 생성 및 종료가 빠름
+) 프로세스와 달리 자원을 서로 공유하기 때문에 데이터 용량 작음
2. 자원의 효율성
: address space 공유 → 프로세스 간 통신(IPC)를 사용하지 않고도 데이터 공유 가능
3. Context Switching 비용 감소
: 프로세스의 context switching보다 오버헤드가 훨씬 낮아 비용 낮음
→ 스레드의 context switching 비용은 스레드 간에 공유하는 자원을 제외한 스레드 정보(stack, register)만을 교체하면 되므로
4. 응답 시간 단축
: 스레드 간의 통신이나 자원 공유 용이 + 프로세스보다 가벼워 컨텍스트 스위칭 오버헤드 작음
→ 멀티 프로세스보다 응답 시간이 빠르다.
[단점]
1. 안정성 문제
: 하나의 스레드에서 문제가 발생하면 다른 스레드들도 영향을 받아 전체 프로그램 종료
cf) 멀티 프로세스: 각 프로세스가 독립적으로 동작하므로 하나의 프로세스에 문제가 발생해도 다른 프로세스들은 영향을 받지 않기 때문에 프로그램이 죽지 않고 계속 동작 가능
2. 동기화로 인한 성능 저하
: 여러 개의 스레드가 공유 자원에 동시에 접근할 수 있기 때문에, 동기화 문제 발생 가능
→ 여러 스레드들이 자원에 대한 접근을 순차적으로 통제하는 동기화 작업 필요
(여러 스레드 접근을 제한하는 것이므로 병목 현상이 일어나 성능 저하될 수 있음)
3. 데드락(교착 상태)
: 다수의 프로세스나 스레드가 서로 자원을 점유하고, 다른 프로세스나 스레드가 점유한 자원을 기다리는 상황에서 발생하는 교착 상태 → 무한 루
멀티 스레드 X 멀티 프로세스 O인 이유
- 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 기본적으로 멀티 스레딩을 기본으로 하고 있음
- 그러나 증권사 입장에서 FEP가 죽으면 큰일남(소송 당하고 회사 망함)
- 멀티 스레드: 같이 죽음 / 멀티 프로세스: 하나가 죽어도 다른 것에 영향 X
'CS' 카테고리의 다른 글
엔디안이란? (빅엔디안 / 리틀엔디안) (0) | 2024.10.24 |
---|---|
[c언어] TCP/IP Socket 통신 흐름 (0) | 2024.10.07 |
Transport Layer - TCP (0) | 2024.10.07 |
Linux Kernel & Process Management (1) | 2024.10.07 |
Linux Kernel & Program Execution (0) | 2024.10.07 |