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

2024. 12. 7. 15:13·OS

스레드 동기화

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

‣ 임계구역과 상호배제

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

상호배제 구현 요구조건

  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 연산): 자원 반환 시 실행하는 연산, 자원 사용이 끝났음을 알리는 과정

'OS' 카테고리의 다른 글

캐시(Cache) 설계 전략  (1) 2025.07.31
[Linux] 리눅스 사용자 권한과 chmod 명령어  (0) 2025.03.09
[운영체제] 가상 메모리  (1) 2024.12.15
[운영체제] 컴퓨터 시스템 계층 구조  (3) 2024.09.30
'OS' 카테고리의 다른 글
  • 캐시(Cache) 설계 전략
  • [Linux] 리눅스 사용자 권한과 chmod 명령어
  • [운영체제] 가상 메모리
  • [운영체제] 컴퓨터 시스템 계층 구조
seulll
seulll
개인 공부 블로그입니다.
  • seulll
    seulll
    seulll
  • 전체
    오늘
    어제
  • Seuli's Github
    • 분류 전체보기 (405)
      • Coding Test (262)
        • Programmers (165)
        • Baekjoon (95)
      • Data Structures & Algorithm.. (15)
      • Development & Projects (20)
        • Python (5)
        • Java (15)
        • Android (5)
        • AI (6)
        • Unity (3)
        • API (5)
      • OS (5)
      • DB | SQL (10)
      • Network (8)
      • Data Analysis (14)
      • Study | etc (22)
  • 블로그 메뉴

    • 홈
    • 태그
    • 글쓰기
    • 설정
  • 공지사항

  • 인기 글

  • 태그

    train_test_split
    데이터분석
    프로그래머스
    Python
    asterisk
    티스토리챌린지
    API
    백엔드 개발자 역량
    Boxplot
    코딩테스트
    야근 지수
    오차행렬
    웹크롤링
    그리디 알고리즘
    카카오맵 api
    모델 성능 평가
    프렌즈4블록
    kakao map api
    백엔드 개발자
    solving environment
    Greedy
    대입 표현식
    백엔드
    박스플롯
    2 x n 타일링
    confusion matrix
    카카오맵
    바다코끼리
    오블완
    파이썬
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
seulll
[운영체제] 스레드 동기화
상단으로

티스토리툴바