![[기술 면접] 5. Multi process/thread 환경에서 임계영역의 동기화 문제를 어떻게 해결하나요? 1 제목을 입력해주세요 복사본 9 001 1 1](https://i0.wp.com/allhoneytip.com/wp-content/uploads/2023/08/%EC%A0%9C%EB%AA%A9%EC%9D%84-%EC%9E%85%EB%A0%A5%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94__%EB%B3%B5%EC%82%AC%EB%B3%B8-9-001-1-1-optimized.png?resize=300%2C300&ssl=1)
저번 시간에 이어, 이번엔 Multi process / Multi Thread 환경에서 임계영역의 동기화 문제를 어떻게 해결하는지에 대해 알아보겠습니다. 임계영역, Mutext, 그리고 Semaphore가 등장하며 처음 접하시는 분에겐 다소 어려울 수 있을 거라 생각합니다.
![[기술 면접] 5. Multi process/thread 환경에서 임계영역의 동기화 문제를 어떻게 해결하나요? 2 image 43](https://i0.wp.com/allhoneytip.com/wp-content/uploads/2023/08/image-43-optimized.png?resize=626%2C260&ssl=1)
Q: Multi process/thread 환경에서 임계영역의 동기화 문제를 어떻게 해결하나요?
Mutex와 Semaphore 기법 등을 사용할 수 있습니다.
Q: Mutex가 무엇인가요?
Mutex란 1개의 스레드만이 공유 자원에 접근할 수 있도록 하여, 경쟁 상황(race condition)을 방지하는 기법입니다. 즉 process/thread는 임계영역에 들어가기 전에 반드시 lock을 획득해야 하고, 빠져나올 때 lock을 반환해야 합니다.
이때 lock이 없는 프로세스는 lock을 획득하기 위해 무한루프를 돌게 되는데, 이를 스핀락이라고 하며, 쓸데없이 자원을 낭비하는 점과 두 개의 프로세스만 제어 가능하다는 문제점이 있습니다.
acquire() // entry sction
// critical section
release() // exit section
Q: Semaphore는 무엇인가요?
Semaphore란 S개(세마포 변수의 값만큼)의 thread만이 공유 자원에 접근할 수 있도록 제어하는 동기화 기법입니다. Semaphore 기법에서는 정수형 변수 S(세마포) 값을 가용한 자원의 수로 초기화하고, 자원에 접근할 때는 S– 연산을 수행하여 세마포 값을 감소시키고 자원을 방출할 때는 S++연산을 수행하여 세마포 값을 증가시킵니다. 이 때 세마포 값이 0이 되면 모든 자원이 사용 중임을 의미하고, 이후 자원을 사용하려는 프로세스는 세마포 값이 0보다 커질 때까지 block됩니다.
wait(S) // entry section
// critical section
signal(S) // exit section
Q: Busy Waiting은 무엇인지 알고 있나요?
Busy waiting은 자원을 얻기 위해 권한을 얻을 때까지 확인하는 것을 의미합니다. CPU의 자원을 쓸데 없이 낭비하기 때문에 권장되지 않는 동기화 방식입니다.
Q: 임계영역(critical section)에 대해 설명해주세요.
둘 이상의 process/thread가 동시에 동일한 자원에 접근하도록 하는 프로그램 코드 부분을 의미합니다. 중요한 특징중 하나는, 한 process/thread가 자신의 임계구역에서 수행하는 동안에는 다른 process/thread들은 그들의 임계구역에 들어갈 수 없어야 한다는 사실입니다. 즉, 임계영역 내의 코드는 원자적으로(atomically) 실행이 되어야 합니다.
원자적으로 실행되기 위해서 각각의 process/thread는 자신의 임계구역으로 진입하려면 진입 허가를 요청해야합니다. 이 부분을 entry section이라고 하고, 진입이 허가되면 임계영역을 실행할 수 있습니다. 임계영역이 끝나고 나면 exit section으로 퇴출을 하게 됩니다. 이렇게 임계영역의 원자성을 보장하는 것을 동기화라고 하며, 대표적으로 Mutext와 Semaphore가 있습니다.
Q: 임계영역 문제를 해결하기 위한 세가지 조건을 말씀해보세요.
상호배제(mutual exclusion), 진행(progress), 한정된 대기(bounded waiting)입니다.
- 상호배제: 하나의 프로세스가 임계영역에서 실행하고 있을 때 다른 프로세스는 임계영역에 접근하지 못하도록 하는 것입니다. 이로 인해 교착상태, 기아 상태 문제가 발생합니다.
- 진행: 임계영역에 들어간 프로세스가 없는 상태에서 들어가려고 하는 프로세스가 여러 개 있다면, 어느 것이 들어갈지를 적절하게 결정해야 한다는 조건입니다.
- 한정된 대기: 기아 상태를 회피하기 위한 조건으로, 한 프로세스만 계속 실행될 수 없게 하도록, 한 번 임계영역에서 실행된 프로세스는 다음 실행에 대한 제한이 있어야 한다는 조건입니다.
마치며
임계영역, Mutex, Semaphore 등 고난위도 개념들이 많이 등장했습니다. 동기화 문제가 발생하지 않도록 하기 위해 다양한 관리가 이루어지는데 그중 일부라고 알아두시면 될것 같습니다.
다음 시간에는 이번 시간과 밀접한 관련이 있는 교착상태(Deadlock), 그리고 경쟁상황(Race Condition)에 대해 알아보겠습니다.
![[기술 면접] 5. Multi process/thread 환경에서 임계영역의 동기화 문제를 어떻게 해결하나요? 3 image 44](https://i0.wp.com/allhoneytip.com/wp-content/uploads/2023/08/image-44-optimized.png?resize=564%2C310&ssl=1)
답글 남기기