pdflush, kjournald, swapd 등은 어떻게 상호 운용됩니까?


17

최근에이 생각을 촉발시키는 질문이있었습니다. 여기 또는 Google 컴퓨터를 통해 실제로 답변을 찾을 수 없습니다. 기본적으로 커널 I / O 아키텍처가 어떻게 계층화되어 있는지 알고 싶습니다. 예를 들어, 또는 다른 방법으로 kjournald파견 pdflush됩니까? 저의 가정은 pdflush(대용량 스토리지 I / O에 더 일반적이기 때문에) 더 낮은 레벨에 있고 실제로 쓰기를 수행하는 데 필요한 명령을 SCSI / ATA / 트리거하고 트리거 kjournald하기 전에 더 높은 레벨의 파일 시스템 데이터 구조를 처리 한다는 것입니다. kjournald파일 시스템 데이터 구조 와 직접 인터페이스 pdflush하고 매번 깨어 난 다음 더러운 페이지 캐시 페이지를 장치에 쓰는 방법으로 다른 방법으로 볼 수도 있습니다.kjournald. 다른 이유로 인해 두 사람이 전혀 상호 작용하지 않을 수도 있습니다.

기본적으로 : I / O를 Linux 커널 내의 대용량 저장소로 디스패치하는 데 사용되는 기본 아키텍처를 시각화 (그래프 또는 설명) 할 수있는 방법이 필요합니다.


1
이것이 당신이 찾고있는 것입니까? oss.org.cn/ossdocs/linux/kernel/a1/index.html
slm



1
커널의 다양한 구성 요소가 어떻게 함께 사용되는지 보여주는 대화 형 커널 맵을 찾았습니다. makelinux.net/kernel_map
slm

1
19-24 페이지의 추가 리소스 : Linux 성능 및 조정 지침 . 이것은 정확히 당신이 찾고있는 것 같습니다.
slm

답변:


21

우리가에 대한 구체적인 논의하기 전에 pdflush, kjournald, andkswapd`을의 첫 번째 정확히 우리가 리눅스 커널의 관점에서 무슨 말을하는지의 내용에 약간의 배경을 얻을 수 있습니다.

GNU / 리눅스 아키텍처

GNU / 리눅스 아키텍처는 2 개의 공간으로 생각할 수 있습니다.

  • 사용자
  • 핵심

사용자 공간커널 공간 사이에는 GNU C 라이브러리 ( glibc)가 있습니다. 커널을 사용자 공간 응용 프로그램에 연결하는 시스템 호출 인터페이스를 제공합니다.

커널 공간은 3 단계로 세분화 될 수 있습니다.

  • 시스템 호출 인터페이스
  • 아키텍처 독립적 인 커널 코드
  • 건축 종속 코드

이름에서 알 수 있듯이 시스템 호출 인터페이스glibc 는 커널과 커널 사이에 인터페이스를 제공합니다 . 건축 독립적 인 커널 코드는 같은 VFS (가상 파일 시스템) 및 VMM (가상 메모리 관리)와 같은 논리 단위로 구성되어 있습니다. 건축 종속 코드는 특정 하드웨어 아키텍처 프로세서와 플랫폼 별 코드가있는 구성 요소입니다.

GNU / 리눅스 아키텍처 다이어그램

                                 GNU / 리눅스 아치의 ss.

이 기사의 나머지 부분에서는 커널 공간 내의 VFS 및 VMM 논리 장치에 중점을 둘 것입니다.

GNU / 리눅스 커널의 서브 시스템

                                    커널 com의 ss

VFS 서브 시스템

GNU / 리눅스 커널의 구조에 대한 높은 수준의 개념을 통해 VFS 하위 시스템에 대해 좀 더 심도있게 탐구 할 수 있습니다. 이 구성 요소는 궁극적으로 실제 장치 (HDD / etc.)의 파일 시스템 (ext3 / ext4 / etc.)에 매핑되는 다양한 블록 저장 장치에 대한 액세스를 제공합니다.

VFS의 다이어그램

vfs의 ss

이 다이어그램은 write()사용자 프로세스의 프로세스가 VFS를 통과하여 궁극적으로 실제 저장 매체에 기록되는 장치 드라이버로 작동하는 방식을 보여줍니다 . 이것은 우리가 처음 만난 곳 pdflush입니다. 이것은 더티 데이터 및 메타 데이터 버퍼 블록을 백그라운드의 저장 매체로 플러시하는 데 사용되는 데몬입니다. 다이어그램은 이것을 보여주지 않지만 다른 데몬이 있으며 kjournald, 옆에 앉아 pdflush더티 저널 블록을 디스크에 쓰는 비슷한 작업을 수행합니다. 참고 : 저널 블록은 ext4 및 JFS와 같은 파일 시스템이 변경 전에 파일의 디스크 변경 사항을 추적하는 방법입니다.

위의 내용은 이 백서 에서 더 자세히 설명 합니다 .

write()단계 개요

I / O sybsystem 조작에 대한 간단한 개요를 제공하기 위해 write()User Space 애플리케이션 이 함수 를 호출 하는 예제를 사용합니다 .

  1. 프로세스가 write()시스템 호출을 통해 파일 쓰기를 요청합니다 .
  2. 커널은 파일에 매핑 된 페이지 캐시를 업데이트합니다.
  3. pdflush 커널 스레드는 페이지 캐시를 디스크로 플러시합니다.
  4. 파일 시스템 계층은 각 블록 버퍼를 하나로 모으고 bio struct( 23 페이지의 1.4.3 절 "블록 계층"참조 ) 쓰기 요청을 블록 장치 계층에 제출합니다.
  5. 블록 디바이스 계층은 상위 계층에서 요청을 가져오고 I / O 엘리베이터 조작을 수행하고 요청을 I / O 요청 큐에 넣습니다.
  6. SCSI와 같은 장치 드라이버 또는 기타 장치 특정 드라이버는 쓰기 작업을 처리합니다.
  7. 디스크 장치 펌웨어는 탐색 헤드, 회전 및 플래터의 섹터로 데이터 전송과 같은 하드웨어 작업을 수행합니다.

VMM 서브 시스템

심층 다이빙을 계속하면서 이제 VMM 하위 시스템을 살펴볼 수 있습니다. 이 구성 요소는 주 메모리 (RAM), 스왑 및 실제 저장 매체 간의 일관성을 유지합니다. 일관성을 유지하기위한 기본 메커니즘은 bdflush입니다. 메모리 페이지가 더티로 간주되면 저장 매체에있는 데이터와 동기화되어야합니다. 이 데이터를 저장 매체와 동기화하기 위해 데몬 bdflush과 조정 pdflush합니다.

VMM의 다이어그램

                VMM의 ss

교환

시스템 메모리가 부족하거나 커널 스왑 타이머가 만료되면 kswapd데몬은 페이지를 비우려고 시도합니다. 너무 오래 사용 가능한 페이지의 수 위 유지되는 한 free_pages_high, kswapd아무것도하지 않는 것입니다. 그러나 사용 가능한 페이지 수가 아래로 떨어지면 kswapd페이지 교정 프로세스가 시작됩니다. kswapd재배치 bdflush할 페이지를 표시 한 후 pdflush데몬을 통해 저장 매체에 대한 미해결 변경 사항을 동기화하도록주의를 기울 입니다.

참고 문헌 및 추가 자료


1
나는 이것을 답변으로 받아들이고 바운티를 수여하기 전에 하루를 기다려서 "바운티"페이지에 머 무르도록 할 것입니다. 그런 식으로 전에 본 사람이라면 누구나 대답 할 수있는 기회를 갖게됩니다.
Bratchley

1
다시 한 번 감사드립니다, BTW. 당신은 정말로 이것에 대해 연구했습니다.
Bratchley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.