-
[OS] 프로세스 동기화운영체제 2023. 4. 1. 13:24728x90반응형
프로세스 동기화동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해 서로 협력하며 영향을 주고 받기도 합니다. 이렇게 협력하여 실행되는 프로세스들을 실행 순서와 자원의 일관성을 보장해야 하기에 반드시 동기화(synchronization)되어야 합니다.
오늘은 동기화의 개념에 대해 알아보고, 프로세스를 동기화하지 않을 경우 발생할 수 있는 문제들을 통해 동기화가 필요한 이유를 알아볼거예요 🧐
동기화의 의미프로세스 동기화란 프로세스들 사이의 수행 시기를 맞추는 것을 말합니다. 여기서 수행 시기를 맞춘다는 것의 의미는 크게 아래 두 가지를 나타냅니다.
- 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기
- 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
🍊 실행 순서 제어를 위한 동기화
예를 들어 writer라는 프로세스와 reader라는 프로세스가 동시에 실행 중이라고 가정해봅니다.
writer 프로세스는 book.txt 파일에 값을 저장하는 프로세스이고, reader 프로세스는 book.txt 파일에 저장된 값을 읽어 들이는 프로세스입니다.
여기서 reader 프로세스는 'book.txt 안에 값이 존재한다‘는 특정 조건이 만족되어야만 실행을 이어나갈 수 있습니다. 이렇게 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것을 보고 실행 순서 제어를 위한 동기화라고 합니다.🍊 상호 배제를 위한 동기화
상호 배제(mutual exclusion)는 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘입니다.
예를 들어 계좌에 10만원이 있다고 가정했을 때 프로세스 A는 현재 잔고에 2만원을 넣는 프로세스, 프로세스 B는 현재 잔고에 5만원을 넣는 프로세스입니다. 여기서 동기화가 제대로 이루어진다면 프로세스 A, B가 이루어진 후 결과는 17만원이 됩니다. 반면 동기화가 제대로 이루어지지 않는다면 15만원이 되는 엉뚱한 결과가 나올 수 있습니다.
이처럼 동시에 접근해서는 안되는 자원에 동시에 접근하지 못하게 하는 것이 상호 배제를 위한 동기화입니다.
생산자와 소비자 문제생상자와 소비자 문제는 상호 배제를 위한 동기화에 관한 고전적이고 유명한 문제입니다.
생산자와 소비자는 ‘총합’이라는 데이터를 공유하고 있습니다.생산자 함수
생산자 () { 버퍼에 데이터 삽입 ‘총합’ 변수 1 증가 }
생산자는 버퍼에 물건을 넣은 후, 총합 변수를 1 증가시킵니다.
소비자 함수
소비자 () { 버퍼에서 데이터 빼내기 ‘총합’ 변수 1 감소 }
소비자는 버퍼에서 물건을 빼낸 후 총합 변수를 1 감소시킵니다.
물건이 처음에 10개가 있었다고 가정을 해볼게요총합 = 10 생산자() { 버퍼에 데이터 삽입 ‘총합’ 변수 1 증가 } 소비자() { 버퍼에서 데이터 빼내기 ‘총합’ 변수 1 감소 }
위와 같은 상태에서 생산자를 100,000번, 소비자를 100,000번 동시에 실행해 보았을 때 결과는 어떻게 될까요? 총합 변수가 계속 10개로 머물러 있을 것 같지만 실상은 10이 아닌 다른 수가 되거나 실행 중 오류가 나기도 합니다.
생산자 소비자 문제 예제코드위 링크로 들어가면 생산자 소비자 문제를 코드로 구현한 것을 볼 수 있습니다.
이는 생산자 프로세스와 소비자 프로세스가 제대로 동기화되지 않았기 때문에 발생한 문제입니다.
공유 자원과 임계 구역계좌 잔액 문제와 생산자 소비자 문제의 예시에서 ‘잔액’과 ‘총합’이라는 공동의 자원을 두고 작업을 했습니다. 이러한 자원을 공유 자원(shared resource)이라고 합니다. 이 공유 자원 중에는 두 개 이상의 프로세스를 동시에 실행하면 문제가 발생하는 자원이 있습니다.
이렇게 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역(critical section)이라고 합니다.
두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기해야 합니다. 임계 구역에 먼저 진입한 프로세스의 작업이 마무리되고 난 후에 기다렸던 프로세스가 임계 구역에 진입합니다.임계 구역에서 두 개 이상의 프로세스가 동시에 실행되었을 때 문제가 발생하는 것을 보고 레이스 컨디션(race condition)이라고 합니다.
운영체제는 이러한 임계 구역 문제를 아래 세 가지 원칙 하에 해결합니다. 다르게 말하면 상호 배제를 위한 동기화를 위해서는 아래 세 가지 원칙이 반드시 지켜져야 합니다.📍 상호 배제(mutual exclusion)
한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
📍 진행(progress)
임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
📍 유한 대기(bounded waiting)
한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다(임계 구역에 들어오기 위해 무한정 대기해서는 안된다)
다음 포스팅에서는 운영체제가 이 세 가지 원칙들을 토대로 어떻게 상호 배제를 위하 동기화와 실행 순서 제어를 위한 동기화를 하는지 알아보겠습니다 😀LIST'운영체제' 카테고리의 다른 글
[OS] Linux IPC 프로세스간 통신에 대해서 알아보자 (0) 2023.04.04 [OS] 프로세스 동기화 기법, 뮤텍스 락, 세마포, 모니터 (0) 2023.04.02 [OS] CPU 스케줄링 알고리즘의 종류 (0) 2023.03.26 [OS] CPU 스케줄링이란? | 선점형 스케줄링과 비선점형 스케줄링 (0) 2023.03.25 [OS] 스레드와 멀티프로세스, 멀티스레드 (0) 2023.03.19