동기화(컴퓨터 과학)
Synchronization (computer science)컴퓨터 과학에서 동기란 프로세스 동기화 및 데이터 동기화라는 서로 다르지만 관련된 두 가지 개념 중 하나를 말합니다.프로세스 동기란 합의에 이르거나 특정 액션 시퀀스에 커밋하기 위해 특정 시점에서 여러 프로세스가 가입하거나 핸드쉐이크를 하는 것을 말합니다.데이터 동기화는 데이터셋의 여러 복사본을 서로 일관되게 유지하거나 데이터 무결성을 유지하는 아이디어입니다.프로세스 동기화 프리미티브는 일반적으로 데이터 동기화를 구현하는 데 사용됩니다.
동기화의 필요성
동기화는 멀티프로세서 시스템뿐만 아니라 모든 종류의 동시 프로세스에서 발생합니다.단일 프로세서 시스템에서도 마찬가지입니다.다음은 동기화가 주로 필요한 몇 가지 예입니다.
포크 및 결합:작업이 분기점에 도착하면 N개의 하위 작업으로 분할되고, 이 하위 작업은 n개의 태스크에 의해 처리됩니다.서비스된 후 각 하위 작업은 다른 모든 하위 작업의 처리가 완료될 때까지 기다립니다.그런 다음 다시 결합되어 시스템을 종료합니다.따라서 병렬 프로그래밍에서는 모든 병렬 프로세스가 다른 여러 프로세스가 발생할 때까지 대기하기 때문에 동기화가 필요합니다.
생산자-소비자:생산자-소비자 관계에서 소비자 프로세스는 필요한 데이터가 생산될 때까지 생산자 프로세스에 의존합니다.
전용 자원:여러 프로세스가 리소스에 의존하여 동시에 액세스할 필요가 있는 경우 운영체제는 특정 시점에 하나의 프로세서만 리소스에 액세스할 수 있도록 해야 합니다.이것에 의해, 동시성이 저하됩니다.
스레드 또는 프로세스 동기화
스레드 동기는 2개 이상의 동시 프로세스 또는 스레드가 크리티컬 섹션으로 알려진 특정 프로그램 세그먼트를 동시에 실행하지 않도록 하는 메커니즘으로 정의됩니다.프로세스에서 중요한 섹션에 대한 액세스는 동기화 기술을 사용하여 제어됩니다.한 스레드가 크리티컬섹션(프로그램의 시리얼화된 세그먼트) 실행을 시작하면 다른 스레드는 첫 번째 스레드가 완료될 때까지 기다려야 합니다.적절한 동기화 기술을[1] 적용하지 않으면 변수 값이 예측 불가능하고 프로세스 또는 스레드의 컨텍스트스위치의 타이밍에 따라 달라지는 레이스 상태가 발생할 수 있습니다.
예를 들어 1, 2, 3의 세 가지 프로세스가 있다고 가정합니다.이들 3개 모두 동시에 실행 중이며 그림 1과 같이 공통 리소스(중요한 섹션)를 공유해야 합니다.여기서 동기화를 사용하여 이 공유 리소스에 액세스하는 데 충돌이 발생하지 않도록 해야 합니다.따라서 프로세스 1과 2가 모두 해당 리소스에 액세스하려고 할 때는 한 번에 하나의 프로세스에만 할당해야 합니다.프로세스 1에 할당되어 있는 경우, 다른 프로세스(프로세스 2)는 프로세스 1이 리소스를 해방할 때까지 대기해야 합니다(그림 2 참조).
고려해야 할 또 하나의 동기화 요건은 특정 프로세스 또는 스레드를 실행하는 순서입니다.예를 들어 표를 사기 전에는 비행기를 탈 수 없다.마찬가지로 적절한 credential(사용자명이나 패스워드 등)을 검증하기 전에는 전자 메일을 확인할 수 없습니다.마찬가지로 ATM은 올바른 PIN을 수신할 때까지 서비스를 제공하지 않습니다.
동기화는 상호 제외 외에 다음 사항도 처리합니다.
- 교착 상태: 많은 프로세스가 다른 프로세스가 보유하고 있는 공유 리소스(중요한 섹션)를 대기하고 있을 때 발생합니다.이 경우 프로세스는 계속 대기하고 더 이상 실행되지 않습니다.
- 기아: 프로세스가 크리티컬섹션에 들어가기 위해 대기하고 있지만 다른 프로세스가 크리티컬섹션을 독점하여 첫 번째 프로세스가 무기한 대기하도록 강요될 때 발생합니다.
- priority inversion: priority가 높은 프로세스가 critical 섹션에 있고 중간 priority 프로세스에 의해 중단되었을 때 발생합니다.이러한 우선순위 규칙 위반은 특정 상황에서 발생할 수 있으며 실시간 시스템에 심각한 결과를 초래할 수 있습니다.
- busy waiting. 프로세스가 중요한 섹션에 액세스할 수 있는지 여부를 확인하기 위해 자주 폴링할 때 발생합니다.이 빈번한 폴링은 다른 프로세스에서 처리 시간을 빼앗습니다.
동기화 최소화
엑사스케일 알고리즘 설계의 과제 중 하나는 동기화를 최소화하거나 줄이는 것입니다.특히 분산 컴퓨팅에서는 동기화가 계산보다 시간이 더 걸립니다.동기화의 감소는 수십 년 동안 컴퓨터 과학자들의 관심을 끌었다.한편, 최근 컴퓨팅의 향상과 레이텐시의 갭이 커짐에 따라, 이 문제는 더욱 심각해지고 있습니다.실험에 따르면 분산 컴퓨터에서의 동기화에 의한 (글로벌) 통신은 희박한 반복 솔버에서 [2]지배적인 점유율을 차지하고 있습니다.이 문제는 상위 500대 슈퍼컴퓨터를 선정하기 위한 새로운 벤치마크 지표인 HPCG([3]High Performance Conjectate Gradient)가 등장한 후 더욱 주목받고 있습니다.
동기화에 관한 일반적인 문제
다음은 동기에 관한 일반적인 문제입니다.
- 생산자-소비자 문제(유계 버퍼 문제라고도 함)
- 독자-라이터 문제
- 식사 철학자의 문제
이러한 문제는 새로 제안된 거의 모든 동기화 방식 또는 프리미티브를 테스트하는 데 사용됩니다.
하드웨어 동기화
많은 시스템에서 중요한 섹션 코드에 대한 하드웨어 지원을 제공합니다.
단일 프로세서 또는 단일 프로세서시스템은 프리엠프션 없이 현재 실행 중인 코드를 실행함으로써 인터럽트를 비활성화할 수 있습니다.이는 멀티프로세서 [4]시스템에서는 매우 비효율적입니다.멀티프로세서에 동기화를 구현하기 위해 필요한 주요 기능은 메모리 위치를 원자적으로 읽고 수정할 수 있는 일련의 하드웨어 프리미티브입니다.이러한 기능이 없으면 기본 동기화 프리미티브 구축 비용이 너무 많이 들고 프로세서 수가 증가할수록 비용이 증가합니다.기본 하드웨어 프리미티브에는 여러 가지 대체 공식이 있습니다.이 모든 공식을 통해 위치를 원자적으로 읽고 수정할 수 있으며 읽기 및 쓰기가 원자적으로 수행되었는지 여부를 확인할 수 있습니다.이러한 하드웨어 프리미티브는 잠금 및 장벽 등의 다양한 사용자 수준 동기화 작업을 구축하는 데 사용되는 기본 구성 요소입니다.일반적으로 설계자는 사용자가 기본 하드웨어 프리미티브를 사용할 것으로 예상하지 않고 시스템 프로그래머가 이 프리미티브를 사용하여 종종 복잡하고 [5]까다로운 프로세스인 동기화 라이브러리를 구축할 것으로 예상합니다."많은 최신 하드웨어는 메모리 워드를 테스트 및 설정하거나 2개의 메모리 워드의 내용을 비교 및 스왑함으로써 특수한 원자 하드웨어 명령을 제공합니다.
프로그래밍 언어의 동기화 전략
Java에서는 스레드 간섭 및 메모리 일관성 오류를 방지하기 위해 코드 블록을 동기화된(lock_object) 섹션으로 래핑합니다.이렇게 하면 스레드가 블록을 실행하기 전에 해당 잠금 개체를 강제로 가져옵니다.잠금을 획득한 스레드가 블록을 실행 중이거나 블록을 벗어나거나 블록 내에서 대기 상태가 되면 잠금이 자동으로 해제됩니다.동기화된 블록의 스레드에 의해 작성된 변수 업데이트는 마찬가지로 잠금을 취득하고 블록을 실행하면 다른 스레드에 표시됩니다.
Java 동기화된 블록은 상호 제외 및 메모리 일관성을 가능하게 할 뿐만 아니라 시그널링을 가능하게 합니다.즉, 잠금을 취득하여 블록 내에서 잠금을 기다리는 스레드에서 코드 블록을 실행하는 이벤트를 전송합니다.즉, Java 동기화 섹션은 뮤텍스와 이벤트의 기능을 결합합니다.이러한 프리미티브를 동기 모니터라고 합니다.
Java 에서는 임의의 오브젝트를 잠금/모니터로 사용할 수 있습니다.메서드 전체가 동기화되어 있는 경우 선언 개체는 잠금 개체입니다.
.NET Framework에는 동기화 프리미티브가 있습니다."동기화는 일관된 결과를 위해 보호된 리소스(중요한 섹션)에 액세스하기 전에 모든 스레드 또는 프로세스가 동기화 메커니즘을 따르도록 설계되어 있습니다.".NET에서는 잠금, 시그널링, 경량 동기 타입, 스핀웨이트 및 인터락 조작이 [6]동기화와 관련된 메커니즘의 일부입니다.
동기화 구현
스핀록
동기화를 구현하는 또 다른 효과적인 방법은 스핀록을 사용하는 것입니다.공유 리소스 또는 코드 조각에 액세스하기 전에 모든 프로세서가 플래그를 확인합니다.플래그가 리셋되면 프로세서는 플래그를 설정하고 스레드 실행을 계속합니다.단, 플래그가 설정되어 있는 경우(잠금되어 있는 경우), 스레드는 루프로 계속 회전하며 플래그가 설정되어 있는지 여부를 계속 확인합니다.단, 스핀록은 플래그가 낮은 사이클로 리셋되어 있는 경우에만 유효합니다.그렇지 않으면 많은 프로세서의 사이클이 [7]대기하고 있기 때문에 퍼포먼스 문제가 발생할 수 있습니다.
장벽
장벽은 구현이 간단하며 뛰어난 응답성을 제공합니다.이들은 동기화를 제공하기 위해 대기 사이클을 구현한다는 개념을 기반으로 합니다.장벽 1에서 시작하여 3개의 스레드가 동시에 실행되고 있다고 가정합니다.시간 t가 지나면 스레드1은 장벽2에 도달하지만 올바른 데이터가 없기 때문에 스레드2와 스레드3이 장벽2에 도달하기를 기다려야 합니다.모든 스레드가 장벽 2에 도달하면 다시 시작됩니다.시간 t가 지나면 스레드1은 barrier3에 도달하지만 스레드2와 스레드3과 올바른 데이터를 다시 기다려야 합니다.
따라서 여러 스레드의 장벽 동기화에서는 위의 예에서 스레드1이 스레드2와 3을 계속 대기하고 있기 때문에 다른 스레드를 대기하게 되는 스레드는 항상 몇 개 존재합니다.이로 인해 프로세스 [8]성능이 크게 저하됩니다.
i 스레드의 장벽th 동기화 대기 기능은 다음과 같이 나타낼 수 있습니다.
(배리어)i = f ((배리어)i, (Rthread)i)i
여기서 Wbarrier는 스레드의 대기시간, Tbarrier는 도착한 스레드의 수, Rthread는 [9]스레드의 도착 레이트입니다.
실험 결과 전체 실행 시간의 34%가 다른 느린 [8]스레드를 기다리는 데 소비되는 것으로 나타났습니다.
세마포어
세마포어는 하나 이상의 스레드/프로세서가 섹션에 액세스할 수 있도록 하는 시그널링 메커니즘입니다.Semaphore에는 특정 고정값을 가진 플래그가 있으며 스레드가 섹션에 액세스하려고 할 때마다 플래그가 감소합니다.마찬가지로 스레드가 섹션을 벗어나면 플래그가 증가합니다.플래그가 0인 경우 스레드는 섹션에 액세스할 수 없으며 대기하도록 선택하면 차단됩니다.
일부 세마포어는 코드 섹션에 스레드 또는 프로세스를 하나만 허용합니다.이러한 세마포어는 바이너리 세마포라고 불리며 뮤텍스와 매우 유사합니다.여기서 세마포의 값이 1이면 스레드의 액세스가 허용되고 값이 0이면 액세스가 [10]거부됩니다.
수학적 기초
동기화는 원래 객체에서 잠금을 얻을 수 있는 프로세스 기반 개념이었습니다.그 주된 용도는 데이터베이스였다.(파일) 잠금에는 읽기 전용과 읽기-쓰기 두 가지 유형이 있습니다.읽기 전용 잠금은 많은 프로세스 또는 스레드를 통해 얻을 수 있습니다.리더/라이터 잠금은 한 번에 하나의 프로세스/스레드에서만 사용할 수 있기 때문에 배타적입니다.
파일 데이터베이스에 대한 잠금이 생성되었지만 데이터는 프로세스와 스레드 간에 메모리에서도 공유됩니다.한 번에 여러 개체(또는 파일)가 잠길 수 있습니다.동시에 잠기지 않으면 오버랩되어 데드록 예외가 발생할 수 있습니다.
Java와 Ada는 스레드 기반이며 비교 및 스왑 프로세서 명령에 의존하기 때문에 독점 잠금만 있습니다.
동기 원소를 위한 추상적인 수학적 기초는 이력 모노이드에 의해 주어진다.히스토리 모노이드 위에 구축할 수 있는 프로세스 계산, 페트리 네트 등 높은 수준의 이론 장치도 많이 있습니다.
동기화 예시
다음으로 다른 [11]플랫폼과 관련된 동기 예를 몇 가지가지 나타냅니다.
Windows에서의 동기화
Windows의 특징:
- 인터럽트 마스크: 유니프로세서 시스템상의 글로벌자원(중요한 섹션)에 대한 접근을 보호합니다.
- 멀티프로세서 시스템에서 스핀록킹이 프리엠프션되는 것을 방지하는 스핀록
- 다이내믹 디스패처[citation needed]: 뮤텍스, 세마포어, 이벤트 및 타이머와 같이 동작합니다.
Linux에서의 동기화
Linux는 다음을 제공합니다.
- 세마포어
- 스핀록
- 장벽
- 뮤텍스
- 매우 자주 액세스하지만 자주 변경되지 않는 코드의 긴 부분에 대한 리더-라이터 잠금.
- Read-copy-update(RCU;[12] 읽기 복사 업데이트)를 실행합니다.
커널 프리엠프션을 활성화 및 비활성화하면 유니프로세서 시스템의 스핀록이 대체되었습니다.커널 버전 2.6보다 이전 버전에서는 Linux는 인터럽트를 비활성화하여 짧은 크리티컬 섹션을 구현했습니다.버전 2.6 이후 Linux는 완전 프리엠프티브입니다.
Solaris에서의 동기화
Solaris의 특징:
Pthreads 동기화
Pthreads는 다음 기능을 제공하는 플랫폼에 의존하지 않는 API입니다.
- 뮤텍스
- 조건 변수
- 리더-라이터 잠금
- 스핀록
- 장벽이 있습니다.
데이터 동기화
명확하게 다른 (그러나 관련된) 개념은 데이터 동기화입니다.즉, 데이터 세트의 여러 복사본을 서로 일관되게 유지하거나 데이터 무결성을 유지해야 합니다(그림 3).예를 들어, 데이터베이스 복제는 데이터를 서로 다른 위치에 저장하는 데이터베이스 서버와 동기화된 데이터의 여러 복사본을 유지하는 데 사용됩니다.
예를 들어 다음과 같습니다.
- 휴대용 MP3 플레이어를 데스크톱 컴퓨터와 동기화하는 등의 파일 동기화
- 클러스터 파일 시스템: 컴퓨팅 클러스터 전체에서 일관된 방식으로 데이터 또는 인덱스를 유지하는 파일 시스템입니다.
- 캐시 일관성: 여러 캐시 간에 동기화된 여러 데이터 복사본을 유지합니다.
- RAID: 여러 디스크에 걸쳐 중복된 방식으로 데이터를 쓰기 때문에 디스크 1개가 손실되어도 데이터가 손실되지 않습니다.
- 데이터베이스 리플리케이션: 지리적으로 큰 분리가 가능하더라도 데이터베이스 상의 데이터 복사본은 동기화된 상태로 유지됩니다.
- 저널링은 많은 최신 파일 시스템에서 사용되는 기술로, 파일 메타데이터가 일관성 있고 일관된 방식으로 Disk에서 업데이트되도록 보장합니다.
데이터 동기화 과제
데이터 동기화 시 사용자가 직면할 수 있는 몇 가지 문제는 다음과 같습니다.
- 데이터 형식의 복잡성
- 리얼타임성
- 데이터 보안
- 데이터 품질
- 성능.
데이터 포맷의 복잡성
조직의 성장과 발전에 따라 데이터 형식은 시간이 지남에 따라 더욱 복잡해지는 경향이 있습니다.따라서 두 애플리케이션(소스 및 타깃) 간에 단순한 인터페이스를 구축할 뿐만 아니라 데이터를 변환하면서 타깃 애플리케이션에 전달해야 합니다.ETL(Extraction Transformation Loading) 도구는 이 단계에서 데이터 형식의 복잡성을 관리하는 데 유용합니다.
리얼 타임리티
실시간 시스템에서 고객은 e-shop에서의 주문 현황, 소포 배달 현황(실시간 소포 추적), 계좌 잔액 등을 확인하고자 합니다.이는 기업의 재고 부족 시 자재 주문, 고객 주문 및 제조 공정 동기화 등 원활한 제조 공정을 실시간으로 실현하기 위해 업데이트되는 실시간 시스템의 필요성을 보여줍니다.실제 생활에서 실시간 프로세싱이 성공적이고 경쟁력 있는 이점을 제공하는 예는 매우 많습니다.
데이터 보안
데이터 보안을 적용하는 고정 규칙 및 정책은 없습니다.사용하는 시스템에 따라 다를 수 있습니다.데이터를 캡처하는 소스 시스템에서 보안이 올바르게 유지되더라도 정보의 오남용을 방지하기 위해 대상 시스템에 보안 및 정보 접근 권한을 적용해야 합니다.이는 심각한 문제이며, 특히 비밀, 기밀 및 개인 정보를 취급하는 경우에는 더욱 그렇습니다.따라서 기밀성과 기밀성 때문에 데이터 전송 및 그 사이의 모든 정보를 암호화해야 합니다.
데이터 품질
데이터 품질은 또 다른 심각한 제약 사항입니다.보다 나은 관리와 우수한 데이터 품질을 유지하기 위해 일반적으로 데이터를 한 곳에 저장하고 서로 다른 사용자, 서로 다른 시스템 및/또는 애플리케이션과 공유하는 것이 일반적입니다.데이터의 불일치를 방지하는 데 도움이 됩니다.
성능
데이터 동기화 프로세스에는 5가지 단계가 있습니다.
이러한 각 단계는 매우 중요합니다.대량의 데이터가 있는 경우 성능에 부정적인 영향을 미치지 않도록 동기 프로세스를 신중하게 계획하고 실행해야 합니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Gramoli, V. (2015). More than you ever wanted to know about synchronization: Synchrobench, measuring the impact of the synchronization on concurrent algorithms (PDF). Proceedings of the 20th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming. ACM. pp. 1–10.
- ^ Shengxin, Zhu and Tongxiang Gu and Xingping Liu (2014). "Minimizing synchronizations in sparse iterative solvers for distributed supercomputers". Computers & Mathematics with Applications. 67 (1): 199–209. doi:10.1016/j.camwa.2013.11.008.
- ^ "HPCG Benchmark".
- ^ Silberschatz, Abraham; Gagne, Greg; Galvin, Peter Baer (July 11, 2008). "Chapter 6: Process Synchronization". Operating System Concepts (Eighth ed.). John Wiley & Sons. ISBN 978-0-470-12872-5.
- ^ Hennessy, John L.; Patterson, David A. (September 30, 2011). "Chapter 5: Thread-Level Parallelism". Computer Architecture: A Quantitative Approach (Fifth ed.). Morgan Kaufmann. ISBN 978-0-123-83872-8.
- ^ "Synchronization Primitives in .NET framework". MSDN, The Microsoft Developer Network. Microsoft. Retrieved 23 November 2014.
- ^ Massa, Anthony (2003). Embedded Software Development with ECos. Pearson Education Inc. ISBN 0-13-035473-2.
- ^ a b Meng, Chen, Pan, Yao, Wu, Jinglei, Tianzhou, Ping, Jun. Minghui (2014). "A speculative mechanism for barrier sychronization". 2014 IEEE International Conference on High Performance Computing and Communications (HPCC), 2014 IEEE 6th International Symposium on Cyberspace Safety and Security (CSS) and 2014 IEEE 11th International Conference on Embedded Software and Systems (ICESS).
{{cite journal}}
: CS1 maint: 여러 이름: 작성자 목록(링크) - ^ Rahman, Mohammed Mahmudur (2012). "Process synchronization in multiprocessor and multi-core processor". 2012 International Conference on Informatics, Electronics & Vision (ICIEV). pp. 554–559. doi:10.1109/ICIEV.2012.6317471. ISBN 978-1-4673-1154-0.
- ^ Li, Yao, Qing, Carolyn (2003). Real-Time Concepts for Embedded Systems. CMP Books. ISBN 978-1578201242.
- ^ Silberschatz, Abraham; Gagne, Greg; Galvin, Peter Baer (December 7, 2012). "Chapter 5: Process Synchronization". Operating System Concepts (Ninth ed.). John Wiley & Sons. ISBN 978-1-118-06333-0.
- ^ "What is RCU, Fundamentally? [LWN.net]". lwn.net.
- ^ Mauro, Jim. "Turnstiles and priority inheritance - SunWorld - August 1999". sunsite.uakom.sk.
- Schneider, Fred B. (1997). On concurrent programming. Springer-Verlag New York, Inc. ISBN 978-0-387-94942-0.