เหตุใด Linux จึงใช้ swap partition เมื่อเคอร์เนลรองรับหน่วยความจำการเพจ / เสมือน


23

เท่าที่ฉันเข้าใจการสลับหน้าและการแลกเปลี่ยนพวกเขามีแนวคิดที่แตกต่างอย่างสิ้นเชิง ในขณะที่การแลกเปลี่ยนหมายถึงว่ากระบวนการนั้นมีทั้งในหน่วยความจำกายภาพหรือบนฮาร์ดไดรฟ์โดยส่วนของเพจจะอยู่ในหน่วยความจำกายภาพและส่วนอื่น ๆ จะอยู่ในฮาร์ดไดรฟ์

แต่ทำไมลินุกซ์จึงจำเป็นต้องมีพาร์ติชั่นการแลกเปลี่ยน หากหน่วยความจำกายภาพเต็มกระบวนการบางกระบวนการจะถูก outsourced กับฮาร์ดไดรฟ์และกระบวนการใหม่จะถูกแมปจากหน่วยความจำเสมือนกับหน่วยความจำกายภาพ

ฉันแค่ไม่เข้าใจว่าทำไมต้องมี swap partition (หรือการแลกเปลี่ยนโดยทั่วไป) แล้ว?

หรือนี่เป็นเพียงเรื่องของคำศัพท์และswap partition == virtual memory?


5
ระวังว่า "หน่วยความจำเสมือน" ในสถาปัตยกรรมคอมพิวเตอร์เป็นเทคนิคหนึ่งในขณะที่ MS Windows (IMO ไม่ถูกต้อง) กำหนดไว้ว่า"หน่วยความจำเสมือนคือพื้นที่เก็บข้อมูลบนฮาร์ดดิสก์ของคอมพิวเตอร์ของคุณที่ Windows ใช้ร่วมกับหน่วยความจำเข้าถึงโดยสุ่ม (RAM)" IE google windows "หน่วยความจำเสมือน"
sawdust

คำตอบ:


25

ใช่มันเป็นเพียงเรื่องของคำศัพท์ในหลายกรณีมีการใช้พาร์ติชัน swap เป็นหน่วยความจำเสมือน

เหตุผลที่ระบบคล้าย UNIX และ UNIX ชอบการสลับพาร์ติชั่นไปยังหน้าไฟล์คือว่ามันสามารถต่อเนื่องกันได้ซึ่งทำให้เวลาในการค้นหาลดลงเมื่อเทียบกับไฟล์หน้าซึ่งอาจมีการแยกส่วน


6
และวิธีนี้ยังเป็นการง่ายกว่าที่จะแชร์พาร์ติชัน swap เดียวระหว่างการติดตั้ง Linux
oKtosiTe

3
มักจะเป็น pagefile ถูกสร้างขึ้นอย่างสมบูรณ์ในการบูตแรกดังนั้นมันจะไม่สามารถแยกส่วน (ดี .. ยังคงมีความเป็นไปได้ไม่กี่ .. )
AndreaCi

12
UNIXes ที่เก่าแก่ที่สุดมีเพียงการสลับเท่านั้นไม่สลับหน้าและสามารถสลับไปยังพาร์ติชันเฉพาะได้เท่านั้น การเพจถูกนำมาใช้ทันทีที่ฮาร์ดแวร์รองรับ แต่ชื่อ "swap partition" ค้าง การเลื่อนหน้าไปยังไฟล์เป็นสิ่งที่ใหม่กว่าและมีค่าใช้จ่าย OS สูงกว่ารวมทั้งเสี่ยงต่อการแตกแฟรกเมนต์
zwol

1
"swap partition ถูกใช้เป็นหน่วยความจำเสมือน" - เฉพาะ Microsoft Windows เท่านั้นที่จัดเก็บข้อมูลรอง (เช่นไฟล์หน้าบนดิสก์) เป็น "หน่วยความจำเสมือน" แต่ถึงกระนั้นพวกเขาก็พยายามที่จะหลีกเลี่ยงการใช้งานนี้ ลองใช้ googling windows "หน่วยความจำเสมือน"และสรุปสำหรับผลลัพธ์แรก ("หน่วยความจำเสมือนคือพื้นที่เก็บข้อมูล ... ") ไม่ตรงกับเนื้อหาของหน้า คำสั่งที่ถูกต้องจะเป็น "พาร์ทิชัน swap ถูกใช้โดยหน่วยความจำเสมือน"
ขี้เลื่อย

14

ฉันไม่รู้ว่าคุณมีความคิดอย่างไรที่“ การแลกเปลี่ยนหมายถึงว่ากระบวนการนั้นสมบูรณ์ในหน่วยความจำกายภาพหรือบนฮาร์ดไดรฟ์” ความหมายนั้นไม่ได้ถูกใช้มานานหลายสิบปี การอ้างถึงWikipedia :

ในอดีตการสลับที่อ้างถึงการย้ายจาก / ไปยังที่เก็บข้อมูลสำรองของโปรแกรมทั้งหมดในแต่ละครั้งในรูปแบบที่รู้จักในชื่อ roll-in / roll-out ในปี 1960 หลังจากแนวคิดของหน่วยความจำเสมือนถูกนำเสนอ - ในสองรูปแบบไม่ว่าจะเป็นการใช้เซกเมนต์หรือหน้า - การแลกเปลี่ยนคำถูกนำไปใช้กับการย้ายตามลำดับทั้งส่วนหรือหน้าระหว่างดิสก์และหน่วยความจำ ทุกวันนี้หน่วยความจำเสมือนส่วนใหญ่อ้างอิงจากหน้าเว็บไม่ใช่เซ็กเมนต์การแลกเปลี่ยนกลายเป็นคำพ้องความหมายของการเพจอย่างเป็นธรรมแม้ว่าจะมีความแตกต่างอยู่หนึ่งอย่าง [น่าสงสัย - คุย]

แน่นอนในบริบทใด ๆ ที่เกี่ยวข้องกับ Linux (หรือระบบยูนิกซ์อื่น ๆ สำหรับเรื่องนั้น) การเพจและการแลกเปลี่ยนนั้นมีความหมายเหมือนกัน ทั้งสองอ้างถึงการใช้หน่วยความจำเสมือนที่ข้อมูลหน้าสามารถเก็บไว้ใน RAM หรือบนดิสก์ (หน้าคือ 4kB บนอุปกรณ์ใด ๆ ที่คุณอาจพบ) โปรแกรมที่ใช้หน้าหน่วยความจำไม่สนใจหรือรู้ว่าข้อมูลถูกเก็บไว้ที่ไหนมันแค่ใช้ที่อยู่เสมือนจริงต่อไป เคอร์เนลถ่ายโอนข้อมูลระหว่าง RAM และดิสก์และอัปเดตตารางMMUตามที่ดำเนินการเพื่อให้รายการสำหรับที่อยู่เสมือนชี้ไปยังหน้าฟิสิคัลในหน่วยความจำหรือมีค่าพิเศษที่ทำให้โปรเซสเซอร์ดำเนินการบางรหัสเคอร์เนล ซึ่งจะโหลดข้อมูลที่เหมาะสมจากดิสก์

เพจจิ้งหมายถึงกระบวนการทั่วไปนี้ การแลกเปลี่ยนหมายถึงกรณีที่ข้อมูลบนดิสก์อยู่ในพื้นที่เฉพาะ: พื้นที่ swap (swap พาร์ติชันหรือไฟล์ swap) เพจจิ้งยังสามารถทำได้ระหว่าง RAM และไฟล์และในกรณีนี้ก็มักจะไม่ได้อ้างถึงการแลกเปลี่ยน ตัวอย่างเช่นเมื่อคุณรันโปรแกรมรหัสจะต้องโหลดลงในหน่วยความจำที่จะดำเนินการ; หากหน้ารหัสต้องถูกขับออกจาก RAM เพื่อให้มีที่ว่างอย่างอื่นไม่จำเป็นต้องเขียนหน้านี้ลงบนพื้นที่สว็อปเพราะสามารถโหลดกลับจากไฟล์โปรแกรมได้ (สามารถทำได้กับข้อมูลแบบอ่านอย่างเดียวไม่ใช่แค่รหัสโปรแกรม)

หากหน่วยความจำกายภาพเต็ม (เกือบ) เคอร์เนลจะค้นหาหน้าเว็บใน RAM (ไม่ใช่กระบวนการทั้งหมด) ที่ไม่ได้ใช้งานเมื่อเร็ว ๆ นี้ หากหน้านั้นทำซ้ำเนื้อหาของไฟล์ดิสก์ (มีตารางในเคอร์เนลเพื่อระบุสิ่งนี้) เพจสามารถเรียกคืนได้ หากไม่เป็นเช่นนั้นหน้าเว็บจะถูกเขียนออกมาเพื่อสลับจากนั้นเรียกคืน วิธีที่เคอร์เนลอัพเดตรายการในตารางหน่วยความจำเสมือนของกระบวนการ (ซึ่งกลายเป็นตาราง MMU ในขณะที่กระบวนการดำเนินการ) เพื่อทำเครื่องหมายว่าไม่ได้อยู่ใน RAM และสามารถนำหน้าฟิสิคัลหน้าไปใช้อย่างอื่น (โปรแกรมอื่นหรือหน้าอื่นของ โปรแกรมเดียวกัน)


ย่อหน้าแรกของคำตอบของคุณบอกเขาว่าเขามีความคิดตรงไหน: เอกสารเก่า (ฉันจำได้เมื่อมีความแตกต่างระหว่างการสลับและการสลับหน้าเช่นกัน)
RonJohn

9

หน่วยความจำเสมือน / ตัวช่วยเพจช่วยให้เคอร์เนลหน่วยความจำ "เสมือนจริง" เพื่อกระบวนการ userspace เคอร์เนลสามารถนำหน้าจากหน่วยความจำกายภาพและจัดเรียงหน้าเพจเพื่อให้ปรากฏต่อเนื่องกับกระบวนการ userspace

สามารถตั้งค่าขีด จำกัด บนหน่วยความจำของกระบวนการ userspace ได้และหากกระบวนการดำเนินการเกินกว่าจะเกิด "page fault" เกิดขึ้นซึ่งทำให้เกิดข้อยกเว้นของ CPU ซึ่งกระดอนกลับไปที่เคอร์เนล สิ่งนี้ป้องกันไม่ให้โปรแกรม userspace ทำกับหน่วยความจำที่จัดสรรให้เคอร์เนลหรือโปรแกรมอื่น ๆ โดยไม่ได้รับอนุญาตจากเคอร์เนล

โดยทั่วไปโปรแกรม userspace จะขอให้เคอร์เนลขยายขีด จำกัด นี้ผ่านอินเทอร์เฟซที่กำหนดไว้อย่างดี (เรียกใช้โดยฟังก์ชัน C malloc()และfree()ตัวอย่าง) เคอร์เนลมีหน้าที่รับผิดชอบในการติดตามจำนวนและหน่วยความจำที่โปรแกรมถูกจัดสรร

กลไก "page fault" นี้ยังสามารถให้เคอร์เนลสลับหน้ากระบวนการที่พยายามเข้าถึงด้วยดิสก์หนึ่งตัวหากเคอร์เนลสามารถ overprovision หน่วยความจำ (และทั้ง Windows และ Linux สนับสนุนสิ่งนี้) ดังนั้นจึงเรียกว่าการสลับ หากการเข้าถึงหน่วยความจำไม่ถูกต้องแน่นอน (เช่นกระบวนการกำลังพยายามเข้าถึงหน่วยความจำก็ไม่ได้ถามก่อน) โดยทั่วไปแล้วกระบวนการจะถูกฆ่าด้วย SIGSEGV

ดังนั้น "การสลับ" เป็นคุณสมบัติเพิ่มเติม (ใน Linux คุณสามารถปิดการใช้งานได้จริงหากคุณต้องการ) ซึ่งขึ้นอยู่กับหน่วยความจำเสมือน / เพจจิ้ง แต่ไม่จำเป็นต้องใช้เพียงเพราะ CPU มีหน่วยความจำเสมือน / เพจจิ้ง แนวคิดไม่เหมือนกัน แต่การสลับเปลี่ยนขึ้นอยู่กับการเพจ / หน่วยความจำเสมือนที่มีอยู่


นอกจากนี้หลังจากอ่านคำถามของคุณอย่างละเอียดยิ่งขึ้นบางครั้งการ "เพจจิ้ง" ก็ใช้เป็น synomym สำหรับ "การสลับ" - แต่ฉันไม่เคยได้ยินคำว่า "การสลับ" หมายความว่าหน่วยความจำของกระบวนการทั้งหมดถูกสลับกับ "เพจจิ้ง" มันถูกสับเปลี่ยน

แต่ทำไมลินุกซ์จึงจำเป็นต้องมีพาร์ติชั่นการแลกเปลี่ยน หากหน่วยความจำกายภาพเต็มกระบวนการบางกระบวนการจะถูก outsourced กับฮาร์ดไดรฟ์และกระบวนการใหม่จะถูกแมปจากหน่วยความจำเสมือนกับหน่วยความจำกายภาพ

"หน่วยความจำเสมือน" เป็นหน่วยความจำกายภาพเพียงแค่ "สร้างใหม่" ฮาร์ดแวร์ MMU ไม่สามารถแมปโดยตรงกับอุปกรณ์เก็บข้อมูลใด ๆ MMU สามารถโยนข้อผิดพลาดที่บอกเคอร์เนลว่ากระบวนการพยายามเข้าถึงหน่วยความจำที่ไม่ควรมี - และเคอร์เนลสามารถใช้กลไกนี้เพื่อดูว่ากระบวนการต้องการบางสิ่งบางอย่างกลับมาจากดิสก์ที่คิดว่าอยู่ในหน่วยความจำแล้วทำ " แลกเปลี่ยน" จุดที่เป็นระบบปฏิบัติการที่ตัดสินใจบันทึกหน้าลงดิสก์เพื่อให้สามารถใช้หน้าเหล่านั้นสำหรับกระบวนการอื่น ๆ ไม่ใช่ฮาร์ดแวร์


2

โดยทั่วไปพาร์ติชัน swap ไม่เท่ากับหน่วยความจำเสมือน

กระบวนการอาจต้องการหน่วยความจำมากกว่าหน่วยความจำกายภาพจริงดังนั้นผู้พัฒนาระบบปฏิบัติการจึงตัดสินใจที่จะสมมติว่ามีหน่วยความจำเพิ่มเติมในระบบซึ่งเรียกว่า "หน่วยความจำเสมือน"

หน่วยความจำเสมือนนี้โดยทั่วไปคือหน่วยความจำกายภาพและเป็นส่วนหนึ่งของดิสก์ ส่วนนี้ของดิสก์เรียกว่า "swap" ใน Linux

นักพัฒนายังเสนอว่าการใช้งานส่วนหนึ่งของหน่วยความจำเสมือนที่อยู่บนฮาร์ดดิสก์จะต้องต่ำที่สุด เพื่อประโยชน์ของมันหน่วยความจำเสมือนทั้งหมดถูกแบ่งออกเป็นส่วนเล็ก ๆ ซึ่งเรียกว่า "หน้า" มีการใช้หน้าจำนวนมากในอัตราที่ต่ำหน้าเหล่านี้ต้องถูกเขียนลงในส่วนของหน่วยความจำเสมือนบนฮาร์ดดิสก์ การดำเนินการนี้เรียกว่า "สลับออก" ระบบปฏิบัติการจะต้องติดตามว่าหน้าใดไม่ได้อยู่ในหน่วยความจำกายภาพเพื่อค้นหาเมื่อจำเป็น ความผิดพลาดของหน้าเกิดขึ้นเมื่อโปรแกรมต้องการเขียน / อ่านส่วนหนึ่งของหน่วยความจำที่ถูกสลับ

ในการตอบคำถามของคุณ: Linux ต้องการพาร์ติชันการสลับเพื่อสลับหน้าหน่วยความจำบางหน้าและคุณสามารถดูสถิติการใช้หน่วยความจำเสมือนด้วยvmstat:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs us sy id wa
2  0  35424 524560 134164 1858728    0    0    13    11   55   42  5  1 94  0
0  0  35424 526720 134164 1857872    0    0     0     0 2774 5224  7  2 91  0
1  0  35424 516328 134172 1870116    0    0     0     6 3464 6561 13  3 84  0
0  0  35424 522992 134212 1862676    0    0     0   125 4135 7135 12  4 84  1

คอลัมน์ 'สลับ' แสดงการสลับออกและเป็นสถิติ นอกจากนี้ยังมีการเชื่อมโยงนี้จะอธิบายถึงหน่วยความจำเสมือนและการใช้งานvmstatได้เป็นอย่างดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.