Search
💾

[OS] Process Synchronization 1(1)

참고 강의
contents

데이터의 접근

컴퓨터 시스템 안에서 무엇이든 이런 경로를 거친다.
누가 먼저 읽어갔느냐에 따라서 결과가 달라질 수 있다. → Sychronize 문제
여러 E-Box가 Storage Box를 접근하는 경우 문제가 발생할 수 있음
Race Condition : 여러 주체가 하나의 데이터를 동시에 접근하려고 할 때 발생
이걸 조율해주는 방식 필요
Multiprocessor System에서 메모리를 공유하고 있다면 발생할 수 있다.
ex. 하나의 CPU가 A를 읽어가는 동안 다른 CPU가 A를 읽어갈 수 있기 때문에
공유 메모리를 사용하는 프로세스들 간에도 문제 발생 가능
운영 체제 커널 내부 데이터를 접근하는 루틴들 간
ex. 운영 체제 커널의 코드가 실행이 될 때 커널 데이터를 접근하게 되면 문제 발생
→ 유저 레벨 자체에서는 동시성 문제가 많이 생기지 않음

OS에서 race condition은 언제 발생하는가?

1.
kernel 수행 중 인터럽트 발생 시
2.
Process가 system call을 하여 kernel mode로 수행 중인데 context switch가 일어나는 경우
3.
multiprocessor에서 shared memory 내의 kernel data
interrupt handler v.s. kernel
결과적으로 Count가 감소한 것이 반영이 안된다.
중요한 변수값을 건드리는 동안에는 interrupt가 들어와도 interrupt처리 루틴으로 넘기는 것이 아니라 이 작업이 끝날 때까지는 interrupt를 disable 시켰다가 작업이 끝난 다음에 interrupt 처리 루틴으로 넘긴다.
→ race condition이 발생하지 않도록
Preempt a process running in kernel?
운영체제에게 서비스를 대신해달라고 하는 경우 발생 → 독점적으로 사용하는 것이 아니라 할당 시간이 끝나면 CPU를 반납해야 함.
Count가 2 증가해야 하지만 동기화 문제때문에 1이 증가한다.
해결책
커널 모드에서 수행 중일 때는 할당 시간이 끝나도 CPU를 preempt하지 않는다. 커널 모드에서 사용자 모드로 돌아갈 때 preempt한다.
multiprocessor
앞에 있는 해결법으로는 해결이 되지 않는 문제 → 작업의 주체가 여럿이라서 생기는 문제
해결법1 : 데이터를 들고 가기 전에 데이터에 대한 lock를 걸어서 데이터에 접근을 못하게 한다.
커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대한 Lock / Unlock을 하는 방법
해결법2 : 운영체제 커널에 접근하는 CPU를 매 순간 하나만 접근할 수 있도록 한다.(비효율적)
한번에 하나의 CPU만이 커널에 들어갈 수 있게 하는 방법

Process Synchronization 문제

공유 데이터(shared data)의 동시 접근(concurrent access)은 데이터의 불일치 문제(inconsistency)를 발생시킬 수 있다.
일관성 유지를 위해서는 협력 프로세스(cooperating process)간의 실행 순서(orderly execution)를 정해주는 메커니즘 필요
Race condition
여러 프로세스들이 동시에 공유 데이터를 접근하는 상황
데이터의 최종 연산 결과는 마지막에 그 데이터를 다룬 프로세스에 따라 달라짐
  race condition을 막기 위해서는 concurrent process는 동기화(synchronize)되어야 한다.
P1 수행 중에 timer interrupt가 발생해서 context switch가 일어나면 문제가 생기는가?
보통은 문제가 생기지 않지만, Shared Data를 사용하거나, 커널에 있는 데이터를 변경하는 경우 문제가 생길 수 있다.

The Critical-Section Problem

n개의 프로세스가 공유 데이터를 동시에 사용하기를 원하는 경우 각 프로세스의 code segment에는 공유 데이터를 접근하는 코드인 critical section이 존재  하나의 프로세스가 critical section에 있을 때 다른 모든 프로세스는 critical section에 들어갈 수 없어야 한다.
Critical-Section : 공유 데이터를 접근하는 코드 → 두 개 이상의 프로세스가 동시에 사용할 수 없는 자원