Redis의 몇 가지 기본 사항을 파악하려고 노력하면서 흥미로운 블로그 게시물을 발견했습니다 .
저자는 다음과 같이 말합니다.
Redis는 epoll / kqueue가있는 단일 스레드이며 I / O 동시성 측면에서 무기한으로 확장됩니다.
나는이 진술이 수수께끼를 찾기 때문에 전체 스레딩을 오해합니다. 프로그램이 단일 스레드 인 경우 어떻게 동시에 작업합니까? 서버가 단일 스레드 인 경우 Redis 작업이 원자력이되는 이유는 무엇입니까?
아무도이 문제에 대해 밝힐 수 있습니까?
답변
그것은 동시성을 정의하는 방법에 달려 있습니다.
서버 측 소프트웨어에서 동시성과 병렬 처리는 종종 다른 개념으로 간주됩니다. 서버에서 동시 I / O를 지원한다는 것은 서버가 하나의 계산 단위로 해당 클라이언트에 해당하는 여러 흐름을 실행하여 여러 클라이언트에 서비스를 제공 할 수 있음을 의미합니다. 이와 관련하여 병렬 처리는 서버가 여러 계산 단위를 사용하여 동시에 여러 작업을 수행 할 수 있음을 의미합니다.
예를 들어 바텐더는 한 번에 하나의 음료 만 준비 할 수있는 동시에 여러 고객을 돌볼 수 있습니다. 따라서 병렬 처리없이 동시성을 제공 할 수 있습니다.
이 질문은 여기서 논의되었습니다 :
동시성과 병렬 처리의 차이점은 무엇입니까?
Rob Pike의 프레젠테이션 도 참조하십시오 .
단일 스레드 프로그램은 I / O (다중화) 멀티플렉싱 메커니즘과 이벤트 루프 (Redis가 수행하는 작업)를 사용하여 I / O 수준에서 동시성을 제공 할 수 있습니다.
병렬 처리에는 비용이 듭니다. 최신 하드웨어에서 찾을 수있는 다중 소켓 / 다중 코어를 사용하면 스레드 간 동기화 비용이 매우 높습니다. 반면에 Redis와 같은 효율적인 스토리지 엔진의 병목 현상은 CPU보다 훨씬 앞서 네트워크입니다. 따라서 격리되지 않은 이벤트 루프 (동기화가 필요하지 않음)는 효율적이고 확장 가능한 서버를 구축하기에 적합한 디자인으로 간주됩니다.
Redis 작업이 원 자성이라는 사실은 단순히 단일 스레드 이벤트 루프의 결과입니다. 흥미로운 점은 원 자성이 추가 비용없이 제공된다는 것입니다 (동기화가 필요하지 않음). 사용자는 동기화 오버 헤드를 지불하지 않고도 낙관적 잠금 및 기타 패턴을 구현할 수 있습니다.
답변
Redis는 사용자 수준 OTOH에서 단일 스레드이며 모든 비동기 I / O는 커널 스레드 풀 및 / 또는 분할 수준 드라이버에서 지원됩니다.
‘ 동시 ‘는 일부 네트워크 이벤트를 소켓 상태 머신에 분배하는 것을 포함합니다. 단일 스레드이며 하나의 코어에서 (사용자 수준에서) 실행되므로이를 동시라고는 언급하지 않습니다. 다른 사람 ..
‘ I / O 동시성 측면에서 무기한 확장 ‘은 진실과 함께 경제적입니다. 그들은 ‘클라이언트 당 하나의 스레드보다 더 나은 확장 성을 제공하여 고객이 많이 요구하지 않음’이라고 말하면 더 많은 신뢰를 얻을 수 있지만 다른 비동기 솔루션으로 인해 많은 양의 로딩에 불을 붙일 필요가 있다고 느낄 수 있습니다 사용자 수준에서 모든 코어를 사용합니다. ‘