Notice
Recent Posts
Recent Comments
09-17 18:30
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Byeol Lo

6.1 Synchronization Tools 본문

OS/OS Design

6.1 Synchronization Tools

알 수 없는 사용자 2024. 5. 18. 01:35

 스레드와 프로세스가 어떻게 연결되고 유저 스레드가 LWP를 통해 커널 스레드를 어떻게 할당 받는지, 또 커널스레드 간에 프로세서의 경쟁이 붙어서 multithreading의 아키텍처에서 커널스레드가 I/O burst, CPU burst에 따라 priority, nice, vruntime 등으로 어떤 알고리즘으로 스케줄링 될 수 있는지 보았을 것이다. 이번에는 이 프로세스가 서로서로 협동하는(cooperating process) 관계일 때는 어떻게 되는지 보자.

 CPU 스케줄러가 프로세스 간에 빠르게 전환하여 동시 실행을 제공하는 방법을 설명했는데, 그게 multithreading이며, 이는 하나의 프로세스가 다른 프로세스가 스케줄될 때까지 실행이 완전히 끝나지 않을 수 있다는 것을 의미한다. 실제로 프로세스는 명령 흐름의 어느 지점에서든 중단될 수 있고, 처리 코어는 다른 프로세스의 명령을 실행할 수 있다. 또한 4.2 절에서 병렬 실행을 소개했는데, 이는 두 개의 명령 흐름(다른 프로세스를 나타냄)이 별도의 처리 코어에서 동시에 실행되는 것이다. 이 장에서는 동시 또는 병렬 실행이 여러 프로세스에 의해 공유되는 데이터의 무결성(integrity)과 관련된 문제에 어떻게 기여할 수 있는지 설명한다.

 데이터의 무결성에 대한 문제 상황을 보자. 서로 공유하거나 의사소통할 때 shared data와 message passing과 같은 순차 프로세스 또는 스레드로 구성된 시스템의 모델을 봤을 것이다. 이들은 모두 비동기적으로 실행되며 데이터를 공유할 수 있다. 우리는 이 모델을 많은 운영 체제 기능의 대표적인 패러다임인 생산자-소비자 문제로 설명했었다. 3.5 절에서 shared data 방식으로 bounded buffer을 사용하여 프로세스가 메모리를 공유할 수 있도록 하는 IPC를 설명했다(모르면 다시 보고오기).

 생산자-소비자 문제에서는 BUFFER_SIZE - 1 만큼의 항목만 bounded buffer에 넣을 수 있음을 봤다. 생산자 코드를 다음과 같이 수정하자(count, buffer 가 공유 변수)

while (true) {
  while (count == BUFFER_SIZE) {
    ;
  
  buffer[in] = next_produced;
  in = (in + 1) % BUFFER_SIZE;
  count++;
}

소비자 코드는 다음과 같이 수정한다.

while (true) {
  while (count == 0) {
    ;
  
  next_consumed = buffer[out];
  out = (out + 1) & BUFFER_SIZE;
  count--;

이전의 생산자 소비자 코드와는 별개로 count라는 변수를 통해 공유하여서 BUFFER_SIZE 만큼 가득채울수도, 비울 수도 있게 됐다. 위 코드는 일단 올바르지만, 동시에 실행될 때 올바르게 작동하지 않을 수 있다. 예를 들어서 변수 count = 5이고 생산자와 소비자가 동시에 ++, --의 명령을 실행시켰다고 해보자. 하지만 우리가 원하는 결과가 5여야 하지만, 4, 5, 6이 나올 수 있다는 것이다.

register_1 = count
register_1 = register_1 + 1
count = register_1

register_2 = count
register_2 = register_2 - 1
count = register_2

 일단 --, ++의 내부적으로 동작되는 과정을 위와 같이 볼 수 있는데, 이 6가지 명령들을 적절하게 조합시키면 우리가 원하지 않았던 값인 4, 6의 경우가 나올 수 있도록 만들 수 있다(조합하는 것은 독자에게 맡김).

 위 명령들을 적절히 조합해서 나오는 이유는 서로 동시에 실행을 시켰기 때문이다. 여러 프로세스가 하나의 변수, 데이터에 대해 동작을 가할 때 이런 경우를 race condition(경합 조건) 이라고 부른다. 이를 방지케하기 위해 변수 count에 하나의 processor만 접근할 수 있도록 해야할 것이며, 대부분의 다중 프로세서 아키텍처라 이 race condition이 자주 발생하기 때문에 data integrity를 관리하고 통제하여 data reliability를 위해 필수적으로 구현해야 한다. 이 문제를 협력 프로세스 간의 process synchronization와 coordination을 통해 해결하도록 이 장에서 설명을 할 것이다.

'OS > OS Design' 카테고리의 다른 글

6.3 Peterson's Solution  (0) 2024.05.18
6.2 The Critical-Section Problem  (0) 2024.05.18
5.8 Algorithm Evaluation  (0) 2024.05.18
5.7 Operating-System Examples  (0) 2024.05.17
5.6 Real-Time CPU Scheduling  (0) 2024.05.16
Comments