개발자는 기록이 답이다

운영체제 4주차 스터디 프로세스 동기화 본문

CS/운영체제

운영체제 4주차 스터디 프로세스 동기화

slow-walker 2024. 9. 5. 23:54

📌  병행성(동시성)(Concurrency)

  • 병행성(Concurrency)은 여러 작업을 동시에 실행하는 것처럼 보이도록 처리하는 개념입니다. 실제로는 CPU가 여러 작업을 교대로 처리하는 방식으로, 각 작업이 짧은 시간 동안 번갈아가며 실행되므로, 사용자에게는 동시에 실행되는 것처럼 보입니다.
  • 병행성은 단일 CPU 환경에서도 가능하며, 주로 여러 작업이 서로 간섭하지 않도록 동기화 기법을 사용해 제어합니다.

📌  병렬성(Parallelism)

  • 병렬성(Parallelism)은 여러 작업을 병렬적으로 실제로 동시에 실행하는 개념입니다. 다중 코어 또는 다중 프로세서 환경에서 각 코어가 서로 다른 작업을 병렬로 실행합니다.
  • 병렬성은 CPU가 여러 개일 때, 각 CPU가 독립적으로 하나씩 작업을 처리하는 방식으로, 실제로 동시에 작업이 진행됩니다.

📌  프로세스 동기화

 

프로세스들을 무작정 동시에 실행해도 괜찮을까?


동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해 서로 협력하며 영향을 주고 받는다.

이렇게 협력하여 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장 해야 하기에 반드시 동기화(synchronization) 되어야 한다.

 

  • 프로세스 동기화는 여러 프로세스가 동시에 실행될 때, 공유 자원을 사용하는 과정에서 발생할 수 있는 데이터 불일치 문제를 방지하는 기법입니다.
  • 예를 들어, 두 개의 프로세스가 동시에 파일을 읽고 쓰려 할 때, 동기화가 없다면 데이터 손상이나 충돌이 발생할 수 있습니다.
  • 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기
  • 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

※ 프로세스뿐만 아니라 스레드도 동기화 대상이다. 정확히 말하면 실행의 흐름을 갖는 모든 것은 동기화의 대상이다.

 

📌 Critical Section(임계 구역)

  • Critical Section(임계 구역)은 공유 자원에 접근할 때 동시에 하나의 프로세스 또는 스레드만 접근할 수 있도록 해야 하는 코드 영역입니다. 여러 프로세스가 이 구역에 동시에 접근하면 데이터 일관성 문제가 발생할 수 있으므로, 상호 배제를 통해 관리합니다.

📌 Race Condition(경쟁 상태)

  • Race Condition(경쟁 상태)는 여러 프로세스 또는 스레드가 동시에 동일한 자원에 접근하여 결과가 실행 순서에 따라 달라지는 상황을 말합니다.
  • 예를 들어, 두 개의 스레드가 동시에 변수 값을 수정하면, 그 결과는 예측 불가능해질 수 있습니다.

📌 Race Condition 해결 방법

  • 상호 배제(Mutual Exclusion)를 통해 해결할 수 있습니다. 즉, 한 번에 하나의 프로세스만 Critical Section에 접근하도록 하여 동시 접근을 방지하는 것입니다. 이를 위해 Mutex, 세마포어, 모니터 등의 동기화 도구를 사용할 수 있습니다.

📌 Mutual Exclusion(상호 배제)

  • Mutual Exclusion은 한 번에 하나의 프로세스 또는 스레드만 공유 자원에 접근할 수 있도록 제한하는 방식입니다. 이를 통해 동시 접근으로 인한 경쟁 상태를 방지합니다.

📌 Mutual Exclusion을 할 수 있는 방법

  • 뮤텍스(Mutex), 세마포어(Semaphore), 모니터(Monitor) 등이 대표적인 방법입니다. 이들 기법은 여러 프로세스 또는 스레드가 공유 자원에 동시 접근하지 않도록 관리합니다.

📌 뮤텍스(Mutex)

  • Mutex(뮤텍스)는 상호 배제를 보장하는 기법으로, Lock을 사용해 한 번에 하나의 프로세스나 스레드만 공유 자원에 접근할 수 있도록 합니다. 자원을 사용하려는 프로세스는 먼저 뮤텍스를 얻어야 하며, 자원 사용 후에는 뮤텍스를 반환해야 합니다.

📌 세마포어(Semaphore)

  • 세마포어(Semaphore)는 자원에 접근할 수 있는 프로세스의 수를 제한하는 동기화 기법입니다. 세마포어는 카운터를 사용하여 현재 자원을 사용할 수 있는 프로세스의 수를 조절합니다.
  • 이진 세마포어0 또는 1의 값을 가질 수 있는 세마포어로, 뮤텍스와 유사하게 동작합니다.

📌 뮤텍스(Mutex)와 이진 세마포어의 차이

  • Mutex는 상호 배제를 위한 락을 걸고 풀 수 있는 주체가 같은 스레드여야 합니다.
  • 이진 세마포어뮤텍스와 비슷하게 0과 1로 자원 접근을 관리하지만, 락을 건 스레드와 다른 스레드가 락을 해제할 수 있습니다.

📌 모니터(Monitor)

  • 모니터(Monitor)는 상호 배제를 보장하는 고수준 동기화 기법으로, 여러 프로세스나 스레드가 공유 자원에 접근할 때 자동으로 락과 언락을 관리합니다. 프로그래머가 명시적으로 락을 관리할 필요가 없으므로, 코드가 간결해집니다.
  • 모니터는 공유 자원과 공유자원에 접근하기 위한 인터페이스(통로)를 묶어 관리한다.
  • 그리고 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 한다.

ex. Java의 synchronized

📌 데드락(Deadlock)

  • 데드락(Deadlock)은 두 개 이상의 프로세스가 서로 자원이 해제되기를 기다리면서 무한정 대기하는 상태를 말합니다. 이로 인해 모든 프로세스가 교착 상태에 빠져 아무 일도 진행되지 않게 됩니다.

📌 데드락 발생 조건 4가지

  1. 상호 배제(Mutual Exclusion): 자원은 한 번에 하나의 프로세스만 사용할 수 있음.
  2. 점유 대기(Hold and Wait): 자원을 점유한 상태에서 다른 자원을 요청하면서 대기함.
  3. 비선점(No Preemption): 할당된 자원을 강제로 빼앗을 수 없음.
  4. 순환 대기(Circular Wait): 각 프로세스가 자원을 순환적으로 요청하면서 대기함.

📌 데드락을 막는 방법

  • 데드락 예방: 데드락 발생 조건 중 하나를 없애서 교착 상태를 미리 방지하는 방법입니다.
  • 데드락 회피: 자원의 상태를 미리 알고, 데드락이 발생하지 않도록 자원을 할당하는 방식(예: 은행원 알고리즘).
  • 데드락 탐지 및 회복: 데드락이 발생했는지 감지하고, 감지된 후 이를 해결하는 방식입니다(프로세스 종료 또는 자원 선점)