Table of Contents
이 문서는 번역, 번역, 번역, 번역, 번역, 편집, 번역, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집
통화 란 무엇입니까?
Concurrency는 시스템의 능력을 통해 여러 작업을 처리 할 수 있습니다. 그것은 반드시 같은 정확한 즉시 (]parallelism])에서 실행되는 것을 의미하지는 않지만, 시스템은 실행을 넓히기 위해 여러 작업을 진행할 수 있습니다. Concurrency는 처리량과 응답성을 향상시키고, 특히 I/O-bound 또는 대화형 애플리케이션에서.
Concurrency는 몇몇 기계장치를 통해서 달성될 수 있습니다:
- Multithreading – 단일 프로세스 내에서 여러 스레드.
- Multiprocessing – 별도의 CPU 코어에서 실행할 수 있는 여러 프로세스.
- Asynchronous 프로그래밍 – 호출백, 미래, 또는 동기화/와이트를 사용하여 여러 작업을 처리하기 위해 단일 스레드를 허용하는 비 차단 작업.
현대 운영 체제 및 런타임은 스레드, 프로세스 및 이벤트 루프와 같은 통화 원시를 제공합니다. 이러한 접근 방식 사이의 거래 오프를 이해하는 것은 엔지니어를 위한 기초 기술입니다.
concurrency 모델에 더 깊은 다이빙을 위해 ]Wikipedia 기사를 concurrency를 읽어보십시오.
Multithreading에 대한 이해
Multithreading은 동일한 메모리 공간과 리소스를 공유하는 단일 프로세스가 여러 스레드를 훔치는 concurrency의 특정 구현입니다. 각 스레드는 자체 통화 스택과 프로그램 카운터를 가지고 있지만 프로세스 내에서 모든 스레드는 읽을 수 있으며 공유 할 수 있습니다. 이 공유 된 액세스는 힘과 취약점 모두입니다.
멀티 스레드의 주요 측면은 다음과 같습니다 :
- Thread 생성 및 관리 – 스레드는 겉으로 만들거나 오버 헤드를 피하기 위해 스레드 풀에 의해 관리 할 수 있습니다.
- Thread Lifecycle – 새로운, runnable, blocked, waiting, timed 대기, 종료와 같은 상태.
- Context switching – 나사간의 OS 스위치는 일부 오버 헤드를 발생시킵니다.
- Shared resource – 데이터 구조, 파일 및 연결은 동시 접속에서 보호되어야 합니다.
Multithreading은 특히 CPU-bound 작업에 유용합니다. 즉, 이미지 처리, 과학 시뮬레이션) 및 스레드가 데이터를 기다릴 수 있는 I/O-bound 작업에 대한 다른 사람들은 계속 작동 (예 : 웹 서버) 동안. 그러나 잘못된 사용은 인종 조건, deadlocks 및 의도적 상태와 같은 하위 버그로 이어질 수 있습니다.
Java 멀티 스레드에 대한 실용적인 지침을 위해, Oracle Java Concurrency tutorial는 훌륭한 자원입니다.
Concurrency 및 Multithreading 사이 주요 차이점
종종 교환 할 수 있지만, 통화 및 멀티 스레드는 명백한 개념입니다. 아래 표는 주요 차이를 강조합니다 (매틱리스트를 사용) :
- Concurrency는 시스템의 속성이며, 동시에 여러 작업을 처리할 수 있습니다. 멀티, 멀티 처리 또는 비동기 기술을 통해 달성될 수 있습니다.
- Multithreading은 단일 프로세스 내에서 여러 스레드를 사용하여 통화를 달성하는 프로그래밍 기술입니다.
- Concurrency는 한 번에 여러 작업을 처리 할 수있는 structuring 프로그램에 중점을두고 다행히도 저수준 구현 세부 사항입니다.
- Multithreading은 인종 조건 및 기억 일관성 문제와 같은 문제를 소개하는 공유 메모리를 포함합니다. 높은 수준의 통화 (예 : 배우 모델)는 공유 상태를 피할 수 있습니다.
- 시스템은 스레드를 사용하지 않고 동시 할 수 있습니다 (예 : 단일 스레드와 함께 이벤트 구동 프로그래밍).
- True Parallelism은 여러 CPU 코어를 필요로하지만, concurrency는 시간 접합을 통해 단일 코어에 시뮬레이션 할 수 있습니다.
엔지니어를 위한 일반적인 Concurrency 및 Multithreading 질문
엔지니어는 종종 동시 프로그램 및 디버그 멀티 스레드 코드에 대한 이유를 테스트합니다. 아래는 상세한 설명과 함께 몇 가지 확장 된 질문입니다.
1. 당신은 어떻게 인종 조건을 방지합니까?
레이스 상태는 두 개 이상의 스레드 액세스 공유 데이터 동시 액세스 및 최종 결과가 실행의 타이밍에 따라 발생합니다. 예방 전략은 다음과 같습니다.
- Mutexes (locks)] – 한 스레드만 한 번에 중요한 부분을 입력할 수 있습니다.
- Semaphores – 자원의 무한한 풀에 대한 액세스를 제어합니다.
- Atomic operation – 간단한 업데이트에 대한 CPU 레벨 지침(예: 비교 및 교환)을 사용합니다.
- 읽기-쓰기 잠금 – concurrent reads 하지만 독점 쓰기 허용.
- Immutable object – 전적으로 수정할 수 없는 데이터를 공유합니다.
- Thread-local storage] – 각 스레드를 데이터의 사본을 제공합니다.
메커니즘의 선택은 공유 자원과 필수 성능 특성의 본질에 따라 달라집니다.
2. deadlock는 무엇입니까, 그리고 어떻게 피할 수 있습니까?
Deadlock는 두 개 이상의 스레드가 서로 다른 스레드에 의해 개최 된 리소스에 대한 각 대기, 무한하게 갖춰. deadlock의 고전적인 조건은 다음과 같습니다 : 상호 exclusion, hold-and-wait, preemption, 원형 대기. 피임 기술 포함 :
- Resource hierarchy – 리소스에 대한 글로벌 주문 할당 및 그 순서에 잠금을 취득하기 위해 스레드가 필요합니다.
- Timeouts – 특정 기간과 재시동 후 잠금을 해제합니다.
- Deadlock detection – deadlocks가 발생하지만 그(그)를 깰 메커니즘을 가지고 있습니다. 스레드를 종료합니다.
- Lock-free 프로그래밍 – altogether를 방지하기 위해 원자 작업을 사용합니다.
엔지니어는 신중하게 설계 잠금 수집 패턴 및 잠재적 deadlocks를 잡기 위해 무거운 concurrency의 밑에 테스트해야합니다.
3. 실 동기화 충격 성과는 어떻게 합니까?
동기화는 데이터 일관성을 보장하지만 오버 헤드를 소개합니다. 주요 성능 거래 기능은 다음과 같습니다.
- Contention - 많은 실이 동일한 자물쇠를 취득하려고 할 때, 그들은 직렬화 실행, 병렬화를 감소.
- Context switching – 고정되는 나사는 OS를 전환하는 컨텍스트를 강제로, 값 비싼.
- Cache coherency – 메모리 트래픽을 증가하는 CPU 캐시를 무균 데이터의 공유.
- Granularity – coarse-grained locks(e.g., 단일 글로벌 lock)은 정확하지만 제한적인 concurrency을 단순화합니다. 정밀한 grained locks(e.g., per-element lock)은 병렬성을 향상시키고, 복잡성 및 위험 deadlock을 향상시킵니다.
잠금 스트립, 읽기 쓰기 잠금, 동시 데이터 구조 (예를 들어, ])와 같은 현대 전략은 균형 안전과 속도를 돕습니다.
4. Java/C#의 키워드를 설명합니다. 어떤 문제가 해결됩니까?
키워드는 변수의 값이 항상 스레드 로컬 캐싱 방지를 위해 메인 메모리에 쓰여져서 쓰여져 있다는 것을 보증합니다. 가시적 문제를 해결합니다. 휘발성 변수에 쓰기는 모든 스레드에 즉시 볼 수 있습니다. 그러나 는 ]not는 화합물 작업에 대한 원자성을 보장합니다 (예:, ). 그것은 사용하거나 또는 나사를 위해 사용하는 것이 유용합니다.
5. 실 수영장은 무엇이며, 하나를 사용해야 할 때?
스레드 풀은 작업을 실행하기 위해 재사용 될 수있는 사전 제작 스레드의 모음입니다. 이점은 스레드 생성 및 찢어짐, 향상된 응답 시간 및 제어 된 리소스 사용에서 과 헤드를 감소 포함합니다. 스레드 풀은 HTTP 요청을 제공하는 것과 같은 많은 부족 또는 I / O-bound 작업을 처리하는 데 이상적입니다. 일반적인 구현에는 Java 및 [[FLT : 5]]에서 [FLT : 6]]이 포함됩니다. 파이썬에서.
관리는 적절하게 풀을 크기로 가져야한다 : 너무 적은 스레드는 CPU 코어를 뺀다. 너무 많은 원인은 과도한 컨텍스트 전환 및 메모리 소비.
6. Amdahl의 법은 무엇이며 왜 다발적 인 성능에 대한 문제입니까?
Amdahl의 법은 여러 프로세서를 사용하여 프로그램의 속도가 제한되는 것을 주장한다. Mathematically : [[FLT :0]]Speedup = 1 / (1 - P) + P / N) [[[FLT :1]], P는 병렬화 된 분수 및 N은 프로세서의 수입니다. 예를 들어, 코드의 10 %가 순차적으로 실행되면 무한 코어가 10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10x10
Concurrency와 함께 일하는 엔지니어를위한 모범 사례
강력한 고성능 동시 코드를 작성하려면 다음 지침을 따르십시오.
- Prefer 상급 요약 – 사용 executor 서비스, 실 풀, 그리고 동시 수집 대신 원료 실 관리.
- Immutable data first – 가능한 한 공유된 mutable state를 피합니다. immutable object 또는 copy-on-write 패턴을 사용하십시오.
- Minimize lock range – 중요한 작업을 수행하는 데 필요한 가장 짧은 시간에만 잠금을 보유합니다.
- 간단한 작업에 대한 잠금없는 알고리즘을 사용 – 원자 변수와 비교 및 스왑은 잠금보다 더 효율적일 수 있습니다.
- ]실제 통화의 밑에 테스트] – 인종, deadlocks 및 데이터 손상을 감지하기 위해 스트레스 테스트 도구 및 스레드 위생기를 사용합니다.
- Document 동기화 계약 – 변수가 나사 안전이며, 이를 차단하는 것은 분명한 상태입니다.
- Consider Alternatives – 아나운서 모델(예: Akka), 메시지 전달, 또는 공유 상태를 줄이기 위해 민감하는 스트림을 검사합니다.
언더리닝 플랫폼(예: Java Memory Model, POSIX Threads, Python GIL)의 철저한 이해는 확률적인 행동을 디버깅하기 위해 필수적입니다.
관련 기사
이 문서는 번역, 번역, 번역, 번역, 번역, 번역, 번역, 편집, 번역, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집, 편집
더 읽기를 위해 GeeksforGeeks concurrency article 및 ]에 대한 종합 가이드바 Baeldung에서 통화합니다.