본문 바로가기

TIL(Today I Learned)

[20230816 TIL] Multi-Threading 동시성, 동기화

*Process와 Thread란?
- Process에는 최소 한 개의 Thread가 존재한다.
- OS는 Virtual Mechine이라는 공간적 제약을 위임하는데 Process는 버주얼머신 안 공간적 제약 안에서 연산을 하게 된다.
-Process별로 할당되는 메모리 공간을 Thread local Storage라고 하는데 스레드별 스택 메모리로 쌓이는 공간이다.
메모리에는 스택메모리 외에 힙 메모리가 있는데 멀티 프로세스로 운영된다고 하면 각 프로세스당 VM이 할당하여 운영도 가능하다고 볼 수 있다.

*Blocking IO/Non-Blockimg IO

Process내에 멀티 쓰레드로 Task가 있을 때, Sync 거래의 경우는 File IO가 유저->커널->H/W 순으로 쓰여지고 return이 되겠지만, Aysnc 거래의 경우, IO request가 끝나기도 전에 처리가 끝날 수도 있고, 어느 시점에 완료가 되는지 알 수 없다. 그래서 notification을 할 수 있는 시점을 알아야한다.

그래서 대충 개발하는 개발자들은 sleep처리를 통해서 Async 거래의 응답 값을 자연스럽게 받도록 처리하는 경우도 있으나, 이건 우연에 맡긴 나쁜 코드다.

그래서 Procress별로 단계를 나눠서 특정 처리만 맡도록 하여 pending 현상이 일어나지 않게 하는 방법이 있는데 구성을 보면 우리가 흔히 쓰는 Chunk 배치와 유사하다.
대용량의 데이터를 읽은 처리를 하는 Task1, 영상처리를 하는 Task2, 완료된 건을 Socket 통신으로 보내는 Task3가 있을 수 있다. 보통 Socket통신은 Queue 자료구조로 처리된다.
배치작업의 경우는 위처럼 처리를 하겠지만, 온라인 거래의 경우는 IDE내에서 제공하는 트랜잭션 옵션 처리들을 활용하여 @aftercommit @ayncProcess 등을 사용하여 트랜잭션을 원활하게 관리 운영할 수 있다.

*멀티 스레딩 디버깅 방법

여러개의 쓰레드가 공유하는 변수는 volatile을 사용해야한다.
volatile을 사용하면 컴파일러는 프로그래머가 지시한 대로 메모리에 접근한다.
volatile이 없으면 컴파일러는 싱글쓰레드를 기준으로 프로그램을 최적화한다.

cf) 데드락 (Deadlocks)
멀티 쓰레드 환경에서 두 개 이상의 쓰레드가 서로가 갖고 있는 리소스를 기다리며 멈춰있는 상황을 데드락이라고 합니다. 브레이크포인트로 디버깅 중에 데드락이 발생하면 프로그램이 정지될 수 있습니다.