Process vs Thread
✨ 감명깊게 본 영상
[10분 테코톡] 🌷 코다의 Process vs Thread
🚀 잘 정리된 자료 링크
[OS] 프로세스와 스레드의 차이 - Heee's Development Blog
Process vs Thread
Program 이란?
그저 실행가능한 코드가 구현된 파일
이것이 실행되기 위해서는 메모리에 적재되어야 합니다.
이렇게 메모리에 적재되어 실행되고 있는 프로그램을 프로세스(Process)라고 합니다.
🚗 Process
- 실행파일(program)이 memory에 적재되어 CPU를 할당받아 실행되는 것을 process라고 합니다.
- 운영체제로부터 자원을 할당 받아 실행되는 작업의 단위 입니다. (메모리의 독립된 영역인
Code
, Data
, Stack
, Heap
을 각각 할당 받습니다.)
- 하나의 프로세스는 다른 프로세스의 자원에 접근이 불가능 합니다.
- 하나의 프로세스는 최소 하나 이상의 스레드(Thread)를 가집니다.
🛞 Thread
- 프로세스 내에서 실행되는 실행 단위이고 독립적인 기능을 수행합니다.
- 프로세스의
Code
, Data
, Heap
을 영역을 공유하고, Stack
만 따로 할당받아 실행됩니다.
💡 메모리 영역
- Code : 실행 명령을 포함하는 코드들
- Data : static 변수
- Heap : 동적 메모리 영역
- Stack : 지역변수, 매개변수, 반환값 등의 일시적인 데이터
Multi Process vs Multi Thread
Multi Process
🤔 2개의 Process가 실행된다면? (슬랙, 크롬)
Slack 실행 → Slack 멈춤 → Chrome 실행 → Chrome 멈춤 → Slack 실행...
→ CPU는 한번에 하나의 프로세스만 실행가능!
→ 이렇게 반복하지만 사용자 입장에서는 동시에 실행하는 것처럼 보임.
→ 이렇게 여러 프로세스가 돌아가면서 작업을 처리하는 것을 Context Switcing 이라고 합니다.
✨ Context Switcing
- Context란? 이전에 어디까지 명령을 수행했고, register에는 어떤 값이 저장되어 있었는지 정보가 필요합니다.
process가 현재 어떤 상태로 수행되고 있었는지에 대한 총체적인 정보가 바로 context입니다.
context 정보는 PCB(Process Control Block)에 저장을 합니다.
- PCB(Process Control Block)
- 운영 체제(kernel : 하나의 프로세스)가 프로세스를 표현한 자료구조
- 커널??
- 하나의 프로세스
- 운영체제의 프로세스가 돌아갈 때도, 어떤 정보들이나 코드들이 메모리에 올라가야 프로세스가 실행된다.
- 커널 영역은 항상 컴퓨터를 켜는 그 순간부터 메모리에 적재되어 실행이 된다!
- 프로세스의 중요한 정보가 포함되어 있음 → 일반 사용자가 접근하지 못하도록 보호된 메모리 영역 안에 저장
- 일부 운영체제 에서는 PCB는 커널 스택에 위치
- 이 메모리 영역은 보호 받으면서도 비교적 접근이 용이
- 어떤 정보가 있을까?
- Process State
- 이 프로세스가 실행되고 있는지? 멈춰 있는지? 등
- new, running, waiting, halted 등
- Process Number
- Program counter(PC)
- Registers
- Memory limits
- ...
- Context Switch
- 한 프로세스가 다른 프로세스로 CPU 제어권을 넘겨주는 것.
- 이 때, 이전의 프로세스 상태를 PCB에 보관하고 새로운 프로세스의 PCB를 읽어서 보관된 상태를 복구하는 작업이 이루어진다.
🧨 Multi Process의 단점은?
- Context Switching = 무거운 작업
- 캐시 메모리 초기화 등으로 매우 느림! (다른 프로세스를 시작 할때, 메모리영역도 완전히 달라지고 많은 것들을 교체를 해야 되서 느림!)
⚡️ Multi Process의 장점은?
- 하나의 Process가 죽더라도 다른 Process에 영향을 주지 않아 안정성이 높다!
- 메모리 구분이 필요할 때는 Multi Process가 유리하다.
🤔 Process간의 통신(IPC : Inter-Process Communication)
Process는 자신만의 독립적인 주소공간을 가지고, 다른 Process가 참조하는것을 허용하지 않습니다.
(→ 다른 Process와 데이터를 주고 받을 수 없다!)
이를 해결하기 위해 IPC기법을 사용합니다.
⚡️ 공유 메모리(shared memory) & 메시지 전달(message passing)
- 공유 메모리(shared memory)
- process가 공유 메모리를 할당을 kernal에 요청하면 process 메모리 공간을 할당해줍니다.
- 각 process들이 할당받은 메모리 영역을 접근(read/write)할 수 있습니다.
- 한번 할당을 받은 후에 커널의 관여 없이 통신할 수 있으므로 속도가 빠릅니다!
- 하지만 동시에 같은 메모리 위치에 접근하면서 생기는 일관성 문제가 있습니다. → process들이 직접 공유 메모리 접근에 대한 동기화 문제를 책임져야 합니다.
- ex) POSIX
- 메시지 전달(message passing)
- system call을 사용되어 구현됩니다.
- 커널을 통해 send & receive 두가지 연산을 제공받아 사용합니다.
- 공유메모리 보다는 속도가 느리지만, 충돌을 회피할 필요가 없기 때문에 데이터 교환에 유용!
- 구현하기가 쉽다.
- ex) socket, pipe, message queue 등
Multi Thread
- 하나의 프로세스에서 여러개의 Thread로 나누어 각각 작업을 처리하도록 하는 것
- 캐시 메모리를 초기화할 필요가 없어 빠르다!
- 스레드 사이의 작업량이 작아서 Context Switcing이 빠르다!
- 독립적인
Stack Memory
와 PC Register
가 필요하다.
Stack Memory & PC register
- Thread가 함수를 호출 시 전달되는 인자, Return Address, 함수 내의 지역변수 등 독립적인 Memory가 필요! 즉슨, 각각의 Thread가 Process내에서 “독립적인 기능을 실행한다 == 독립적으로 함수를 호출한다” 를 의미합니다. 나머지 Code, Data, Heap 영역은 공유하는 형태.
- 한 프로세스 내에서도 thread끼리 Context Switch가 일어나게 되는데, PC register에 code address가 저장되어 있어야 실행할 수 있기 때문!
🧨 Multi Thread의 단점은?
- 하나의 스레드가 문제가 생기면 전체 프로세스가 영향을 받는다! (웹에서 여러 탭이 사용 중에 하나의 탭에 문제가 생겼을 시 전부 종료된다.)
- 동기화 문제! 서로 다른 thread가 메모리 영역을 공유하기 때문에, 여러 thread에서 동일한 자원에 동시에 접근하여 엉뚱한 값을 읽거나 수정하는 문제
→ 프로그램 설계 시 주의가 필요!
⚡️ Multi Process의 장점은?
- 메모리 공간과 시스템 자원 소모가 줄어듭니다.
- Process를 생성하고 자원을 할당하는 등 system call을 생략할 수 있기 때문에 자원을 효율적으로 관리
- Context Switching 시, 캐시 메모리 초기화 필요가 없어 속도 빠름!
- process 간의 통신(IPC)보다 통신 비용이 적음 == 오버헤드가 적다!