-
7일차 - Process Syncronization(1)CS지식/운영체제 2021. 4. 25. 22:24
오늘은 프로세스 동기화에 대해서 배웠다.
프로세스는 여러 개 존재하고 여러 개의 프로세스가 하나의 데이터 공간에서 공유할 경우 발생할 수 있는 문제에 대해
알아보고 해결법에 대해 알 수 있었다.
1. 데이터 접근
process syncroization에 대해 배우기 전에 데이터의 접근 방법에 대해 알아보자.
데이터를 접근할 때는 다음과 같은 패턴을 가진다.
데이터 저장소에서 필요한 데이터를 가져오고 연산장치에서 연산을 한 후 연산결과를 다시 데이터 저장소에 보내게 된다.
데이터 저장소에는 memory, 디스크, 각 프로세스의 주소공간이 대표적인 예이고
연산장치에는 CPU, 컴퓨터 내부, 프로세스가 대표적인 예이다.
이렇게 데이터 저장소를 하나의 연산장치가 사용할 경우에는 별다른 문제가 없을 것이다.
하지만, 데이터 저장소를 공유하는 연산장치가 여러 개일 경우 Race Condition이 발생할 가능성이 있다.
Race Condition이란 여러 프로세스들이 동시에 공유 데이터를 접근한 상황에서 데이터의 최종 연산 결과가 마지막에 데이터를 다룬 프로세스에 따라 달라지는 것이다.
그러면 운영체제에서 race condition은 언제 발생할까?
1) kernel이 수행 중 인터럽트 발생 시
2) process가 system call을 하여 kernel mode로 수행 중인데 context switch가 일어나는 경우
3) multiprocessor에서 shared memory내의 kernel data
총 3가지의 경우가 존재할 수 있고 하나씩 자세하게 알아보자.
2. interrupt handler vs kernel
CPU에서 커널모드로 수행 중에 인터럽트가 발생했다고 생각해보자.
인터럽트토 커널코드를 사용하므로 커널데이터를 공유하게 된다.
그러면 처음 커널모드를 수행 중에서 count라는 변수를 1 더하는 작업을 하고 있는 중에 인터럽트가 발생하고 count변수를 1 빼는 작업을 한다고 가정해보자.
이 경우를 전체적으로 보면 count 변수를 1 더하고 1빼므로 결과적으로 count의 값은 변화가 없을 것이다.
하지만, 인터럽트 작업이 이루어지고 count-1의 결과값을 저장하였지만 커널모드의 작업이 이후에 완료되고 count+1의 결과값이 데이터에 저장되어진다.
결국, count-1 작업은 무시되어지고 count+1 작업만 이루어진 것이 된다.
이렇게 하나의 데이터 공간을 여러 개의 프로세스가 공유하여 발생한 race condition이 되는 것이다.
문제를 해결하는 방법은 무엇일까?
데이터 공간을 사용하는 일처리가 끝날 때까지 인터럽트를 허용하지 않는 것이다.
즉, kernel mode에서 count변수를 사용하는 작업이 마무리 되기 전까지 인터럽트가 발생하지 않게 하면 해결할 수 있다.
3. Preempt a process running in kernel?
먼저, 두 개의 프로세스가 있고 두 프로세스의 주소공간에는 data sharing이 없다고 가정하자.
P1이 CPU를 선점하여 user mode 후에 시스템 콜을 하여 kernel mode로 넘어갔다.
kernel mode에서 count 변수를 사용하여 1을 더하는 작업을 하는 중 P2가 CPU를 preempt하여
user mode로 동작 후 시스템 콜하여 kernel mode로 들어간다.
P2 kernel mode에서는 count 변수를 사용하여 1을 빼는 작업을 완료하고 다시 P1으로 CPU가 preempt되었다.
count에 1을 더하는 작업을 마무리 했을 때 count 값의 결과는 어떻게 될까?
전체적으로 봤을 때 count에 1을 더하고 빼는 작업이 있었으므로 count 값은 변하지 않았을 것이다.
하지만, 데이터 공간을 두 개의 프로세스가 공유하여 사용했으므로 count+1 작업 결과가 count에 저장됐다.
이 경우도 race condition이 발생한 것이다.
해결방법은 어떠한게 있을까?
이 경우에는 CPU가 커널모드에서 수행 중일 때는 CPU를 preempt하지 않도록 하는 것이다.
여기서 preempt는 할당시간이 끝나면 CPU를 빼았아가는 것을 의미한다.
4. multiprocessor
위 2가지의 경우는 CPU가 하나였을 때 작업환경을 의미한다.
그러면 CPU가 여러 개인 경우에는 어떻게 될까?
multiprocessor 환경에서는 위에서 말한 해결법으로 해결되지 않는다.
해결법은 2가지가 존재한다.
1) 한번에 하나의 CPU만이 커널에 들어갈 수 있게 하는 방법
이 경우에는 커널에 접근한 CPU를 제외하고 나머지 CPU가 커널에 접근을 못하여 작업을 못하는 경우가 발생할 수 있어
비효율 적이다.
2) 커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대한 lock/unlock을 하는 방법
커널 전체에 대한 접근을 제어하기 보다는 CPU가 접근한 데이터에 대해 제어를 하여 보다 효율적으로 관리하는 것이다.
5. process syncroization 문제
위에서 본 상황 3가지는 공유데이터(shared data)의 동시접근(concurrent access)은 데이터의 불일치 문제(inconsistency)를 발생 시킬 수 있다.
일관성 유지를 위해서는 입력 프로세스 간의 실행순서를 정해주는 매커니즘이 필요하다.
즉, race condition을 막기 위해 동시접근은 동기화되어야 한다는 것이다.
공유 데이터를 동시접근 할 경우 critical-section의 문제가 정의될 수 있다.
각 프로세스의 code segment에는 공유 데이터를 접근하는 코드인 critical section이 존재한다.
즉, critical section은 공유 데이터에 접근하여 작업을 수행하는 코드 부분을 의미한다.
그러면 하나의 프로세스가 critical section이 있을 대 다른 모든 프로세스는 critical section에 들어갈 수 없도록 제어해야한다.
이러한 부분을 해결하기 위해서 software적인 알고리즘과 hardware적인 해결법을 배울 수 있었다.
또한, 매번 프로그래머가 알고리즘을 구현하면 매우 불편하므로 간소화하기 위해서 semaphores라는 추상자료형을 정의하여 연산작업만을 통해 lock/unlock 작업을 할 수 있게 구현하였다.
이 부분은 다음에 따로 다루도록 하겠다.
'CS지식 > 운영체제' 카테고리의 다른 글
9일차 - Deadlock(교착상태) (0) 2021.05.01 8일차 - Process Syncronization(2) (0) 2021.04.28 6일차 - CPU Scheduling (0) 2021.04.21 5일차 - 프로세스 관리(Process Management) (0) 2021.04.18 4일차 - 스레드(Thread) (0) 2021.04.15