ก่อนที่เราจะหารือรายละเอียดเกี่ยวกับpdflush
, kjournald, and
kswapd` ให้แรกได้รับพื้นหลังน้อยของบริบทของสิ่งที่เรากำลังพูดถึงในแง่ของลินุกซ์เคอร์เนล
สถาปัตยกรรม GNU / Linux
สถาปัตยกรรมของ GNU / Linux สามารถพิจารณาเป็น 2 ช่องว่าง:
ระหว่างผู้ใช้อวกาศและเคอร์เนลอวกาศนั่ง C Library GNU ( glibc
) สิ่งนี้จัดเตรียมอินเตอร์เฟสการเรียกระบบที่เชื่อมต่อเคอร์เนลกับแอ็พพลิเคชันพื้นที่ผู้ใช้
พื้นที่เคอร์เนลสามารถแบ่งย่อยออกเป็น 3 ระดับเพิ่มเติม:
- อินเตอร์เฟสการโทรของระบบ
- รหัสเคอร์เนลอิสระสถาปัตยกรรม
- รหัสขึ้นอยู่กับสถาปัตยกรรม
ส่วนต่อประสานการโทรของระบบตามชื่อแสดงถึงการเชื่อมต่อระหว่างglibc
และเคอร์เนล สถาปัตยกรรมอิสระ Kernel รหัสประกอบด้วยหน่วยตรรกะเช่นวีเอฟเอ (Virtual File System) และ VMM (Virtual จัดการหน่วยความจำ) สถาปัตยกรรมขึ้นอยู่กับรหัสเป็นส่วนประกอบที่มีโปรเซสเซอร์และรหัสเฉพาะแพลตฟอร์มสำหรับสถาปัตยกรรมฮาร์ดแวร์ที่กำหนด
แผนผังของ GNU / Linux Architecture
สำหรับส่วนที่เหลือของบทความนี้เราจะเน้นความสนใจของเราในหน่วยโลจิคัล VFS และ VMM ภายใน Kernel Space
ระบบย่อยของเคอร์เนล GNU / Linux
ระบบย่อย VFS
ด้วยแนวคิดระดับสูงว่าโครงสร้างเคอร์เนล GNU / Linux เป็นอย่างไรเราสามารถเจาะลึกเข้าไปในระบบย่อย VFS ได้เล็กน้อย ส่วนนี้มีหน้าที่รับผิดชอบในการให้การเข้าถึงอุปกรณ์จัดเก็บข้อมูลบล็อกต่าง ๆ ซึ่งในที่สุดแผนที่ลงไปในระบบไฟล์ (ext3 / ext4 / ฯลฯ .) บนอุปกรณ์ทางกายภาพ (HDD / ฯลฯ )
ไดอะแกรมของ VFS
แผนภาพนี้แสดงวิธีการwrite()
ที่กระบวนการของผู้ใช้สำรวจ VFS และในที่สุดก็ใช้งานได้จนถึงไดรเวอร์อุปกรณ์ที่เขียนไปยังสื่อบันทึกที่เก็บข้อมูลจริง pdflush
นี้เป็นสถานที่แรกที่เราพบ นี่คือ daemon ซึ่งรับผิดชอบการล้างข้อมูลที่สกปรกและบล็อกบัฟเฟอร์ข้อมูลเมตาไปยังสื่อบันทึกข้อมูลในพื้นหลัง แผนภาพไม่แสดงสิ่งนี้ แต่มีอีก daemon kjournald
ซึ่งตั้งอยู่เคียงข้างpdflush
กันดำเนินการคล้ายกับการเขียนบล็อกเจอร์นัลสกปรกไปยังดิสก์ หมายเหตุ:บล็อกเจอร์นัลคือวิธีที่ระบบไฟล์เช่น ext4 & JFS ติดตามการเปลี่ยนแปลงของดิสก์ในไฟล์ก่อนการเปลี่ยนแปลงเหล่านั้นจะเกิดขึ้น
รายละเอียดข้างต้นจะกล่าวถึงต่อไปในบทความนี้
ภาพรวมของwrite()
ขั้นตอน
เพื่อให้ภาพรวมอย่างง่ายของการดำเนินการ sybsystem ของ I / O เราจะใช้ตัวอย่างที่write()
เรียกใช้ฟังก์ชันโดยแอปพลิเคชัน User Space
- กระบวนการร้องขอให้เขียนไฟล์ผ่านการ
write()
เรียกของระบบ
- เคอร์เนลจะอัพเดตแคชเพจที่แม็พกับไฟล์
- เธรดเคอร์เนล pdflush ดูแลการล้างแคชเพจไปยังดิสก์
- เลเยอร์ระบบไฟล์ทำให้บัฟเฟอร์บล็อกแต่ละอันรวมกันเป็น
bio struct
( อ้างถึง 1.4.3,“ บล็อกเลเยอร์” ในหน้า 23 ) และส่งคำขอเขียนไปยังชั้นอุปกรณ์บล็อก
- เลเยอร์อุปกรณ์บล็อกได้รับการร้องขอจากชั้นบนและทำการลิฟต์ I / O และทำการร้องขอลงในคิวคำขอ I / O
- ไดรเวอร์อุปกรณ์เช่น SCSI หรือไดรเวอร์เฉพาะอุปกรณ์อื่น ๆ จะดูแลการเขียน
- เฟิร์มแวร์ของอุปกรณ์ดิสก์ดำเนินการกับฮาร์ดแวร์เช่นการค้นหาส่วนหัวการหมุนและการถ่ายโอนข้อมูลไปยังเซกเตอร์บนแผ่นเสียง
ระบบย่อย VMM
ดำน้ำลึกต่อไปเราสามารถดูระบบย่อย VMM องค์ประกอบนี้มีหน้าที่รับผิดชอบในการรักษาความสอดคล้องระหว่างหน่วยความจำหลัก (RAM), swap และสื่อเก็บข้อมูลจริง bdflush
กลไกหลักเพื่อความมั่นคงการรักษาคือ เมื่อเพจของหน่วยความจำมีความสกปรกพวกเขาจำเป็นต้องซิงโครไนซ์กับข้อมูลที่อยู่ในสื่อเก็บข้อมูล bdflush
จะประสานงานกับpdflush
daemons เพื่อซิงโครไนซ์ข้อมูลนี้กับสื่อบันทึกข้อมูล
ไดอะแกรมของ VMM
แลกเปลี่ยน
เมื่อหน่วยความจำระบบขาดแคลนหรือตัวจับเวลาการสลับเคอร์เนลหมดอายุkswapd
daemon จะพยายามเพิ่มหน้าให้ว่าง ตราบใดที่จำนวนหน้าฟรียังคงสูงกว่าfree_pages_high
, kswapd
จะทำอะไร อย่างไรก็ตามหากจำนวนของหน้าว่างลดลงด้านล่างจากนั้นkswapd
จะเริ่มกระบวนการจัดทำหน้าใหม่ หลังจากkswapd
ทำเครื่องหมายหน้าเว็บสำหรับการย้ายใหม่แล้วbdflush
จะระมัดระวังในการซิงโครไนซ์การเปลี่ยนแปลงที่โดดเด่นใด ๆ กับสื่อเก็บข้อมูลผ่านทางpdflush
daemons
การอ้างอิงและการอ่านเพิ่มเติม