
💨 병렬처리와 스레드
나는 아직 운영체제 수업을 듣지 않았기 때문에, 컴퓨터 구조 시간에 배웠던 내용을 복기해보았다.
⭕ Program vs. Process vs. Thread

⭕ Multitasking
💡 한 processor가 여러개의 일을 동시에 하는 것
❗자원들은 task 간에 공유됨 (하나의 processor가 작업하기 때문)
❗task들 사이에 context switch가 필요함
❗ 장점 : 가벼운 프로그램들에 대해서는 속도 good! 😊
❗ 단점 : 무거운 프로그램들에 대해서는 속도 bad! 😡
⭕ MultiProcessing
💡 한 개 이상의 process들을 여러개의 processor(CPU)들로 동작시키는 것 (CPU가 여러개)
❗ 동시에 실행 (Parallel하게 동작)
*Parallel(병렬): 시간 사이에 interval을 두지 않고 동시에 실행시키는 것
❗ 장점 :
- 안정성 : 한 process가 비정상적으로 종료되어도 다른 프로세스에 영향을 주지 않음 😊
- 병렬성 : 한 process를 병렬적(parallel)으로 실행하여 성능 향상 😊
- 확장성 : 새로운 기능이나 모듈을 추가하거나 수정할 때 다른 process에 영향을 주지 않음 😊
❗ 단점 :
- Context switching overhead : context switching 과정에서 성능 저하 가능성 O 😡 (CPU는 다음 process 정보를 불러오기 위해 메모리 검색, CPU 캐시 메모리 초기화, process 상태 저장, 불러올 데이터 준비 과정을 차례로 거쳐야함)

⭕ MultiThreading
💡 하나의 processor에서 여러 개의 thread가 실행되는 것
❗ 동시성 (Concurrent)
*Concurrent(동시성): 2개 이상의 task 가 있을 때 서로 다른 task 의 실행 시점에 상관없이 task 실행이 가능
❗ 서로 다른 register와 stack에서 코드, 데이터, 파일 등을 공유
❗ 장점 :
- 응답성 : 프로그램의 일부 thread가 긴 작업을 수행하더라도 프로그램이 계속 수행됨 😊
- 경제성 : 프로세스 내 자원들과 메모리를 공유 😊
❗ 단점 :
- 동기화 문제 : 여러개의 thread가 공유 자원에 동시에 접근할 수 있기 때문 → 동기화가 필수적인데 병목현상이 일어나 성능 저하 가능 😡
- 안정성 문제 : 하나의 thread가 문제가 발생하면 다른 thread도 영향 O 😡
- 디버깅 문제 : 각 thread의 동작을 추적하기 bad 😡

⭕ Parallel vs. Concurrent
https://vagabond95.me/posts/concurrency_vs_parallelism/
💨 스레드 풀
⭕ Thread Pool
💡 미리 일정 개수의 쓰레드를 생성하여 관리하는 기법
❗ 서버는 동시 접속자가 많아지면 스레드가 무한대로 생성되면서 서버가 다운될 위험이 있기 때문에 시스템의 자원을 효율적으로 관리해야함
❗ 생성된 쓰레드들은 작업을 할당받기 위해 대기 상태에 있게 되는데, 작업이 발생하면 대기 중인 쓰레드 중 하나를 선택하여 작업을 수행, 작업이 완료되면 해당 스레드는 다시 대기 상태로 돌아가고, 새로운 작업을 할당받을 준비
❗ 장점 :
- 자원 효율성 : 쓰레드 풀은 미리 정해진 개수의 스레드를 생성하여 관리하기 때문에, 쓰레드 생성 및 삭제에 따른 오버헤드 줄일 수 있음 😊
- 응답성 및 처리량 향상 : 작업을 대기 상태로 유지하여 작업 처리 속도 향상 😊
- 작업 제어 : 동시에 처리할 수 있는 작업의 개수를 제한 😊
- 쓰레드 관리 : 쓰레드의 생명 주기를 관리 😊