CS/OS

[운영체제] 스레드 동기화

seulll 2024. 12. 7. 15:13

스레드 동기화

  • 다수의 스레드가 공유 데이터를 동시에 접근할 때 공유 데이터가 훼손되지 않게 스레드의 실행을 제어하는 기법
  • 한 스레드가 공유 데이터 사용을 마칠 때까지 다른 스레드가 공유 데이터에 접근하지 못하도록 제어

‣ 임계구역과 상호배제

  • 임계구역 : 공유 데이터에 접근하는 프로그램 코드들
  • 상호배제 : 임계구역에 먼저 진입한 스레드가 임계구역의 실행을 끝낼 때까지, 다른 스레드가 진입하지 못하도록 보장

상호배제 구현 요구조건

  1. 상호배제가 강제되어야 함
  2. 임계구역에 접근하고자 하는 스레드의 수행이 무한히 미루어져서는 안 됨
  3. 임계구역이 비어 있을 때, 임계구역에 진입하려고 하는 스레드는 즉시 임계구역에 들어갈 수 있어야 함
  4. 일반 코드에서 수행이 멈춘 스레드는 다른 스레드의 수행을 간섭해서는 안 됨
  5. 스레드 개수나 상대적인 스레드 수행 속도에 대한 가정은 없어야 함
  6. 임계구역에 들어간 스레드는 일정한 시간 내에 임계구역에서 나와야만 함

‣ Lock 변수를 이용한 상호배제 시도
entry 코드: 임계구역에 진입할 때 lock 변수 값을 검사하여 0인 경우 1로 만든 후 진입 → 잠김  
  · Lock 변수 값이 1인 경우, 대기함(spin-waiting, busy-waiting)  
exit 코드: 임계구역에서 나올 때 lock 변수를 0으로 만듦 → 열림

 

‣ lock 변수를 사용한 상호배제의 실패

  • 갱신되는 공유 변수인 lock 변수 값을 읽는 명령과 lock 변수에 1을  저장하는 2개의 명령 사이에서 컨텍스트 스위칭이 될 때 문제 발생

해결책 : 원자적 명령 사용

  • 원자적 명령: 같은 메모리 위치에 대한 읽기와 쓰기 또는 읽기와 테스트를 하나의 명령 인출 사이클 동안 처리하는 기계 명령 / TSL(Test and Set Lock)

 

운영체제 지원 멀티스레드 동기화 기법

· lock 방식 : 뮤텍스(mutex), 스핀lock(spinlock)

· wait-signal 방식 : 세마포어(semaphore)

 

 

1. 뮤텍스

· 잠김/열림 중 한 상태를 가지는 lock 변수 이용  
· lock을 소유한 스레드만 임계구역에 진입시킴  
· 진입을 시도하는 다른 스레드는 큐에 대기: sleep-waiting lock 기법

  • 구성요소 : lock변수, 대기 큐, 연산
  • 임계구역의 실행시간이 짧은 경우 비효율적

2. spinlock

  • busy-waiting lock 기법
    · 스레드가 큐에서 대기하지 않고 lock이 열릴 때까지 계속 lock 변수 검사
    · 뮤텍스와 거의 같고 busy-waiting이라는 점에서만 다름
    · 대기 큐 없음
    · busy-waiting으로 인해 처리기를 계속 소모, 처리기가 다른 스레드를 실행할 수 없음
  • lock을 소유한 스레드만 자원 배타적 사용 · 공유 자원 하나 당 하나의 spinlock 사용
  • 단일처리기 시스템에서 비효율적 / 멀티처리기 시스템에서 적합
  • 임계구역의 실행시간이 짧은 경우 효과적

 

3. 세마포어

  • n개의 공유 자원을 멀티스레드가 공유하여 사용하도록 돕는 운영체제가 제공하는 자원 관리 기법
  • 구성요소 : 자원, 대기 큐, counter 변수
  • 세마포어 연산
    1. P 연산 (wait 연산): 자원 요청 시 실행하는 연산,  자원 사용 허가를 얻는 과정  
    2. V 연산 (signal 연산): 자원 반환 시 실행하는 연산, 자원 사용이 끝났음을 알리는 과정