프로그램이 둘 다 동일한 리소스를 사용하려고하면 충돌합니다. 여러 프로그램이 동시에 리소스에서 작동하려고하면 동시성 문제 가 발생할 위험이 있습니다. 동시성 문제는 한 프로세스가 자원에 대한 변경을 수행하고 다른 프로그램 (자원에 대한 자체 수정 중)이이를 인식하지 못하여 수용 할 수 없을 때 발생합니다.
다음은 교과서 동시성 문제의 몇 가지 예입니다.
최후의 문제
FTP 디렉토리를 사용하여 자신과 동료가 문서에서 공동 작업하는 문서를 공유한다고 가정하십시오. 동료와 마찬가지로 문서를 다운로드하여 편집 한 후 다시 게시 할 수 있습니다.
- 문서를 다운로드하고 1 시간이 걸리는 일련의 변경을 시작합니다.
- 동료가 문서를 다운로드하는 동시에 문서를 다운로드하지만 변경을 완료하고 다시 업로드하는 데 30 분 밖에 걸리지 않습니다.
결과 : 문서를 업로드 할 때 변경 사항을 덮어 쓰고 손실됩니다.
오래된 데이터
같은 시나리오에서 동료는 알리지 않고 필요한 부분을 변경합니다. 파일 사본에 변경 사항이 없습니다.
결과 : 약간 다른 단어로 동일한 변경 사항을 직접 작성하거나 더 나쁜 방법으로 누락 된 이메일을 발송합니다.
이것은 단순한 시나리오처럼 보이지만 다중 액세스 데이터베이스와 같은 고급 경우 누군가가 업데이트하는 것과 동일한 밀리 초에 레코드를 선택하면 심각한 문제가 발생할 수 있습니다.
잘못된 계산
결혼 한 부부는 은행 계좌와 ATM 카드를 공유합니다. 그들은 계정에 1000USD를 가지고 있습니다. 일상 생활에서 그들은 도시 맞은 편에 있으며, 동시에 ATM에 액세스합니다. 둘 다 1000USD를 인출합니다. ATM은 모두 잔액이 1000임을 알고 있으므로 출금을 허용 한 다음 새 잔액이 0 인 중앙 데이터베이스에 다시 씁니다.
결과 : 은행은 현재 1000USD를 내고 있으며 심지어 그것을 모릅니다.
이 모든 예에는 공유 리소스에 대해 또는 거의 동시에 작업을 수행하는 여러 당사자가있었습니다. 따라서 "동시성"또는 "동기 성"이라는 용어가 사용됩니다.
솔루션
이러한 종류의 문제를 처리하는 몇 가지 방법이 있습니다. 하나는 리소스에 액세스하는 여러 당사자간에 중재하는 소프트웨어를 사용하는 것입니다. 이 중재자 프로그램에는 작업 범위와 예측 가능성에 따라 두 가지 옵션이 있습니다.
- 작업을 지능적으로 병합
- 첫 번째 작업이 완료 될 때까지 두 작업 중 하나를 차단 / 잠금합니다.
두 프로그램 모두 자원 상태를 나타내는 공유 플래그를 확인하도록 설계되어 있으면 차단 / 잠금도 가능합니다. 이것은 일반적으로 사용자 정의 개발이 필요합니다.
너의 답
특정한 경우, 리소스는 디스크의 파일입니다. 동기화는 두 AV 프로그램에서 온 액세스 검색을 트리거하는 파일 읽기 / 쓰기와 같은 이벤트에서 비롯됩니다.
Windows는 특정 작업을 위해 프로그램을 열 때 파일 을 잠그면 파일 시스템 동시성 문제를 해결하는 중재자 역할을합니다 .
이것은 두 프로그램이 모두 파일에 접근하기 위해 경주하고 있다는 것을 의미합니다. 낮은 수준에서 두 프로그램 모두 자체 I / O 활동을 시작함에 따라 일부 디스크 스레 싱이 발생하여 하드웨어가 두 작업을 개별적으로 수행하지만 IO 명령을 인터리빙하여 효율성이 떨어지고 결국에는 하나만 만들게됩니다. 그들 중 이길 것입니다. 다른 하나는 회전하고 자신의 잠금을 설정할 수 있도록 기다립니다.