시스템 튜토리얼 리눅스 Linux 커널의 RCU 메커니즘에 대한 자세한 설명

Linux 커널의 RCU 메커니즘에 대한 자세한 설명

Feb 10, 2024 pm 09:09 PM
linux 리눅스 튜토리얼 리눅스 시스템 동시 접속 리눅스 명령 쉘 스크립트 동기화 메커니즘 임베디드리눅스 리눅스 시작하기 리눅스 학습

Linux 커널은 프로세스 스케줄링, 메모리 관리, 장치 드라이버, 네트워크 프로토콜 등과 같은 다양한 동시성 문제를 처리해야 하는 복잡한 시스템입니다. 데이터의 일관성과 정확성을 보장하기 위해 Linux 커널은 스핀 잠금, 세마포어, 읽기-쓰기 잠금 등과 같은 다양한 동기화 메커니즘을 제공합니다. 그러나 이러한 동기화 메커니즘에는 다음과 같은 몇 가지 단점이 있습니다.

Linux 커널의 RCU 메커니즘에 대한 자세한 설명

  • 스핀 잠금은 CPU가 바쁜 대기 시간을 낭비하게 하며 선점형 커널에서는 사용할 수 없습니다. 세마포어는 프로세스를 절전 모드 및 절전 모드로 전환하여 컨텍스트 전환 오버헤드를 증가시킵니다.
  • 읽기-쓰기 잠금은 작가 기아 또는 독자 기아를 유발하며, 작가보다 독자가 더 많은 경우 작가는 잠금 획득에 대한 오버헤드도 지불해야 합니다.
  • 그렇다면 더 나은 동기화 메커니즘이 있을까요? 대답은 '예', 즉 RCU(Read Copy Update)입니다. RCU는 효율적인 읽기 작업과 낮은 지연 시간의 업데이트 작업을 달성할 수 있는 게시-구독 모델을 기반으로 하는 동기화 메커니즘입니다. RCU의 기본 아이디어는 다음과 같습니다.

읽기 작업에서는 잠금을 획득할 필요가 없습니다. rcu_read_lock() 및 rcu_read_unlock()을 사용하여 중요 영역을 표시하세요.
  • 업데이트 작업을 수행하려면 먼저 데이터 복사본을 만들고 복사본을 수정한 다음 rcu_sign_pointer()를 사용하여 새 데이터를 게시하고 call_rcu() 또는 sync_rcu()를 사용하여 모든 읽기 작업이 완료될 때까지 기다려야 합니다. 오래된 데이터.
  • RCU의 장점은 무엇인가요? 다음과 같은 기능이 있습니다:

RCU는 잠금 경쟁과 컨텍스트 전환을 줄이고 시스템의 동시성 성능과 응답성을 향상할 수 있습니다.
    RCU는 교착 상태 및 우선 순위 반전과 같은 문제를 방지하여 프로그래밍 모델을 단순화할 수 있습니다.
  • RCU는 실시간 시스템, NUMA 시스템, SMP 시스템 등과 같은 다양한 시나리오에 적응할 수 있습니다. RCU는 스핀 잠금, 원자 작업 등과 같은 다른 동기화 메커니즘과 함께 사용할 수 있습니다.
  • 그렇다면 RCU는 어떻게 작동하나요? 어떤 응용 시나리오가 있습니까? 이 기사에서는 원리와 적용이라는 두 가지 측면에서 RCU의 효율적인 동기화 메커니즘을 소개합니다. RCU의 설계 아이디어는 비교적 명확하며 기존 포인터와 새 포인터를 교체하여 잠금 없는 공유 보호를 달성합니다. 하지만 코드 수준으로 보면 여전히 이해하기가 다소 어렵습니다. "심층 Linux 장치 드라이버 커널 메커니즘"의 4장에서는 RCU 뒤에 따르는 규칙을 매우 명확하게 설명했습니다. 이러한 규칙은 너무 많은 코드 분석이 쉽다고 생각하기 때문에 상대적으로 높은 관점에서 볼 수 있습니다. 세부 사항에서. 최근 책을 받고 다시 RCU 부분의 텍스트를 주의 깊게 읽어보았고, 책에 쓰기에 적합하지 않은 내용도 있을 수 있으니 내용을 조금 더 추가해야겠다는 생각이 들었습니다.
  • RCU 읽기 측이 임계 섹션에 진입했다는 신호는 rcu_read_lock을 호출하는 것입니다.
  • 으아아아
  • 이 구현에는 세 가지 함수 호출이 있는 것으로 보이지만 실제 작업은 첫 번째 함수 __rcu_read_lock()에 의해 수행됩니다. __rcu_read_lock()은 preempt_disable()을 호출하여 커널 선점성을 끕니다. 그러나 인터럽트는 허용됩니다. 리더가 rcu 임계 섹션에 있고 공유 데이터 영역에서 포인터 p를 읽었다고 가정합니다(그러나 아직 p의 데이터 멤버에 액세스하지 않았습니다). 인터럽트 처리 예는 다음과 같습니다. ISR은 p가 가리키는 데이터 영역을 수정해야 합니다. RCU의 설계 원칙에 따라 ISR은 동일한 크기의 데이터 영역 new_p를 새로 할당한 다음 이전 데이터 영역 p의 데이터를 새 데이터 영역에 복사합니다. 데이터 영역, 그리고 new_p에서 기본적으로 데이터 수정 작업을 수행합니다(new_p 공간에서 수정되기 때문에 p에 대한 동시 액세스가 없으므로 RCU는 잠금 없는 메커니즘이고 이것이 이유입니다). 데이터 업데이트 작업을 완료하고 new_p를 p에 할당하고(p=new_p) 마지막으로 적절한 시점에 이전 포인터 p를 해제하는 콜백 함수를 등록합니다. 따라서 이전 포인터 p에 대한 모든 참조가 끝나면 p를 해제하는 데 문제가 없습니다. 인터럽트 처리 루틴이 이러한 작업을 완료하고 돌아올 때, 인터럽트된 프로세스는 여전히 p 공간의 데이터, 즉 이전 데이터에 액세스합니다. 이 결과는 RCU 메커니즘에 의해 허용됩니다. RCU 규칙은 판독기와 기록기 간의 포인터 전환으로 인해 발생하는 일시적인 리소스 보기 불일치를 허용합니다
  • .

RCU에 대한 다음 흥미로운 질문은 이전 포인터를 언제 출시할 수 있느냐는 것입니다. 내가 많은 책에서 본 이에 대한 대답은 시스템의 모든 프로세서에서 프로세스 전환이 발생할 때입니다. 이 정형화된 대답은 종종 RCU 메커니즘을 처음 접하는 독자들을 혼란스럽게 합니다. 이전 포인터를 해제하기 위해 콜백 함수를 호출하기 전에 모든 프로세서에서 프로세스 전환이 발생할 때까지 기다려야 하는 이유는 무엇입니까? 이는 실제로 RCU의 설계 규칙에 의해 결정됩니다. 이전 포인터에 대한 모든 참조는 rcu_read_lock 및 rcu_read_unlock에 포함된 임계 섹션에서만 발생할 수 있으며 이 임계 섹션에서는 프로세스 전환이 불가능합니다. , 일단 임계 섹션은 더 이상 이전 포인터 p에 대한 참조 형식이 없습니다. 분명히 이 규칙은 리더가 임계 섹션의 프로세스를 전환할 수 없도록 요구합니다. 프로세스 전환이 발생하면 이전 포인터를 해제하는 콜백 함수가 호출되어 전환된 프로세스가 해제될 때 이전 포인터가 해제될 수 있기 때문입니다. 다시 예약되면 해제된 메모리 공간을 참조할 수 있습니다.

이제 rcu_read_lock이 커널 선점형만 꺼야 하는 이유를 알 수 있습니다. 임계 섹션에서 인터럽트가 발생하더라도 현재 프로세스를 전환하고 제거하는 것이 불가능하기 때문입니다. 커널 개발자, 아니 오히려 RCU 설계자가 할 수 있는 일은 너무 많습니다. 다음 단계는 사용자의 책임입니다. RCU의 임계 영역에서 함수가 호출되면 해당 함수가 휴면 상태가 되어 RCU의 설계 규칙을 위반하게 되고 시스템이 불안정한 상태에 들어가게 됩니다.

이것은 무언가를 사용하려면 그 내부 메커니즘을 이해해야 함을 다시 한번 보여줍니다. 방금 언급한 예처럼 지금은 프로그램에 문제가 없더라도 시스템에 숨겨진 위험은 시한폭탄과 같습니다. , 이는 언제든지 폭발할 수 있으며, 특히 문제가 갑자기 발생하기까지 오랜 시간이 걸리는 경우 더욱 그렇습니다. 대부분의 경우, 문제를 찾는 데 걸리는 시간은 진정하고 RCU의 원리를 주의 깊게 이해하는 데 걸리는 시간보다 훨씬 더 길 수 있습니다.

RCU의 리더는 rwlock의 리더보다 자유도가 더 높습니다. RCU 리더는 공유 리소스에 접근할 때 작성자의 감정을 고려할 필요가 없기 때문에 rwlock 작성자와는 다릅니다. rwlock 리더는 공유 리소스를 읽을 때 해당 리소스를 작동하는 작성자가 없는지 확인해야 합니다. 두 가지의 차이점은 RCU가 리더와 작성자 간의 공유 리소스를 분리하는 반면, rwlock 리더와 작성자는 처음부터 끝까지 공유 리소스의 복사본 하나만 사용한다는 점에서 비롯됩니다. 이는 또한 RCU의 작성자가 더 많은 책임을 져야 함을 의미하며 동일한 공유 리소스를 업데이트하는 여러 작성자 간에 일종의 상호 배제 메커니즘이 도입되어야 하므로 RCU는 "잠금 없는 메커니즘"입니다. 작가. 따라서 우리는 읽기 작업이 많고 업데이트 작업이 상대적으로 적은 상황에서 RCU 메커니즘을 사용해야 함을 알 수 있습니다. 이때 RCU의 읽기 작업은 다른 잠금 메커니즘에 비해 잠금 오버헤드가 거의 없기 때문에 RCU는 시스템 성능을 크게 향상시킬 수 있습니다.

실제 사용 시 공유 리소스는 연결 목록 형태로 존재하는 경우가 많습니다. 커널은 RCU 모드에서 연결 목록 작업을 위한 여러 인터페이스 기능을 구현합니다. list_add_tail_rcu, list_add_rcu, hlist_replace_rcu 등과 같은 커널 기능을 사용해야 합니다. 특정 사용법에 대해서는 일부 커널 프로그래밍이나 장치 드라이버 정보를 참조하십시오.

오래된 포인터를 해제하는 측면에서 Linux 커널은 사용자가 사용할 수 있는 두 가지 방법을 제공합니다. 하나는 call_rcu를 호출하는 것이고, 다른 하나는 동기화_rcu를 호출하는 것입니다. 전자는 비동기 방식입니다. call_rcu는 이전 포인터를 노드에 해제하는 콜백 함수를 넣은 다음 현재 call_rcu를 실행 중인 프로세서의 로컬 연결 목록에 노드를 추가합니다. 클럭 인터럽트(RCU_SOFTIRQ)의 부분입니다. , rcu 소프트 인터럽트 처리 함수 rcu_process_callbacks는 현재 프로세서가 절전 기간(커널 프로세스 스케줄링 및 기타 측면을 포함하는 정지)을 경험했는지 여부를 확인합니다. rcu의 커널 코드 구현은 시스템의 모든 프로세서가 절전 후를 경험했는지 확인합니다. 기간(모든 프로세서에서 프로세스 전환이 발생했기 때문에 이때 이전 포인터를 안전하게 해제할 수 있음을 의미), call_rcu에서 제공하는 콜백 함수가 호출됩니다.

동기화_rcu 구현은 대기 대기열을 사용하며 call_rcu와 같은 현재 프로세서의 로컬 연결 목록에 노드를 추가합니다. call_rcu와의 차이점은 이 노드의 콜백 함수가 wakeme_after_rcu라는 점입니다. 시스템의 모든 프로세서에서 프로세스 전환이 발생할 때까지 대기 대기열에서 절전 모드로 전환되므로 rcu_process_callbacks에서 wakeme_after_rcu를 호출하여 절전 모드로 전환된 sync_rcu를 깨운 후 동기화_rcu는 이제 이전 포인터를 해제할 수 있음을 알게 됩니다.

그래서 등록된 콜백 함수는 call_rcu가 반환된 후에 호출되지 않았을 수 있음을 알 수 있습니다. 이는 이전 포인터가 해제되지 않았음을 의미하며, sync_rcu가 반환된 후에 이전 포인터가 해제되었음을 의미합니다. 따라서 call_rcu를 호출할지, 동기화_rcu를 호출할지 여부는 특정 요구 사항과 현재 컨텍스트에 따라 다릅니다. 예를 들어, 동기화_rcu 함수는 인터럽트 처리 컨텍스트에서 사용할 수 없습니다.

이 글에서는 Linux 커널의 효율적인 동기화 메커니즘인 RCU를 소개합니다. 이는 게시-구독 모델을 기반으로 하는 동기화 메커니즘입니다. RCU의 기본 아이디어, 주요 인터페이스 및 구현 세부 사항을 원리 측면에서 분석하고 해당 코드 예제를 제공했습니다. 또한 애플리케이션 관점에서 연결된 목록 작업, 타이머 관리, 소프트 인터럽트 처리 및 기타 시나리오에서 RCU 사용을 소개하고 해당 코드 예제를 제공했습니다. 이 기사를 연구함으로써 우리는 RCU의 기본 사용법을 익힐 수 있으며 실제 개발에서 RCU를 유연하게 사용하여 효율적인 동기화 요구 사항을 달성할 수 있습니다. 이 기사가 도움이 되기를 바랍니다!

위 내용은 Linux 커널의 RCU 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Docker 프로세스를 보는 방법 Docker 프로세스를 보는 방법 Apr 15, 2025 am 11:48 AM

도커 프로세스보기 방법 : 1. Docker CLI 명령 : Docker PS; 2. Systemd Cli 명령 : SystemCTL 상태 Docker; 3. Docker Compose CLI 명령 : Docker-Compose PS; 4. 프로세스 탐색기 (Windows); 5. /Proc Directory (Linux).

VSCODE에 필요한 컴퓨터 구성 VSCODE에 필요한 컴퓨터 구성 Apr 15, 2025 pm 09:48 PM

대 코드 시스템 요구 사항 : 운영 체제 : Windows 10 이상, MacOS 10.12 이상, Linux 배포 프로세서 : 최소 1.6GHz, 권장 2.0GHz 이상의 메모리 : 최소 512MB, 권장 4GB 이상의 저장 공간 : 최소 250MB, 권장 1GB 및 기타 요구 사항 : 안정 네트워크 연결, Xorg/Wayland (LINUX)

VSCODE는 확장자를 설치할 수 없습니다 VSCODE는 확장자를 설치할 수 없습니다 Apr 15, 2025 pm 07:18 PM

VS 코드 확장을 설치하는 이유는 다음과 같습니다. 네트워크 불안정성, 불충분 한 권한, 시스템 호환성 문제, C 코드 버전은 너무 오래된, 바이러스 백신 소프트웨어 또는 방화벽 간섭입니다. 네트워크 연결, 권한, 로그 파일, 업데이트 대 코드 업데이트, 보안 소프트웨어 비활성화 및 대 코드 또는 컴퓨터를 다시 시작하면 점차 문제를 해결하고 해결할 수 있습니다.

vScode를 Mac에 사용할 수 있습니다 vScode를 Mac에 사용할 수 있습니다 Apr 15, 2025 pm 07:36 PM

VS 코드는 Mac에서 사용할 수 있습니다. 강력한 확장, GIT 통합, 터미널 및 디버거가 있으며 풍부한 설정 옵션도 제공합니다. 그러나 특히 대규모 프로젝트 또는 고도로 전문적인 개발의 경우 VS 코드는 성능 또는 기능 제한을 가질 수 있습니다.

VScode 란 무엇입니까? VScode 란 무엇입니까? Apr 15, 2025 pm 06:45 PM

VS Code는 Full Name Visual Studio Code로, Microsoft가 개발 한 무료 및 오픈 소스 크로스 플랫폼 코드 편집기 및 개발 환경입니다. 광범위한 프로그래밍 언어를 지원하고 구문 강조 표시, 코드 자동 완료, 코드 스 니펫 및 스마트 프롬프트를 제공하여 개발 효율성을 향상시킵니다. 풍부한 확장 생태계를 통해 사용자는 디버거, 코드 서식 도구 및 GIT 통합과 같은 특정 요구 및 언어에 확장을 추가 할 수 있습니다. VS 코드에는 코드에서 버그를 신속하게 찾아서 해결하는 데 도움이되는 직관적 인 디버거도 포함되어 있습니다.

Apr 16, 2025 pm 07:39 PM

메모장은 Java 코드를 직접 실행할 수는 없지만 다른 도구를 사용하여 명령 줄 컴파일러 (Javac)를 사용하여 Bytecode 파일 (filename.class)을 생성하면 달성 할 수 있습니다. Java Interpreter (Java)를 사용하여 바이트 코드를 해석하고 코드를 실행하고 결과를 출력하십시오.

Linux의 주요 목적은 무엇입니까? Linux의 주요 목적은 무엇입니까? Apr 16, 2025 am 12:19 AM

Linux의 주요 용도에는 다음이 포함됩니다. 1. 서버 운영 체제, 2. 임베디드 시스템, 3. 데스크탑 운영 체제, 4. 개발 및 테스트 환경. Linux는이 분야에서 뛰어나 안정성, 보안 및 효율적인 개발 도구를 제공합니다.

vscode를 사용하는 방법 vscode를 사용하는 방법 Apr 15, 2025 pm 11:21 PM

Visual Studio Code (VSCODE)는 Microsoft가 개발 한 크로스 플랫폼, 오픈 소스 및 무료 코드 편집기입니다. 광범위한 프로그래밍 언어에 대한 가볍고 확장 성 및 지원으로 유명합니다. VSCODE를 설치하려면 공식 웹 사이트를 방문하여 설치 프로그램을 다운로드하고 실행하십시오. VScode를 사용하는 경우 새 프로젝트를 만들고 코드 편집, 디버그 코드, 프로젝트 탐색, VSCODE 확장 및 설정을 관리 할 수 ​​있습니다. VSCODE는 Windows, MacOS 및 Linux에서 사용할 수 있으며 여러 프로그래밍 언어를 지원하며 Marketplace를 통해 다양한 확장을 제공합니다. 이점은 경량, 확장 성, 광범위한 언어 지원, 풍부한 기능 및 버전이 포함됩니다.

See all articles