CS (Computer Science)
[운영체제] 5. Process Synchronization (1)
포시
2023. 5. 1. 19:19
728x90
키워드
synchronization, race condition, critical section
데이터의 접근

추상적으로 아래와 같이 구분됨
- Storage Box: 데이터가 저장되어 있는 위치
- Execution Box: 실제 연산하는 위치

- 데이터를 읽기만 하면 누가 먼저 읽든, 읽는 동안 다른 곳에서 읽든 문제될 게 없지만
- 데이터를 읽어와 연산 후 데이터를 수정하여 저장하는 방식에서는
누가 먼저 읽었느냐에 따라 결과가 달라질 수도 있는 등
여기서 생기는 문제를 Synchronization 문제라고 한다. - 마찬가지로 한 곳에선 데이터를 증가시키려 하고 다른 곳에선 데이터를 감소시키려 하면
문제가 발생 -> Race Condition(경쟁 상태) - Multiprocessor system처럼 메모리를 공유한다면 문제가 발생할 가능성 존재
- 프로세스는 자신만의 주소 공간에 접근할 수 있지만
공유 메모리를 사용할 수 있는 방법이 있기 때문에 그런 상황에서도 문제 발생 가능성 존재

- 제일 중요한건 운영체제 커널과 관련해서 생기는 문제다.
-> 일반적인 경우엔 프로세스가 자기 주소 공간만 접근하기 때문에 process synchronization과 관련된 문제가
발생할 일이 없지만 프로세스가 본인이 직접 실행할 수 없어 운영체제한테 요청하게 되는 부분에 대해서(시스템 콜)
커널의 코드가 그 프로세스를 대신해서 실행할 경우 (커널의 데이터 접근)
CPU를 뺏겨 다른 프로세스한테 넘어간 상황에서 해당 프로세스가 또 시스템 콜을 하여 운영체제한테 요청해서
커널의 코드가 실행되면서 커널의 데이터를 접근해 Race condition 문제가 발생할 수 있음 - 커널의 코드가 실행중일 때 인터럽트가 발생할 경우(인터럽트를 실행하는 코드도 커널의 코드)
- 유저 레벨에서는 문제가 발생하지 않아도 운영체제 커널로 들어가면 커널에 있는 데이터는
여러 프로세스들이 동시에 사용할 수 있는 공유 데이터이기 때문에 문제가 발생한다. - 중요한 값을 건드리는 동안은 인터럽트가 들어와도 작업이 끝날 때까지는 인터럽트를 disable시켰다가
작업이 끝난 후 처리되게끔 하여 문제가 발생하지 않도록 한다.
-> 무작정 막으면 비효율적이기에 어떻게 처리할지가 Process Synchronization의 주제 - 해결책: 커널 모드에서 수행 중일 때는 CPU를 preempt하지 않음
커널 모드에서 사용자 모드로 돌아갈 때 preempt
-> time sharing 시스템은 real time 시스템이 아니기 때문에 조금의 시간이 지체되었다고 해도 문제가 되지 않는다.

- CPU가 여러 개일 경우 (multiprocessor일 경우)
- interrupt enable/disable로 해결할 수 없음
- 방법 1: CPU가 데이터를 들고가면서 Lock을 걸고 저장이 끝난 후 Unlock하는 방법
- 방법 2: 사용자 프로그램이 아닌 운영체제의 커널을 여러 CPU가 동시에 접근하기 때문에 발생하는 문제
-> 커널을 접근하는 CPU를 매순간 하나만 접근하게 하는 방법(대신 비효율적)
Process Synchronizatioin 문제
- 공유 데이터(shared data)의 동시 접근(concurrent access)은
데이터의 불일치 문제(inconsistency)를 발생시킬 수 있다. - 일관성(consistency) 유지를 위해서는 협력 프로세스(cooperating process)간의 실행 순서(orderly execution)를
정해주는 메커니즘이 필요하다. - Race condition
- 여러 프로세스들이 동시에 공유 데이터를 접근하는 상황
- 데이터의 최종 연산 결과는 마지막에 그 데이터를 다룬 프로세스에 따라 달라진다.
- Race condition을 막기 위해서는 concurrent process가 동기화(synchronize)되어야 한다.
The Critical-Section Problem
(=임계구역 문제)

- Critical-Section: 공유 데이터를 접근하는 코드
- 하나의 프로세스가 critical section에 있을 때, 다른 모든 프로세스는 ciritical section에 들어갈 수 없어야 한다.
- 보통 프로그램의 코드는 critical section이거나 아니거나. 즉, 공유 데이터를 접근하는 코드이거나 아니거나의 반복이다.
그럼 이 앞뒤로 부가적인 내용을 추가해 race condition이 발생하지 않게 하는 소프트웨어적인 방법들이 존재한다.
-> 뒤이어 나올 알고리즘들
728x90