컴퓨터과학/운영체제

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

PureStack 2021. 11. 30. 17:34

스레드의 동기화 문제

스레드들은 서로 Stack 영역을 제외하고 나머지 Code 영역, Heap 영역, 그리고 Data 영역을 공유하고 있다. 따라서 이러한 공유 자원에 여러 스레드가 동시에 접근하면 Race Condition 같은 상황이 발생할 수 있다. 따라서 이를 막기 위해서 동기화 기법이 필요하다.

스레드의 동기화

  1. 실행 순서의 동기화: 스레드의 실행 순서를 정의하고, 반드시 이 순서를 따르도록 한다.
  2. 메모리 접근에 대한 동기화: 메모리 접근에 있어 동시 접근을 막으며, 실행 순서가 중요한 것이 아니면 한 순간에 하나의 스레드만 해당 자원에 접근 가능하도록 설계한다.

동기화 기법

  • 유저 모드의 동기화
    • 커널의 힘을 빌리지 않는 동기화 기법, 즉 커널의 코드가 실행되지 않는다.
    • 동기화를 위한 커널 모드로의 전환이 불필요하여 성능상의 이점이 있지만 그만큼 기능상의 제한도 존재한다.
    • 해당 동기화의 종류로는 임계 구역 기반의 동기화, 인터락 함수 기반의 동기화가 있다.
  • 커널 모드의 동기화
    • 커널에서 제공하는 동기화 기능을 활용하는 방법이다.
    • 동기화와 관련된 함수 호출 때마다 커널 모드로의 변경이 필요하고, 이는 성능의 저하로 이어진다. 하지만 그만큼 다양한 기능을 활용할 수 있다.
    • 해당 동기화의 종류로는 세마포어, 뮤텍스, 모니터 등등이 있다.

임계 구역

  • 둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 자원을 접근하려는 코드의 일부를 의미한다.
  • 임계 영역에서 동기화를 진행하지 못하면 해당 공유 자원이 왜곡되는 치명적인 문제가 발생할 수 있다.
  • 임계 구역 문제를 해결하기 위해 3가지 필수 조건이 있다.
    1. 상호 배제(Mutual exclusion) : 특정 프로세스 P1이 공유 자원에 접근하는 임계 구역의 코드를 수행하고 있으면 다른 프로세스들은 공유 자원에 접근하는 임계 구역 코드를 수행할 수 없다. 다시 말해서, 한 순간에 하나의 스레드만 실행 가능하다.
    2. 진행(Progress): 임계 구역에서 실행중인 프로세스가 없고 별도의 동작이 없는 프로세스들만 임계 구역 진입 후보로서 참여 가능하다.
    3. 한정된 대기(Bounded Waiting) : 특정 프로세스 P1이 임계 구역에 진입하려는 요청을 한 이후 그 요청이 허용될 때까지 다른 프로세스들이 임계 구역에 진입하도록 허용하는 횟수는 제한이 있어야 한다. 즉, 기아(starvation)가 발생하지 않도록 모든 프로세스가 임계 구역에 진입할 수 있다는 보장을 해줘야 한다.