일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코딩테스트
- Pro-Con
- git
- 프로콘 갈림현상
- programmers
- C++
- 자소서
- GitHub Desktop
- Github
- 알고리즘 종류 정리
- algorithm
- Python
- Ultimate Search
- 제노블레이드 2
- 취준
- 프로콘
- 격리수준
- ASF-110
- 리트코드
- 백트래킹
- Algorithmus
- baekjoon
- SRE
- 네이버 검색 시스템
- 백준
- LeetCode
- 프로그래머스
- python3
- 알고리즘
- DP
- Today
- Total
산타는 없다
동기화 처리와 데드락 본문
공유 자원의 동기화
프로세스 안에서 생성된 스레드들은 코드, 데이터, 힙 메모리 영역을 공유하고 스택 영역만 스레드 별로 고유하게 가지게 됩니다.
스레드가 서로 데이터를 공유할 수 있다는 점은 장점이긴 하지만 두 스레드가 같은 자원을 동시에 변경하는 경우에는 문제가 발생할 수 있습니다. 때문에 공유 자원에 대한 접근을 제어하기 위한 동기화 처리를 하게 됩니다.
MFC Api에선 CCriticalSection 클래스를 제공하여 동기화 처리를 할 수 있습니다.
이런 동기화 처리는 여러 스레드가 같은 객체를 동시에 실행하는 것을 방지해 줍니다. 세밀하게 제어한다면 lock(or monitor)를 사용하여 접근을 동기화 할 수 있습니다.
특정 시점에 락을 쥐고 있을 수 있는 스레드는 하나뿐이며 따라서 해당 공유 자원은 한 번에 한 스레드만이 사용할 수 있게 됩니다.
데드락 (Deadlock / 교착상태)
공유 자원을 한 스레드만 사용할 수 있으므로 다른 스레드는 락이 풀리기를 기다리게 되는데 이런 상황일 때 데드락이 발생할 가능성이 생깁니다.
첫 번째 스레드는 두번째 스레드가 들고 있는 객체의 락이 풀리기를 기다리고 있고, 두 번째 스레드 역시 첫 번째 스레드가 들고 있는 객체의 락이 풀리기를 기다리는 상황이라면 모든 스레드가 락이 풀리기를 기다리고 있기 때문에, 무한 대기 상태에 빠지게 됩니다. 이 상황을 교착상태(deadlock)이라고 부르며 스레드가 교착 상태에 빠졌다고 합니다.
교착 상태의 조건
이런 교착상태가 발생하려면, 네 가지 조건이 모두 충족되어야 합니다.
- 상호 배제(mutual exclusion) : 한 번에 한 프로세스만 공유 자원을 사용할 수 있다(좀 더 정확하게는 자원에 접근할 수 있는 스레드가 제한되어 있으면 교착상태가 발생할 수 있다)
- 점유와 대기(hold and wait) : 최소한 하나의 자원을 점유하고 있으면서 다른 자원을 추가로 점유하기 위해 대기할 수 있다.
- 비선점(Non-preemption) : 한 프로세스가 다른 프로세스의 자원 접근 권한을 강제로 취소할 수 없다.
- 환형 대기(circular wait) : 공유 자원과 공유 자원을 사용하기 위해 대기하는 프로세스들이 원형으로 구성되어 있어 자신에게 할당된 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원을 요구하는 구조
교착 상태의 예방(방지)
교착상태를 방지하기 위해선 이 조건들 가운데 하나를 제거하면 됩니다. 하지만 이들 조건 가운데 상당수는 만족되기 어려운 것이라서 까다롭습니다. 때문에 대부분의 교착 상태 방지 알고리즘은 4번 조건, 즉 대기 상태의 사이클을 방생하는 일을 막는 데 초점이 맞춰져 있습니다.
'Computer Science > 운영체제' 카테고리의 다른 글
비선점(Non-preemptive) 스케줄링 (0) | 2021.08.22 |
---|---|
프로세스와 스레드 (0) | 2021.08.22 |
동적/공유 라이브러리(Dynamic/ Shared Library)와 동적 링킹(Dynamic Linking) (0) | 2021.05.31 |
정적 라이브러리(Static Library) 와 정적 링킹(Static Linking) (0) | 2021.05.17 |
라이브러리의 정의와 종류 (정적 / 동적) (0) | 2021.05.17 |