본문 바로가기
  • 시 쓰는 개발자
1일 1개념정리 (24년 8월~)/운영체제

1일1개 (27) - 동시성 문제

by poetDeveloper 2024. 9. 6.
반응형

1일 1개념정리 24.08.09.금 ~ 

 

큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.

무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!


#27. 동시성 문제

동시성 문제란, 영화관이나 비행기 예매시 동시에 요청이 들어갈 때 이를 어떻게 처리하는가에 대한 문제이다. 프로세스와 스레드에 대한 이야기도 나오니까 다음 포스팅도 참고해보자 !! 

https://100won-developer.tistory.com/entry/1%EC%9D%BC1%EA%B0%9C-3-%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4

 

1일1개 (3) - 멀티 프로세스

1일 1개념정리 24.08.09.금 ~  큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!#3. 멀티 프로세

100won-developer.tistory.com

 

동시성 문제

여러 스레드나 프로세스가 동시에 동일한 자원에 접근하거나, 자원을 공유할 때 발생하는 문제이다. 보통은 데드락을 예시로 든다.

 

1. 데드락 (Deadlock)

A : 1을 소유하고 있고 2를 기다림

B : 2를 소유하고 있고 1을 기다림

→ 그냥 평생 서로 기다리고만 있음 (배고픈 철학자 문제 Dining philosophers problem)


2. 
경쟁 상태 (Race Condition)

여러 스레드가 동시에 같은 자원에 접근할 때, 자원의 값을 변경하려는 순서가 불확실해 예상치 못한 결과가 나오는 경우이다. 다음 은행 예시를 보자.

  1. 현재 잔액 : 100만원
  2. 프로세스 A에서 50만원 입금 , B에선 30만원 인출하려고 함.
  3. 두 프로세스가 동시에 잔액을 읽고 100만원인 것을 확인함.
  4. 프로세스 A에서는 입금해서 150만원으로 작업 마치는데 이때 동시에 B에서는 인출하여 70만원으로 작업 마침.
  5. 잠시 뒤 확인해보면 잔액이 70만원으로 찍힘.

→ 입금할 땐 인출하려는 접근을 막아야한다.(Lock) 또는 트랜잭션으로 설정하여 입금 트랜잭션이 완료될 때까지는 다른 트랜잭션에 의한 읽기 쓰기를 막는다.

 

3. 기아 상태 (Starvation)

어떤 스레드가 자원에 대한 접근 기회를 계속 얻지 못해 작업이 무한정 지연되는 상태이다. 예를 들어 어떤 프로세스가 우선순위 10인데 계속 우선순위 1, 2, 1, 2, 3 이렇게 들어오면 10인 프로세스는 계속 굶고있다.... 마치 코테와 자소서에 밀려서 영어공부와 운동을 하지 않는 나처럼..................

 

동시성 문제가 왜 생기는가 ?

아니 애당초 0.000001초까지 따져서 더 빨리 요청한 사람을 우선하면 되는 거 아닌가 ?? 그리고 요청에 따라 순서가 다 정해질텐데 그냥 앞선 사람을 영화 예매 하면 되는데 왜 이게 문제일까 ?? 단순 시간만으로 해결할 수 있는 문제가 아니기 때문이다.... 네트워크 지연, 서버 처리, 트랜잭션 관리, 병렬 처리 등 여러 요인이 개입하므로 이 문제를 처리하기가 굉장히 어렵다. 

그리고 단순히 스택에 요청을 넣는 게 아니고, 각 요청을 스레드가 처리하는데 이때 스케줄링, 지연, 여러 요인으로 인해 순서가 달라질 수 있다. 0.000001초까지 구분한다고 해도 처리 순서는 달라질 수 있다는 것이다.

그리고 이렇게까지 극도로 비슷한 시간대의 요청을 구분해서 처리하는 것은 실시간 시스템에서나 가능하며, 우리가 이야기하는 비행기 좌석이나 수강신청 이런거는 실시간 처리보단 안정성에 더 중점을 둘다. 그래서 DB 트랜잭션 무결성 관리 이런 것이 더 중요하다고 한다.

 

해결법

  • Lock : 공유자원에 대해서는 작업할 때 접근을 막고, 작업이 끝나면 잠금을 해제한다. 마치 식당 화장실 쓸 때 잠그고 보는 것과 같다. (교수님이 알려주심) 앞서 은행 예시를 봐도 그렇다. 입금할 땐 Lock, 입금 완료되면 해제. 그럼 이제 다시 인출이 가능. 이런식이다.
  • 트랜잭션 이용 : 트랜잭션으로 묶으면 ACID를 보장하므로 동시에 실행되더라도 데이터의 무결성이 보장된다.
  • 스레드 풀 (Thread Pool) : 생성되는 스레드의 수를 제한해 자원 사용을 조절한다.

보니깐 Lock이랑 트랜잭션으로 묶어서 처리하는 게 핵심인듯하다 !

반응형