운영체제 · 동시성과 락 · 퀴즈
퀴즈: 동시성과 락
문항 7개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
counter = counter + 1 이 경쟁 상태를 일으키는 이유는?
- 읽기, 더하기, 쓰기의 세 단계 사이에 다른 스레드가 끼어들 수 있기 때문
- 컴파일러가 최적화로 순서를 바꾸기 때문
- 정수 오버플로가 발생하기 때문
- 캐시 일관성 프로토콜이 없기 때문
뮤텍스 대신 세마포어를 쓰는 것이 자연스러운 상황은?
- 임계 구역을 한 스레드만 들어가게 하고 싶을 때
- 재귀 호출 안에서 같은 락을 다시 잡아야 할 때
- 동시 접속 수를 5개로 제한하는 커넥션 풀을 만들 때
- 락을 잡은 스레드만 풀 수 있게 강제하고 싶을 때
조건 변수를 기다린 뒤 깨어났을 때 조건을 다시 검사해야 하는 이유는?
- 조건 변수는 값을 저장하지 않아 매번 다시 읽어야 하기 때문
- 대기 중에 뮤텍스가 자동으로 해제되어 상태가 무효해지기 때문
- 가짜 깨어남이 있을 수 있고, 깨어난 사이 다른 스레드가 조건을 바꿨을 수 있기 때문
- 조건 변수의 신호는 큐에 쌓였다가 나중에 다시 전달되기 때문
데드락의 네 가지 필요 조건에 해당하지 않는 것은?
- 상호 배제 — 자원을 한 번에 하나만 쓸 수 있다
- 점유하며 대기 — 가진 채로 다른 자원을 기다린다
- 순환 대기 — 대기 관계가 고리를 이룬다
- 기아 — 특정 스레드가 계속 밀려 진행하지 못한다
여러 코드 경로에서 데드락이 자주 발생할 때 가장 현실적인 예방책은?
- 락을 아예 쓰지 않는다
- 모든 코드가 락을 동일한 순서로 획득하도록 규칙을 정한다
- 타임아웃을 무한대로 늘린다
- 스레드 수를 늘린다
스핀락이 블로킹 락보다 유리한 조건은?
- 코어가 하나뿐일 때
- 임계 구역이 매우 짧고 대기 시간이 컨텍스트 스위치 비용보다 작을 때
- 임계 구역 안에서 디스크 I/O 를 할 때
- 대기 스레드가 아주 많을 때
'재고를 확인하고 남아 있으면 차감'하는 로직에서 격리 수준을 반복 읽기로 올렸는데도 초과 판매가 계속된다. 가장 정확한 진단은?
- 두 트랜잭션이 같은 집합을 읽고 서로 다른 행을 갱신하는 쓰기 편향이라 스냅샷 격리로는 잡히지 않는다
- 설정이 반영되지 않아 실제로는 커밋된 읽기로 동작하고 있다
- 인덱스가 없어서 잠금 범위가 좁아졌기 때문이다
- 커넥션 풀이 작아 트랜잭션이 뒤엉켜 순서가 꼬였기 때문이다