멀티 스레드의 동기화 문제

멀티 스레드는 프로세스 안에서 공유되는 하나의 자원을 여럿이 사용하다 보면 동기화 이슈가 생길 수 있음. 예를 들어 A 스레드와 B스레드가 동시에 자원을 가져와서 A는 1을 증가시키고 B도 1을 증가시키면 총 2가 증가해야 하나 1만 증가되버림.

이를 해결하기 위해선 동기화 과정이 필요함. 코드 레벨에서 동기화하는 처리가 필요함

https://m.blog.naver.com/PostView.nhn?blogId=sol9501&logNo=70104141478&proxyReferer=https:%2F%2Fwww.google.com%2F

데드락

데드락은 여러 프로세스가 자원을 점유 & 대기하는 게 순환형으로 꼬여서 교착상태에 걸린 것을 의미함.

데드락이 발생하는 조건으로

  1. 상호 배제 조건 : 하나의 자원은 하나만이 선점할 수 있음. 딴 친구는 못가져감
  2. 점유 대기 조건 : 프로세스는 자원을 점유하면서 다른 자원을 대기할 수 있음.
  3. 비선점 : 자원을 점유한 프로세스가 일 끝날 때까지 (혹은 IO 블락) 다른 프로세스가 점유 못함
  4. 순환형 : 상대바이 가진 자원을 서로 순환적으로 대기할 수 있음

그러면 이를 어떻게 극복할 수 있을까?

교착상태 무시 : 거의 발생 안할거라고 생각하고 사용자에게 맡김. 대표적으로 윈도우, 유닉스가 그럼

교착상태 예방 : 아예 발생 조건 중 한가지를 풀어서 예방하는 것. 그러나 그렇게 되면 자원을 효율적으로 사용하기가 어려워져서 비추

교착상태 회피 : 자원을 점유,대기할 때마다 교착상태인지 확인하는 회피 알고리즘을 돌림. 오버헤드 커서 비추

교착상태 탐지 및 복구 : 보통 탐지 & 복구 전략 사용함. 특정 시점(주기적, cpu 임계치, 자원 할당되는 시간 등)마다 교착상태를 탐지하고(그래프 그려서 확인) 만약 탐지되면 프로세스를 우선순위에 맞춰 죽이면서 상태를 복구시킴. 대표적으로 mysql도 transaction timeout이 나면 영향력이 작은(변경 row가 적은) 트랜잭션부터 종료시킴

파이썬