OS

운영체제의 이해 9장: 프로세스 간의 동기화 (2023.05.25)

hail2y 2026. 3. 13. 02:37

공유 메모리나 프로세스들 간 공유하고 있는 데이터 등은 내용이 변경되는 작업이 수시로 이루어진다. 이 과정에서 데이터가 예상치 못한 내용으로 변경되었을 때 공유 데이터의 일관성이 유지되지 못한다고 말한다. 공유 데이터의 일관성을 유지하기 위해 프로세스들 간에 실행순서를 적절히 유지하도록 하는 동기화를 해 준다. 변수의 값을 변경하는 간단한 작업에도 이 문제를 확인할 수 있는데, 이것은 CPU가 하나의 명령어로 처리할 수 없기 때문에 여러 개의 명령어를 사용하면서 문제가 발생한 것이다. 운영체제 커널 내부에서도 문제가 발생하는데, 먼저 시스템 콜 함수의 호출로 커널 데이터를 수정하는데 문맥교환이 되면서 이 프로세스가 같은 시스템 콜 함수를 요청하며 커널 데이터를 수정하는 경우다. 또는 커널 데이터를 수정하는 중에 인터럽트 신호가 오면서 그 인터럽트 처리 루틴에서도 같은 데이터를 변경할 때 발생한다.
  이처럼 프로그램에서 프로세스들 간의 공유 데이터 코드 부분을 크리티컬 섹션이라고 부른다. 이를 해결하기 위해서는 상호 배제의 조건을 만족시키도록 한다. 이는 크리티컬 섹션 부분을 실행하기 전에 적절한 허가를 받는 과정을 통해 동시에 접근하는 것을 막는다. 구체적으로 실행 전에는 적절한 허가를 받고 또 실행 후에는 허가를 반납한다. 이외에도 크리티컬 섹션을 아무도 사용하지 않는다면 실행할 수 있도록 해주는 진행과, 일정한 시간 내에 크리티컬 섹션을 실행할 기회를 주는 제한된 대기시간이 있다. 이를 위해 인터럽트 금지, 스핀락, 뮤텍스와 세마포 처리, 그리고 프로그래밍 언어 차원에서의 크리티컬 리젼과 모니터 등의 방법이 있다.

  인터럽트 금지를 이용한 방법은 간단하게 구현할 수 있다는 장점이 있지만 멀티 프로세서에서는 이 방식을 적용할 수 없다. 프로세스 간 문맥교환은 시스템 콜 함수나 하드웨어 인터럽트를 통해 이루어지는데 이 둘을 경계해야 한다고 할 때, 무엇보다도 크리티컬 섹션의 실행시간이 길 경우 하드웨어 인터럽트도 제때 처리하지 못하고 문맥교환이 안 된다는 단점이 있다. 이를 다시 말하면 해당 섹션과 전혀 상관없는 프로세스들도 실행될 수 없다는 것이다. 따라서 시스템 모드에서 작동되는 커널 내부의 짧은 크리티컬 섹션을 위해서만 사용된다.

  스핀 락은 lock 변수를 위한 메모리 영역을 확보하고 lock함수와 unlock함수를 호출한다. 비지웨이팅이라는 특정한 조건이 만족될 때까지 기다리는 과정에서 쉬지 않고 조건을 계속 검사하는 과정이 수반된다. 그렇게 되면 CPU의 자원이 낭비될 수 있지만 멀티 프로세서 시스템에서는 내부적으로 짧은 크리티컬 섹션들에 한해 유용하게 사용될 수 있다.

  뮤텍스도 lock, unlock함수를 사용하지만 비지 웨이팅은 적용하지 않는다. 대신 lock함수에서 조건이 만족되지 않는다면 호출한 프로세스를 대기 상태로 전환하고, unlock함수에선 대기 상태의 프로세스들을 모두 깨워 주는 방식을 사용한다. 세마포는 정수값을 가지며 wait, signal의 두 가지 동작만 적용 가능한 객체로 정의된다. 세마포는 크리티컬 섹션 뿐만 아니라 유한버퍼 문제와 같이 여러 가지 동기화 문제에 범용으로 사용된다.