-
[TIL] 스파르타) CS 강의 수강 (Thread)TIL-sparta 2024. 4. 29. 20:56
> 4강. Thread
--
학습 키워드: thread, thread pool, multiprocessing, multithreading
1. Thread
- 프로세스의 흐름 단위이며, 한 개의 프로세스에는 한 개 이상의 쓰레드가 존재한다.
- 프로세스의 생성에는 시간이 많이 들고, context switching이 일어날 때는 캐시 메모리가 초기화 되는 등 효율이 좋지 않아 그 상황 자체로 overhead 로 취급된다. 이에 반해 쓰레드의 context switching은 간단한 정보의 스위칭만 이루어져서 가볍고 효율이 좋다.
- 프로세스는 기본적으로 다른 프로세스와 정보를 공유할 수 없지만 (Inter-process Communication, IPC라는 무거운 방식을 사용하여 한정적으로 가능), 쓰레드의 경우 프로세스에게서 Stack만 할당 받고 나머지 여러 자원 (Code, Data, Heap 영역) 을 서로 공유하기 때문에 여러 개의 쓰레드가 Heap 영역을 동시에 수정할 수 있게 된다.
- 쓰레드의 주요 구성 요소로는 program counter, stack space, register set 이 있다.
2. Multiprocessing and Multithreading
1) What is it?:
- 멀티 프로세싱: 하나의 프로그램을 여러 개의 프로세스가 처리하는 것으로, 위에서 언급한 독립성과 상호 통신의 어려움등으로 인해 context switching이 자주 발생하는 상황에서는 효율이 좋지 못하다. sub-process 하나가 다운되더라도 나머지 sub-process 들에게 영향을 주지 않는다.
- 멀티 쓰레딩: 여러 개의 쓰레드가 한 개의 프로세스에서 작업을 처리하는 것으로, 자원 소모 효율과 작업 처리량 및 속도가 비약적으로 상승하지만, 하나의 데이터를 같이 수정하기 때문에 디버깅이 어렵고, 전역 변수를 공유하기 때문에 간혹 데이터의 동기화 문제가 발생하거나, 다른 쓰레드와 서로 작업 처리 종료를 대기하는 상태가 되는 이른바 '교착 상태'에 빠질 수도 있다. 이러한 불상사를 대비해 thread safety를 신경 써야한다. 멀티 프로세싱과는 다르게 하나의 쓰레드에서 문제가 생길 시 전체 프로세스에 영향이 미친다.
- 무수한 단점에도 불구하고 멀티 쓰레딩이 주는 이점이 강력하기 때문에 멀티 프로세싱보다 많이 사용된다.
2) Concurrency와 Parallelism:
- Concurrency (동시성): 싱글 코어의 CPU가 multithreading을 동작시키는 방식인데, 겉보기에는 동시에 진행하는 것 처럼 보이지만 실제로는 여러개의 쓰레드가 번갈아가면서 작업을 실행하는 형태라고 한다.
- Parallelism (병렬성): 멀티 코어의 CPU에서 동시에 쓰레드 작업이 이루어지는 형태다. 데이터를 여러개로 쪼개어 병렬처리하는 데이터 병렬과 작업을 여러개로 나누어 병렬 처리하는 작업 병렬로 나뉜다. 작업 병렬의 경우 다수의 브라우저 요청을 병렬 처리하는 웹 서버가 대표적이다.
3. Thread pool
1) Thread pool?:
- 말 그대로 쓰레드를 풀링해두고 사용하는 개념인데, 쓰레드 풀에 몇 개의 쓰레드를 미리 할당해두고, 작업 큐의 작업들을 풀의 쓰레드들이 하나씩 처리하도록 하는 것을 말한다.
- 쓰레드의 생성이 아무리 빠르다고 해도 생성과 제거를 반복하는 것은 여러 면에서 효율이 떨어지기 때문에 미리 풀링하여 사용한다.
- 많은 규모의 I/O 작업이 일어나는 데이터베이스 작업 등에서 발생하는 병목현상을 줄이는 등 다수의 사용자 요청을 처리하는 작업에 주로 사용된다.
- 너무 많은 쓰레드를 풀링해두고 사용하지 않으면 자원의 낭비가 발생한다.
- Java에서는 위의 단점을 커버하는 Fork Join Thread Pool 이라는 방식이 존재한다. 이해한대로 설명하자면, 작업을 여러 개의 소규모 단위로 나누고 (fork) 결과 값들을 재귀적으로 다시 취합하는 (join) 프레임 워크를 기반으로 하는 쓰레드 풀 방식이다. 여기서 work-stealing algorithm 이 작용하는데, worker(쓰레드 풀의 쓰레드)는 일반적으로 자신의 deque에서 head에 해당하는 작업을 빼와 진행하지만, 작업이 없을 때 쓰레드 풀 내에서 다른 바쁜 worker를 찾아 deque의 tail에 위치한 작업을 훔쳐가서 작업하는 알고리즘이라고 한다. 여러 이점이 있는 형태라고 하니 나중에 쓰레드를 사용하는 일이 생기게 되면 더욱 디테일하게 조사해 봐야겠다.
2) Thread pool의 동작 순서:
- 쓰레드 풀의 initialization (크기와 쓰레드 수, 작업 큐 등의 변수 설정)이 이루어지면 쓰레드 풀의 작업 큐에서의 작업 수신 (Queue 이므로 FIFO)이 시작됩니다.
- 쓰레드 풀의 쓰레드들이 무한 루프를 돌며 작업 큐를 모니터링하고, 작업을 가져와서 처리하고 반환합니다. 이후 다시 작업 큐를 모니터링하는 대기 상태에 돌입합니다.
- 쓰레드 풀이 더이상 사용되지 않으면 남아있는 작업이 있는지 확인하고 마저 처리하거나 드랍합니다.
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] 스파르타) Project3 시작 (TMDB 팀 과제), Github Issues (2) 2024.05.01 [TIL] 스파르타) CS 강의 수강 (DB, DBMS) (0) 2024.04.30 [TIL] 스파르타) CS 강의 수강 (Process) (0) 2024.04.28 [TIL] 스파르타) CS 강의 수강 (CPU와 메모리) (0) 2024.04.27 [TIL] 스파르타) JS 개인 과제 피드백 확인 및 수정, Github Release, Semantic Versioning (0) 2024.04.26