포스팅 시작에 앞서서 프로세스와 스레드의 생김새가 어땠더라?
❗️위의 프로세스와 스레드의 생김새를 기억하면서 이해해보자!
멀티 프로세스 / 멀티 스레드
1. 멀티 프로세스
: 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것
장점
- 메모리 침범 문제를 OS 차원에서 해결
- 여러 자식 프로세스 중 하나에 문제가 발생하여도 그 프로세스만 타격, 확산되지 X
단점
- 각 프로세스가 독립된 메모리 영역 (Code, Data, Heap, Stack)을 가지고 있기 때문에 작업량이 많아지면 오버헤드가 발생함 (context switching)
- 프로세스 간의 복잡한 통신 (IPC) 가 필요함
💡 PCB (Process Control Block)
프로세스의 메타데이터들을 저장하는 블록, 프로세스 별로 존재하는 자료 구조 (linked list 로 구성)
2. 멀티 스레드
: 하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것
장점
- 메모리 공간, 시스템 자원의 효율성 증가
- Data, Heap 영역을 이용해 데이터를 주고 받으므로 스레드간 통신이 간단함
- context switching시 비용이 적음 (교환해야 할게 적으니까!) -> 시스템 처리량 향상, 프로그램 응답 시간 단축됨
단점
- 서로 다른 스레드가 Stack을 제외한 메모리 공간을 공유하기 때문에 동기화 문제가 발생할 수 있음
- 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받음
- 주의 깊은 설계가 필요하며 디버깅이 까다로움
💡 TCB (Thread Control Block)
스레드의 메타데이터를 저장하는 블록, 스레드 별로 존재하는 자료 구조
💡 PCB 와 TCB 가 사용될 때
같은 프로세스 내에서, 스레드간의 context switching -> TCB만!
다른 프로세스의 스레드로 context switching -> PCB & TCB!
(TCB가 context switching의 기본 단위이다)
멀티 프로세싱 / 멀티 코어 / 멀티 태스킹 / 멀티 프로그래밍
컴공을 4년 다녀도 헷갈리는 이놈들!!!
1. 멀티 프로세싱
- CPU가 1개가 아닌 여러개인 것을 말함
- register와 cache를 독립적으로 가진 여러개의 CPU가 1개의 메모리에 연결된 구조
2. 멀티 코어
- CPU 칩 내부에 register와 cache를 갖고 있는 core 만 따로 회로를 구성한 구조
3. 멀티 태스팅 / 멀티 프로그래밍
- 메모리에 여러 프로그램을 올려서 사용하는 구조
- 메모리에 여러개의 프로세스를 동시에 올리고, CPU는 프로세스를 concurrency 하게 실행
4. 멀티 프로그래밍
- 하나의 메모리에 동시에 여러개의 프로세스를 올림
5. 멀티 태스킹
- 멀티 프로그래밍된 메모리를 대상으로 CPU가 시분할로 여러 프로세스를 빠르게 처리함 (= concurrency)
역시나 오늘도 헷갈리는 cpu,, 프로세서,, 코어,, 무슨 차이일까?!
CPU vs 프로세서 vs 코어
프로세서
- 컴퓨터 운영을 위해 기본적인 명령어들을 처리하고, 반응하기 위한 논리 회로
- control unit(신호를 보내는 제어장치) + ALU (사칙 연산, 논리 연산)
CPU
디바이스가 해야할 일을 총 지휘하는 프로세서로, 기억 연산 제어 3대 기능을 종합하는 장치
코어
각종 연산을 하는 CPU의 핵심 요소
💡 concurrency 란?
동시에 실행되는 것 처럼 보이는 것, 물리적으로는 병렬 X, 순차적으로 진행
time sharing으로 CPU를 나누어 사용
프로세스간에는 서로 메모리가 모두 독립되어 있다는데, 통신이 필요하면 어쩌지??
IPC (Inter-Process Communication)
프로세스들은 서로 통신이 필요하면, 커널이 제공하는 IPC 설비를 이용해 통신을 진행한다! 다음은 6가지의 IPC 설비들에 대한 간단한 설명이다.
1. 익명 PIPE
: 파이프는 두 프로세스를 연결, 한 쪽은 쏘기만 하고 한 쪽은 읽기만 하는 반이중통신 (한방향) -> 양방향 통신을 위해서는 2개의 파이프가 필요하다!
장점
- 매우 간간한 사용, 단순한 데이터 흐름에서는 효율적
단점
- 양방향 통신을 위해서는 파이프 두개를 만들어야 하기 때문에 구현이 복잡해짐
2. Named PIPE
: 익명 파이프와 유사하게 동시에 읽기와 쓰기가 불가능한 반이중 통신이지만, 전혀 모르는 관계의 프로세스 간의 통신 -> 이름이 있는 파일 사용
3. Message Queue
- 입출력 방식은 Named PIPE와 동일하지만 데이터의 흐름이 아닌 메모리 공간(-> 뮤텍스, 세마포어와 같은 동기화가 필요!)
- 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다
4. Shared Memory
- 파이프, 메세지 큐가 통신을 이용한 설비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비
- 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용한다
- 프로세스가 공유 메모리 할당을 커널에 요청 -> 커널은 해당 프로세스에 다른 프로세스들이 접근 가능한 메모리 공간을 할당한다
장점
- 중개자 없이 곧바로 메모리에 접근하기 때문에 가장 빠른 IPC 설비이다!
5. 메모리 맵
- 공유 메모리 처럼 메모리를 공유하지만!
- 열린 파일을 메모리에 매핑시켜 공유하는 방식
- 즉, 공유 매개체가 파일 & 메모리 인 형식
- 주로 대용량 데이터를 공유해야 할 때 사용함
6. 소켓
- 네트워크 소켓 통신을 통한 데이터 공유
- client - server 가 소켓을 통해 통신하는 구조
- 원격의 프로세스 간의 통신에 사용됨