[운영체제] 운영체제에서의 동기화

Kimseongeun·2022년 11월 16일
0

CS공부

목록 보기
9/9
post-thumbnail
post-custom-banner

✅동기화

병행 수행 중인 비동기적 프로세스들이 공유자원에 동시에 접근하게 된다면 문제가 발생할 수 있는데요, 이를 위해 필요한 것이 동기화입니다.

❌경쟁상태

여러 프로세스들이 동시에 데이터에 접근하는 상황에서, 어떤 순서로 데이터에 접근하느냐에 따라 결과 값이 달라질 수 있는 상황을 말합니다.

공유 데이터의 동시접근은 데이터의 불일치 문제를 발생시킬 수 있습니다.

따라서 경쟁상태를 막고 일관성을 유지하기 위해서는 협력 프로세스 간의 실행 순서를 정해주는 메커니즘인 동기화가 필요합니다.

  • 일어날 수 있는 경우
    • 커널모드로 수행 중 인터럽트가 발생하는 경우
    • 프로세스가 시스템 콜을 호출해서 커널모드로 수행 중인데 Context Switch가 발생하는 경우
    • 멀티 프로세서에서 공유메모리 내의 커널 데이터에 접근하는 경우

❌임계구역 (Critical Section)

코드 상에서 경쟁상태가 발생할 수 있는 특정 부분을 말합니다. 즉, 공유데이터를 접근하는 코드 부분을 말합니다.

  • 해결방법
    • 상호배제 : 한 프로세스가 임계영역에 들어갔을 때 다른 프로세스는 들어갈 수 없습니다.
    • 한정대기 : 특정 프로세스가 영원히 임계영역에 들어가지 못하면 안됩니다.
    • 진행 : Critical Section에서 작업 중인 프로세스가 없다면, Critical Section에 진입하고자 하는 프로세스가 존재하는 경우 진입할 수 있어야 한다.

이 세가지 조건들을 만족해야합니다.

이때 사용되는게 동기화 알고리즘이 있습니다

▶동기화 알고리즘

  1. 현재 임계구역에 들어갈 프로세스가 어떤 프로세스인지를 한 변수로 나타내어 일치하는 프로세스만 진입하도록 하는 단순한 방식입니다. 하지만 이 알고리즘은 상호배제는 만족하는데 progress는 만족하지 못합니다.

    • 예를 들어 한 프로세스가 remainder section 수행시간이 매우 길어서 여전히 remainder section에서 수행중이고, 두번째 프로세스가 수행을 한번 마치고 임계구역으로 진입하려고 할때 턴이 아직 오지 않아 진입할 수 없게 됩니다. 그렇게 임계구역에는 아무런 프로세스가 존재하지 않게 되죠.
  2. 특정 프로세스가 임계구역에 진입할 준비가 되었다는 것을 나타내는 변수를 두어, 다른 프로세스가 임계구역에 진입하려고 한다면 현재 프로세스는 기다리게하는 방법입니다. 근데 이것도 진행 조건을 만족하지 못합니다.

  3. **페테르송 알고리즘**

    • 1,2의 알고리즘을 합친 알고리즘입니다.
    • Pi 프로세스에 대해서, Pi는 flag[i] = true로 바꾸면서 Critical Section에 진입하려고 한다. 그리고 turn = j로 바꿔주면서 상대방이 들어가게 한다. 만약 상대방이 들어가고 싶고 (flag[j] == true), 현재 상대방이 Critical Section에 들어가 있으면 (turn == j) 기다린다. 그렇지 않으면 Pi가 들어간다.

    임계구역을 해결하는 모든 조건을 만족하지만 임계구역의 진입을 계속 기다리면서 CPU와 메모리를 사용하는 Busy Waiting의 문제점이 있습니다.

▶소프트웨어적으로 임계구역 해결하기

✔뮤텍스

뮤텍스는 공유자원을 사용하기 전에 설정하고 사용한 후에 해제하는 잠금입니다.

잠금이 설정되면 다른 스레드는 잠긴 코드 영역에 접근할 수 없습니다. 또한 뮤텍스는 하나의 상태만 가집니다.

✔세마포어

세마포어는 일반화된 뮤텍스입니다.

  • 간단한 정수 값과 두가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리합니다.
  • wait()는 자신의 차례가 올 때까지 기다리는 함수이며, signal()은 다음 프로세스로 순서를 넘겨주는 함수입니다.

즉, 프로세스가 공유자원에 접근하면 세마포어에서 wait()작업을 수행하고 프로세스가 공유자원을 해제하면 세마포어에서 signal()작업을 수행합니다.

세마포어에는 조건 변수가 없고 프로세스가 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없습니다.

✔모니터

모니터는 둘 이상의 스레드나 프로세스가 공유자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 대해 인터페이스만 제공합니다.

모니터세마포어보다 구현하기 쉬우며 모니터에서 상호배제는 자동인 반면에, 세마포어에서는 상호 배제를 명시적으로 구현해야한다는 차이가 있습니다.

❌고전 동기화 문제

✔식사하는 철학자들 문제

테이블에 앉은 철학자는 자신의 양쪽에 놓인 수저를 집어야 식사가 가능하다. 근데 만약 동시에 자신의 왼쪽에 있는 수저를 잡는다면? 모두가 아무것도 할 수 없는 deadlock 교착상태가 발생한다.

  • 세마포 해결안
    • 최대 4명의 철학자만이 테이블에 앉을 수 있도록 한다.
    • 한 철학자가 젓가락 두 개를 모두 집을 수 있을 때만 젓가락을 집도록 허용한다. (임계구역 안에서만 젓가락을 집을 수 있다.)
    • 홀수 번호의 철학자는 왼쪽 젓가락을 먼저 집고 다음에 오른쪽 젓가락을 집는다. 짝수는 반대로 한다. 이를 비대칭 해결안 이라고 한다.
**교착 상태를 해결한다고 해서 기아 상태를 해결하는 것은 아님을 주의하자.**
profile
김성은입니다.
post-custom-banner

0개의 댓글