WHY
동기화 이슈는 상당히 중요한 주제이다.
병행성과 관련해서 공유되는 자원에 대한 이해와
공유자원 사용과 관련해서 생길 수 있는 문제 상황을 이해하는지 물어보기 좋은 질문!
병행성과 병렬성에 대한 이해가 있고
공유 자원에 대한 동시 접근으로 인해서 생길 수 있는 문제를 이해했는지
답변을 잘했다면 이슈를 해결하기 위한 방법들(락, 뮤텍스, 세마포어, 교착상태 등등)의 질문으로 나아갈 수 있다고 생각한다.
해당 글에서는 동기화가 필요한 배경(병행성 & 병렬성),
동기화란 무엇이고 이와 관련된 핵심 개념은 무엇인지 살펴본다.
멀티 프로세서 환경, 시분할 스케줄링. => 병행성 + 병렬성
현대의 운영체제는 병행성(시분할 스케줄링(OS))와 병렬성(다중 코어)을 제공해주고 있다.
이 덕에 컴퓨터 사용자들은 많은 프로그램을 실행시키면서 동시에 프로그램이 동작하는 느낌을 받을 수 있다.
병행성(Concurrency)
- 특정 순서 없이 겹치는 기간에 시작, 실행 및 완료되는 여러 작업을 의미한다.
시분할 스케줄링을 통해서 여러 작업이 진행되는 것처럼 느끼게 해 준다.
"응답성"을 낮추는 측면에서 사용자 프로세스에 도움을 준다.
병렬성(Paralleism)
- 여러 작업 또는 하나의 작업을 여러 부분으로 나누어 동시에 실행되는 것을 의미한다.
n개의 코어가 n개의 스레드로 멀티 프로세싱 & 멀티 스레딩 처리하는 것을 의미한다.
다중 코어로 여러 개의 작업을 수행할 수 있기에 "처리량"을 높여준다.
2가지 타입의 프로세스
협력 프로세스(Cooperating Process)
- 한 프로세스가 다른 프로세스에 영향을 받거나 주는 상황에 있는 프로세스이다.
독립(Independent process)
- 한 프로세스가 다른 프로세스에 영향을 주지 않는 프로세스.
병행성과 병렬성의 환경에서 문제는 "한정된 자원"에서 발생한다.
많은 프로세스가 돌아가는 상황에서 한정된 자원을 공유해서 사용하기 때문에 이 자원의 사용 영향으로 프로세스가
다른 프로세스에 영향을 주게 된다. 현대의 많은 프로세스가 "협력 프로세스"의 유형을 띤다.
문제는 "공유자원"의 일관성이 깨지는 순간이다.
여러 프로세스가 공유하는 자원에서 프로세스가 바라보는 자원의 일관성이 깨지게 되면
해당 자원을 사용하는 프로세스 코드의 대부분이 신뢰성을 잃게 된다.
[ 참을 반환해야 하는데 어떤 프로세스가 거짓으로 바꿔서 거짓을 반환한다고 생각해보라. ]
문제는 신뢰성이 깨지는 순간이 언제인지도 모르고, 이제까지 신뢰성이 깨져서 생겼던 문제가 무엇 무엇이 있었는지
추적하는 것이 불가능에 가깝다는 것이다.
소프트웨어의 신뢰성은 깨지게 되며 디버깅을 완벽하게 하지 못한다면 해당 소프트웨어를 폐기해야 할 수도 있다.
공유 자원과 관련해서 일관성이 깨질 수 있는 환경을 우리는 "경쟁 조건"이라고 하고
일관성과 관련된 영역을 "임계 영역(Critical Section)"이라고 한다.
임계영역을 보호하기 위해서 3가지 조건이 존재한다.
경쟁 조건(Race Condition)
경쟁 조건은 "2개 이상의 병행(Concurrent)" 프로세스가 공유 자원에 "동기화 메커니즘" 없이 접근하는 상황을 의미한다.
동기화 메커니즘을 통해 공유 자원을 보호하고, 프로세스 순서를 중재해주는 게 아니기 때문에
여러 프로세스가 공유 자원을 다루게 된다.
공유 데이터 영역은 상당히 민감한 영역이다.
앞서 살펴봤듯이 공유 데이터 영역의 일관성이 깨진다고 곧바로 문제로 드러나는 것이 아니다.
일관성이 깨지고 나서 전체적으로 파급력을 일으킨 후에 발견되는 경우가 대부분이다.
-> 데이터 일관성의 깨짐 -> 소프트웨어의 신뢰성 깨짐 -> 복구 불가. 과정을 거치면 상당히 피로하다.
특히 병렬 처리로 인한 문제는 현실적으로 재실현이 불가능하기 때문에
똑같은 문제 상황을 시뮬레이션하기가 불가능하다. 그래서 디버깅 난이도가 최상위급으로 뽑히는 것이다.
경쟁 조건에서 공유 자원을 사용하게 되는 영역 : "임계 영역(Critical Section)"
entry section : 진입 구역
- 임계 영역에 들어가기 위해서 요청하는 영역이다. [ 동기화 객체가 요구된다. ]
critical section : 임계 영역
- 데이터 일관성이 중요하기 때문에 하나의 프로세스만 접근해야 하는 영역이다.
exit section : 퇴장 영역
- 임계 영역을 사용했음을 알리는 영역이다. [ 동기화 객체를 놓게 된다 ]
임계 영역이란 2개 이상의 프로세스가 공유 자원에 접근해서 실행 결과가 달라지게 될 수 있는 영역을 의미한다.
운영체제는 해당 영역을 "원자적(atomic)"으로 다루어야 한다.
[ 원자처럼 더 이상 분해되거나 나눠질 수 없는 영역(메타포) ]
원자적 성질을 얻을 수 있도록 동기화 객체를 사용하는데 Lock, 뮤텍스, 세마포어, 모니터가 그것이다.
동기화 메커니즘이 작동하는 것이 바로 "임계 영역"이다. 해당 영역은 단 하나의 프로세스만 실행하도록 보장해야 한다.
운영체제의 목표는 임계 영역을 사용하는 프로세스가 "한 개"이도록 조정하는 것이다.
그러기 위해서는 임계 영역을 사용하고 싶은 프로세스들을 관리해야 한다.
- 해당 영역을 대기하는 프로세스는 wait()으로 Entry section에 있고
- 해당 영역을 사용하고 나온 프로세스는 signal()을 통해서 사용 끝! 을 알리는 것이다.
임계 구역 문제를 해결하기 위한 3가지 조건. [ 프로세스 동기화가 지켜야 하는 조건 ]
상호 배제(Mutual Exclusion)
가장 중요한 조건이다. 한 프로세스만 임계 구역을 사용해야 한다는 조건.
"한 프로세스가 임계 구역에 들어가면 다른 프로세스는 임계 구역에 들어갈 수 없어야 한다."
해당 조건이 지켜지지 않으면 경쟁 조건에 빠지게 된다.
[ 임계 영역 보호 ]
한정 대기(Bounded Waiting)
특정 프로세스가 무한히 대기해서는 안된다는 것이다.
임계구역에 대한 요청이 허용될 때까지 다른 프로세스들이 임계 구역에 진입할 수 있는 횟수에 한계가 있어야 한다는 것이다. [ 그래야만 다른 프로세스가 한정적으로 대기하게 된다. ]
[ 특정 프로세스가 기아(Starvation) 상태에 빠지는 것을 방지한다. ]
진행의 융통성(Progress flexibility)
임계 구역이 비어있는 경우, 임계 구역을 대기(실행 X)하던 프로세스들만 해당 임계 구역으로 진입할 수 있는 결정에
참여 가능하다. 해당 선택은 결정으로 인해 무한정 연기되어서는 안 된다.
한 프로세스가 다른 프로세스의 진행을 방해해서는 안된다는 것이다.
[ 교착상태가 일어나서는 안된다는 것을 의미한다. ]
프로세스 동기화의 목표
- 여러 프로세스가 공유하는 자원의 일관성을 유지해야 한다. 여러 개의 프로세스가 자원을 동시에 사용해서
자원이 가져야 할 일관성이 깨지게 되는 것을 방지해야 한다.
- 해당 자원을 사용하고자 하는 프로세스들을 관리해줘야 한다. [ 경쟁 조건을 "임계 영역"을 보호하면서 관리 ]
마무리
동기화의 배경.
동기화를 이해하기 위한 핵심 개념 2가지(경쟁 조건, 임계 영역).
임계 영역 보호 + 프로세스 조정을 위한 3가지 조건을 살펴보았다.
다음 면접 질문에서는 동기화를 제공해주는 기술적인 접근법에 대해서 살펴보고자 한다.
잘못된 정보, 문제가 되는 부분을 지적해주시면 수정하도록 하겠습니다.
참고자료
책
- 쉽게 배우는 운영체제
블로그
'면접질문[CS] > 알고리즘 & OS' 카테고리의 다른 글
교착상태란 무엇인가. [ 운영체제(OS) 면접질문 7] (0) | 2022.01.04 |
---|---|
임계구역을 보호하기 위한 기법 3가지[뮤텍스, 세마포어, 모니터] [ 운영체제(OS) 면접질문 6] (1) | 2021.12.24 |
CPU 스케줄링 알고리즘 [ 운영체제(OS) 면접 질문 4] (0) | 2021.12.22 |
CPU 스케줄링 & 선점형, 비선점형 스케줄링 [ 운영체제(OS) 면접 질문 3] (0) | 2021.12.21 |
멀티프로세싱(multiprocessing)과 멀티스레딩(multithreading)의 차이점 [ 운영체제(OS) 면접질문 2] (1) | 2021.12.16 |