คำตอบสั้น ๆ
ป๊อปอัพ "หน่วยความจำไม่เพียงพอ" แจ้งว่าคุณมีหน่วยความจำส่วนตัวที่กำหนดไว้ไม่เกินขีด จำกัด- ประเภทของหน่วยความจำเสมือน ไม่ใช่ว่าคุณหมด RAM (หน่วยความจำกายภาพ) มันไม่สำคัญเท่าไหร่ใช้ได้ RAM คุณมี การมี RAM ที่มีอยู่จำนวนมากไม่อนุญาตให้คุณเกินขีด จำกัด การกระทำ ขีด จำกัด การกระทำคือผลรวมของRAM ทั้งหมดของคุณ (ไม่ว่าจะใช้งานหรือไม่!) บวกกับขนาดไฟล์เพจปัจจุบันของคุณ
ในทางกลับกันขีด จำกัด การกระทำ "ใช้ถึง" (ซึ่งส่วนใหญ่เป็นการสร้างพื้นที่ที่อยู่เสมือนของกระบวนการส่วนตัว) ไม่จำเป็นต้องใช้ RAM ใด ๆ ! แต่ระบบปฏิบัติการจะไม่อนุญาตให้มีการสร้างเว้นแต่จะรู้ว่ามีสถานที่เก็บไว้หากจำเป็นต้องใช้ ดังนั้นคุณสามารถใช้งานขีด จำกัด การกระทำโดยไม่ต้องใช้ RAM ทั้งหมดหรือแม้แต่ RAM ส่วนใหญ่ของคุณ
นี่คือสาเหตุที่คุณไม่ควรรันหากไม่มีไฟล์เพจ โปรดทราบว่าอาจไม่ได้เขียนไปที่ pagefile จริง ๆ ! แต่จะยังช่วยให้คุณหลีกเลี่ยงข้อผิดพลาด "หน่วยความจำเหลือน้อย" และ "หน่วยความจำไม่เพียงพอ"
คำตอบระดับกลาง
Windows ไม่มีข้อผิดพลาดจริง ๆ สำหรับการเรียกใช้ RAM หมด สิ่งที่คุณกำลังจะหมดคือ "กระทำขีด จำกัด "
กราฟ "ระบบ" ใน Process Explorer รุ่นนั้นมีชื่อไม่ดี ควรมีข้อความระบุว่า "กระทำการเรียกเก็บเงิน" (ในเวอร์ชั่นฉันมีชื่อเรียกว่า "ระบบกระทำ" ดีกว่า แต่ก็ยังไม่สอดคล้องกันอย่างสมบูรณ์) ในกรณีใด ๆ ความสูง "ปัจจุบัน" ของกราฟมีสิ่งที่แสดงให้เห็นด้านล่างในส่วนข้อความว่า "Commit Charge" - " ปัจจุบัน "และความสูงสูงสุดของกราฟแสดง" Commit Charge "-" จำกัด "
"Commit charge" หมายถึงพื้นที่ที่อยู่เสมือนที่ได้รับการสนับสนุนโดย pagefile (ถ้าคุณมี) - กล่าวอีกนัยหนึ่งถ้ามันไม่พอดีกับ RAM ทั้งหมดส่วนที่เหลือจะอยู่ใน pagefile (มี vas ประเภทอื่นที่สนับสนุนโดยไฟล์อื่น - ที่เรียกว่า "mapped" vas - หรือต้องอยู่ใน RAM ตลอดเวลาส่วนหลังเรียกว่า "nonpageable") "กระทำขีด จำกัด " คือจำนวนสูงสุดที่ "กระทำการเก็บค่าธรรมเนียม" สามารถ มันเท่ากับขนาด RAM ของคุณบวกขนาดหน้าไฟล์
เห็นได้ชัดว่าคุณไม่มีไฟล์เพจ (ฉันสามารถบอกได้ว่าเนื่องจากขีด จำกัด การส่งข้อมูลของคุณเท่ากับขนาด RAM ของคุณ) ดังนั้นขีด จำกัด การส่งข้อมูลเป็นเพียงขนาด RAM
เห็นได้ชัดว่าโปรแกรมต่าง ๆ + ระบบปฏิบัติการได้ใช้ความมุ่งมั่นสูงสุดเกือบทั้งหมดที่เป็นไปได้
สิ่งนี้ไม่เกี่ยวข้องโดยตรงกับจำนวน RAM ที่ว่างหรือพร้อมใช้งาน ใช่คุณมี RAM ประมาณ 4.5 GB นั่นไม่ได้หมายความว่าคุณสามารถเกินขีดจำกัดความรับผิดชอบได้ หน่วยความจำที่ได้รับมอบหมายไม่จำเป็นต้องใช้ RAM และไม่ จำกัด โดยจำนวน RAM ที่มีอยู่
คุณจำเป็นต้องเปิดใช้งาน pagefile อีกครั้งโดยใช้ความมุ่งมั่นนี้ฉันขอแนะนำ pagefile ขนาด 16 GB เนื่องจากคุณไม่ต้องการบังคับให้ระบบปฏิบัติการเก็บรักษาสิ่งนั้นไว้ใน RAM และ pagefile จะทำงานได้ดีที่สุดหากมัน มีห้องว่างมากมาย - หรือเพิ่ม RAM มากขึ้น มากขึ้น เพื่อประสิทธิภาพที่ดีคุณต้องมีพื้นที่เหลือเฟือใน RAM สำหรับรหัสและสิ่งอื่น ๆ ที่ไม่ได้รับการสนับสนุนจาก pagefile (แต่สามารถแยกเพจออกเป็นไฟล์อื่นได้)
คำตอบที่ยาวมาก
(แต่ยังสั้นกว่าบทการจัดการหน่วยความจำของWindows Internals ... )
สมมติว่าโปรแกรมจัดสรรหน่วยความจำเสมือนกระบวนการส่วนตัว 100 MB สิ่งนี้ทำได้ด้วยการเรียก VirtualAlloc ด้วยตัวเลือก "ส่ง" ซึ่งจะส่งผลให้ "ค่าธรรมเนียมการเรียกเก็บ" เพิ่มขึ้น 100 MB แต่ "การจัดสรร" นี้ไม่ได้ใช้ RAM จริง ๆ ! RAM จะใช้เฉพาะเมื่อมีการเข้าถึงพื้นที่ที่อยู่เสมือนที่ได้มอบหมายใหม่เป็นครั้งแรก
วิธีใช้ RAM ในที่สุด
(ถ้าเคย)
การเข้าถึงพื้นที่ที่เพิ่งถูกกระทำเป็นครั้งแรกเกือบจะเป็นการเขียนหน่วยความจำเสมอ (การอ่าน vas ส่วนตัวที่จัดสรรใหม่ก่อนที่จะเขียนเป็นข้อผิดพลาดในการเขียนโปรแกรมเกือบตลอดเวลาเนื่องจากเนื้อหาเริ่มต้นของมันคือ แต่อ่านหรือเขียนผลครั้งแรกที่คุณสัมผัสหน้าของ vas ใหม่จัดสรรเป็นข้อบกพร่องของเพจ แม้ว่าคำว่า "ความผิดพลาด" ฟังดูแย่ แต่ความผิดพลาดของหน้าเป็นเหตุการณ์ที่คาดหวังอย่างสมบูรณ์และจำเป็นต้องมีแม้กระทั่งในระบบปฏิบัติการหน่วยความจำเสมือน
ในการตอบสนองต่อความผิดพลาดของหน้าชนิดนี้เพจเจอร์ (ส่วนหนึ่งของตัวจัดการหน่วยความจำของระบบปฏิบัติการซึ่งบางครั้งฉันจะเรียกสั้น ๆ ว่า "Mm") จะ:
- จัดสรรฟิสิคัลเพจของ RAM (ในอุดมคติจากรายการหน้าศูนย์ แต่ไม่ว่าในกรณีใดมันมาจากสิ่งที่ Windows เรียกว่า "ว่าง": รายการหน้าศูนย์ว่างหรือสแตนด์บายตามลำดับที่ต้องการ);
- กรอกข้อมูลในรายการตารางหน้าเพื่อเชื่อมโยงหน้าทางกายภาพกับหน้าเสมือน; และในที่สุดก็
- ยกเลิกข้อผิดพลาดหน้า
หลังจากนั้นรหัสที่ทำการอ้างอิงหน่วยความจำจะดำเนินการคำสั่งที่ทำให้เกิดความผิดพลาดของหน้าอีกครั้งและในครั้งนี้การอ้างอิงจะสำเร็จ
เราบอกว่าหน้านี้ถูก "faulted เข้า" กระบวนการทำงานที่ตั้งค่าและเป็น RAM ในตัวจัดการงานนี้จะปรากฏเป็นการเพิ่มหนึ่งหน้า (4 KB) ใน "ชุดการทำงานส่วนตัว" ของกระบวนการ และลดขนาดหน้าเดียวในหน่วยความจำกายภาพที่มีอยู่ (หลังอาจยากที่จะสังเกตเห็นในเครื่องไม่ว่าง)
หมายเหตุ 1:ความผิดพลาดของหน้านี้ไม่เกี่ยวข้องกับการอ่านจากดิสก์ เพจที่ไม่เคยเข้าถึงมาก่อนของหน่วยความจำเสมือนที่ได้รับมอบหมายไม่ได้เริ่มต้นชีวิตบนดิสก์ ก็มีสถานที่ที่ไม่มีบนดิสก์ที่จะอ่านมันจาก มันเป็นเพียง "ปรากฏ" ในหน้า RAM ที่มีอยู่ก่อนหน้านี้ ตามความเป็นจริงแล้วความผิดพลาดของหน้าส่วนใหญ่ได้รับการแก้ไขใน RAM ไม่ว่าจะเป็นเพจที่ใช้ร่วมกันที่มีอยู่แล้วใน RAM สำหรับกระบวนการอื่น ๆ หรือไปที่แคชหน้า - รายการสแตนด์บายหรือรายการที่แก้ไขหรือเป็นหน้า
หมายเหตุ 2:ใช้เวลาเพียงหนึ่งหน้า 4096 ไบต์จาก "ว่าง" โดยปกติแล้วจะไม่รับรู้ถึงพื้นที่ที่อยู่ที่กำหนดไว้ซึ่งจะเกิดความผิดพลาดเพียงครั้งละหนึ่งหน้าเนื่องจากแต่ละหน้าจะ "แตะ" เป็นครั้งแรก จะไม่มีการปรับปรุงไม่มีข้อได้เปรียบในการทำมากขึ้นในแต่ละครั้ง; มันจะใช้เวลานานเท่า n ในทางตรงกันข้ามเมื่อต้องอ่านหน้าจากดิสก์จะมีการพยายาม "readahead" บางส่วนเนื่องจากเวลาส่วนใหญ่ในการอ่านดิสก์อยู่ในค่าใช้จ่ายต่อการดำเนินการไม่ใช่การถ่ายโอนข้อมูลจริง จำนวน "มุ่งมั่น" ยังคงอยู่ที่ 100 MB; ความจริงที่ว่าหนึ่งหรือหน้ามีความผิดไม่ลดค่าคอมมิชชัน
หมายเหตุ 3:สมมติว่าเรามี RAM "พร้อมใช้งาน" 4 GB นั่นหมายความว่าเราสามารถอ้างอิงหน่วยความจำที่กำหนดแล้ว แต่ไม่เคยอ้างอิงมาก่อนได้ประมาณหนึ่งล้านครั้ง (4 GB / 4096) ก่อนที่เราจะหมด RAM ณ จุดนี้หากเรามีไฟล์เพจตามที่ David Cutler และ Lou Perazzoli ตั้งใจไว้เพจที่ยาวที่สุดที่ผ่านมาแล้วที่อ้างอิงใน RAM จะถูกบันทึกไว้ในดิสก์จากนั้นทำให้พร้อมใช้งานเพื่อแก้ไขข้อบกพร่องของหน้าเว็บที่ผ่านมาเหล่านี้ (อันที่จริงแล้วระบบปฏิบัติการจะเริ่มวิธีการเรียกคืน RAM เช่น "การตัดชุดการทำงาน" ก่อนหน้านั้นและการเขียนไปยังไฟล์เพจจริงจะถูกแคชและเป็นแบทช์ในรายการเพจที่ปรับเปลี่ยนเพื่อประสิทธิภาพและและ ... ) นับ "มุ่งมั่น" แม้ว่าจะเกี่ยวข้องกับ "การ จำกัด ขีด จำกัด " หากไม่มีที่ว่างสำหรับ "
และมันก็เกิดขึ้น ...
แต่สมมติว่าเรายังไม่ได้ทำการอ้างอิงมากกว่าล้านคนและยังมีหน้าที่ "พร้อมใช้งาน" ประมาณ 4GB ทีนี้สมมติว่ากระบวนการเดียวกัน - หรืออื่น ๆ ไม่สำคัญ - VirtualAlloc อื่นจะทำในเวลานี้รับ 200 MB อีกครั้งนี้ 200 MB ได้รับการเพิ่มค่าใช้จ่ายการกระทำและจะไม่ลบ RAM ใด ๆ จากที่มีอยู่ เพียงแค่พื้นที่ที่อยู่ VirtualAlloc'ating ไม่ได้ใช้ RAM ในปริมาณที่เท่ากันและ RAM ที่ "พร้อมใช้" ต่ำจะไม่ จำกัด จำนวนพื้นที่ที่อยู่ที่คุณสามารถใช้ VirtualAlloc (หรือ RAM ที่มีความพร้อมใช้งานสูงไม่เพิ่ม)
(ก็โอเค ... มีค่าใช้จ่ายเล็กน้อยนิดหน่อยจำนวนหน้า (หน้าเว็บ!) ที่ใช้สำหรับหน้าตารางสำหรับทุก ๆ 2 MB (4 MB ถ้าคุณใช้ x86 ไม่ใช่ระบบ PAE) ของ การจัดสรรพื้นที่ที่อยู่เสมือนและมี "ตัวบอกที่อยู่เสมือน" ของสองสามหมื่นไบต์สำหรับแต่ละช่วงที่จัดสรรต่อเนื่องกันอย่างแท้จริง)
ด้วยวิธีนี้มันเป็นไปได้ - และร่วมกัน! - ใช้ "กระทำการคิดค่าธรรมเนียม" จำนวนมากโดยใช้ RAM เพียงเล็กน้อยเท่านั้น
ดังนั้นหาก "การยอมรับ" พื้นที่ที่อยู่เสมือนไม่ได้ใช้ RAM ถึงทำไมต้องมีการ จำกัด ?
เนื่องจาก "การเรียกเก็บเงินค่าธรรมเนียม" จะแสดงถึงการใช้พื้นที่เก็บข้อมูลในอนาคต "ขีด จำกัด การยอมรับ" หมายถึงจำนวนพื้นที่เก็บข้อมูลทั้งหมด (พื้นที่ว่าง RAM + pagefile) ที่มีอยู่เพื่อจัดการการจัดสรรดังกล่าวหากมีการอ้างอิงจริงและต้องมีการจัดเก็บไว้ที่ใดที่หนึ่ง
เมื่อ Mm อนุมัติการร้องขอ VirtualAlloc มันเป็นสัญญา - "ทำให้ความมุ่งมั่น" - ว่าหน่วยความจำที่ตามมาทั้งหมดเข้าถึงพื้นที่ที่จัดสรรจะประสบความสำเร็จ; พวกเขาอาจส่งผลให้ความผิดพลาดของหน้า แต่ความผิดพลาดทั้งหมดจะสามารถแก้ไขได้เนื่องจากมีพื้นที่จัดเก็บเพียงพอที่จะเก็บเนื้อหาของหน้าเหล่านั้นทั้งหมดไม่ว่าจะเป็น RAM หรือใน pagefile Mm รู้สิ่งนี้เพราะรู้ว่ามีพื้นที่เก็บข้อมูลเท่าไหร่ (ขีด จำกัด การส่ง) และจำนวนที่ได้รับ "ยืนยัน" (ค่าภาระผูกพันปัจจุบัน)
(แต่ทุกหน้าเหล่านั้นยังไม่ได้รับการเข้าถึงดังนั้นจึงไม่จำเป็นต้องมีพื้นที่เก็บข้อมูลจริงตามจำนวนที่กำหนดในเวลาใดก็ตาม)
ดังนั้น ... "ระบบมีหน่วยความจำไม่พอ"?
หากคุณพยายามที่จะ VirtualAlloc และค่าใช้จ่ายการกระทำในปัจจุบันรวมทั้งขนาดการจัดสรรที่ร้องขอจะนำคุณเกินขีด จำกัด การกระทำและระบบปฏิบัติการไม่สามารถขยาย pagefile เพื่อเพิ่มขีด จำกัด การกระทำ ... คุณจะได้รับ "หน่วยความจำไม่พอ" ขึ้นและกระบวนการเห็นการโทร VirtualAlloc FAIL รายการส่วนใหญ่เพิ่งจะจับมือกันแล้วตายในจุดนั้น บางคนจะกดอย่างต่อเนื่องโดยสมมติว่าการโทรสำเร็จและล้มเหลวในภายหลังเมื่อพวกเขาพยายามอ้างอิงภูมิภาคที่พวกเขาคิดว่าจัดสรรไว้
อีกครั้ง (ขออภัยสำหรับการทำซ้ำ): มันไม่สำคัญว่าคุณมี RAM พร้อมใช้งานเท่าใด ระบบปฏิบัติการที่มีสัญญาว่า RAM หรือ pagefile พื้นที่ที่จะสามารถใช้ได้เมื่อมันจำเป็น แต่สัญญาที่ไม่ได้ลบออกจาก "ที่มีอยู่" RAM ที่มีอยู่จะถูกใช้โดย vm ที่กำหนดไว้เท่านั้นเมื่อมีการอ้างอิงเป็นครั้งแรกซึ่งเป็นสาเหตุที่ทำให้ "faulted in" ... คือรับรู้ในหน่วยความจำกายภาพ และเพียงแค่ยอมรับ (= การจัดสรร) หน่วยความจำเสมือนไม่ได้ทำเช่นนั้น ใช้พื้นที่ที่อยู่เสมือนฟรีเท่านั้นและทำให้พื้นที่ที่อยู่เสมือนที่ใช้งานได้หมดไป
แต่ใน "ออกจากความทรงจำ" กรณีที่มีได้รับการร้องขอการจัดสรรสำหรับหน่วยความจำความมุ่งมั่นและระบบปฏิบัติการปัจจุบันได้มีการเพิ่มค่าใช้จ่ายกระทำกับขนาดของคำขอ Neew นี้ ... และพบว่าทั้งหมดเป็นมากขึ้นกว่ากระทำขีด จำกัด ดังนั้นหากระบบปฏิบัติการอนุมัติใหม่นี้และพื้นที่ทั้งหมดนั้นถูกอ้างอิงหลังจากนั้นจะไม่มีตำแหน่งจริง ๆ (RAM + pagefile) เพื่อจัดเก็บทั้งหมด
ระบบปฏิบัติการจะไม่อนุญาตสิ่งนี้ มันจะไม่อนุญาตให้มีการจัดสรร vas มากกว่าที่จะมีพื้นที่สำหรับเก็บไว้ในกรณีที่เลวร้ายที่สุด - แม้ว่าทั้งหมดจะได้รับ "ความผิดพลาด" นั่นคือจุดประสงค์ของการ "กระทำขีด จำกัด "
ฉันบอกคุณสามครั้งฉันบอกคุณสามครั้งฉันบอกคุณสามครั้ง:จำนวนของ "พร้อมใช้" RAM ไม่สำคัญ การที่พื้นที่เสมือนที่ได้รับมอบหมายนั้นยังไม่ได้ใช้พื้นที่เก็บข้อมูลทั้งหมดนั้นก็ไม่สำคัญ Windows ไม่สามารถ "ส่งมอบ" ให้กับการจัดสรรเสมือนได้นอกจากว่า '' can '' ทั้งหมดจะมีข้อบกพร่องในอนาคต
หมายเหตุมี vas อีกประเภทหนึ่งที่เรียกว่า "แมป" ซึ่งส่วนใหญ่ใช้สำหรับรหัสและการเข้าถึงไฟล์ข้อมูลขนาดใหญ่ แต่จะไม่ถูกเรียกเก็บเงินเพื่อ "กระทำการเรียกเก็บเงิน" และไม่ถูก จำกัด โดย "กระทำขีด จำกัด " นี่เป็นเพราะมันมาพร้อมกับพื้นที่จัดเก็บของตัวเองไฟล์ที่ "แมป" กับมัน ข้อ จำกัด เพียงอย่างเดียวของ "mapped" vas คือจำนวนพื้นที่ดิสก์ที่คุณมีสำหรับไฟล์ที่แม็พและจำนวนของ vas ฟรีในกระบวนการของคุณเพื่อแม็พเข้ากับพวกเขา
แต่เมื่อฉันดูระบบฉันยังไม่ถึงขีด จำกัด การกระทำหรือ
นั่นเป็นปัญหาการวัดและการเก็บบันทึก คุณกำลังดูระบบหลังจากการโทร VirtualAlloc ได้รับการลองและล้มเหลวแล้ว
สมมติว่าคุณมีขีด จำกัด การส่งเหลือเพียง 500 MB และบางโปรแกรมได้ลองใช้ VirtualAlloc 600 MB ความพยายามล้มเหลว จากนั้นคุณดูที่ระบบและพูดว่า "มีอะไรเหลืออีก 500 MB!" ในความเป็นจริงอาจมี heck เหลืออยู่มากแล้วเนื่องจากกระบวนการในคำถามมีแนวโน้มไปโดยสมบูรณ์ในจุดนั้นดังนั้นหน่วยความจำที่ได้รับมอบหมายก่อนหน้านี้ทั้งหมดได้รับการเผยแพร่
ปัญหาคือคุณไม่สามารถมองย้อนกลับไปในเวลาและดูว่าค่าใช้จ่ายการกระทำคืออะไรในขณะที่พยายามจัดสรร และคุณยังไม่ทราบว่ามีความพยายามเท่าไร ดังนั้นคุณจึงไม่สามารถทราบได้อย่างชัดเจนว่าเหตุใดความพยายามจึงล้มเหลวหรือจำเป็นต้องใช้ "ขีด จำกัด การส่ง" จำนวนเท่าใดเพื่อให้สามารถใช้งานได้
ฉันเคยเห็น "ระบบมีหน่วยความจำเหลือน้อย " นั่นอะไร?
หากในกรณีข้างต้นระบบปฏิบัติการสามารถขยาย pagefile (เช่นคุณปล่อยไว้ที่การตั้งค่าเริ่มต้น "ระบบจัดการ" หรือคุณจัดการ แต่คุณตั้งค่าสูงสุดเป็นใหญ่กว่าเริ่มต้นและมีพื้นที่ว่างในดิสก์เพียงพอ) และ การขยายดังกล่าวเพิ่มขีด จำกัด การส่งข้อมูลอย่างเพียงพอเพื่อให้การโทร VirtualAlloc สำเร็จแล้ว ... Mm ขยาย pagefile และการโทร VirtualAlloc สำเร็จ
และนั่นคือเมื่อคุณเห็น "ระบบกำลังทำงาน LOW ในหน่วยความจำ" นั่นคือการเตือนล่วงหน้าว่าหากสิ่งต่าง ๆ ดำเนินต่อไปโดยไม่มีการลดทอนคุณจะเห็นคำเตือน "หน่วยความจำไม่เพียงพอ" ในไม่ช้า ได้เวลาปิดแอพบางตัวแล้ว ฉันจะเริ่มต้นด้วยหน้าต่างเบราว์เซอร์ของคุณ
และคุณคิดว่าเป็นสิ่งที่ดีหรือไม่? การขยายไฟล์เพจนั้นชั่วร้าย !!!
ไม่มันไม่ใช่ ดูว่าระบบปฏิบัติการไม่ได้ "ขยาย" ไฟล์ที่มีอยู่จริงๆ เพียงจัดสรรขอบเขตใหม่ เอฟเฟกต์จะคล้ายกับไฟล์ที่ไม่ต่อเนื่องอื่น ๆ เนื้อหาของไฟล์เพจเก่าอยู่ในตำแหน่งที่เหมาะสม พวกเขาไม่จำเป็นต้องคัดลอกไปยังสถานที่ใหม่หรืออะไรทำนองนั้น เนื่องจาก pagefile IO ส่วนใหญ่อยู่ในกลุ่มที่ค่อนข้างเล็กเมื่อเทียบกับขนาดของ pagefile โอกาสที่การถ่ายโอนใด ๆ ที่ให้จะข้ามขอบเขตนั้นค่อนข้างหายากจริง ๆ ดังนั้นการแตกแฟรกเมนต์จึงไม่เจ็บมากนัก
ในที่สุดเมื่อกระบวนการทั้งหมดที่มีพื้นที่ "มุ่งมั่น" ในส่วนขยายเลิกแล้ว (ที่ปิดระบบปฏิบัติการหากไม่ช้ากว่านี้) ส่วนต่อขยายจะถูกปล่อยอย่างเงียบ ๆ และ pagefile จะกลับไปสู่ขนาดและการจัดสรรก่อนหน้านี้ - เป็นเช่นนั้นอีกครั้ง
การอนุญาตให้ส่วนขยายของ pagefile ทำหน้าที่เป็นเครือข่ายความปลอดภัยที่ไม่ต้องเสียค่าใช้จ่าย: หากคุณอนุญาต แต่ระบบไม่ต้องการระบบจะไม่ "ขยายและหดตัว pagefile อย่างต่อเนื่อง" ซึ่งมักถูกอ้างสิทธิ์ดังนั้นจึงไม่มีค่าใช้จ่ายใดๆ และถ้าคุณต้องการมันจะช่วยให้คุณไม่พลาดแอพที่มีข้อผิดพลาด "ออกจากหน่วยความจำเสมือน"
แต่ แต่ ...
ฉันได้อ่านเว็บไซต์หลายสิบแห่งแล้วว่าถ้าคุณอนุญาตให้ขยายไฟล์เพจได้ Windows จะขยายและหดไฟล์เพจอย่างต่อเนื่องและนั่นจะส่งผลให้ไฟล์เพจเพจแตกออกเป็นชิ้น ๆ จนกว่าคุณจะดีแฟรก
พวกเขาแค่ผิด
หากคุณไม่เคยเห็น "ป๊อปอัพหน่วยความจำเหลือน้อย" (หรือในเวอร์ชั่นเก่ากว่า "หน่วยความจำเสมือนเหลือน้อย") ป๊อปอัพระบบปฏิบัติการจะไม่ขยายไฟล์เพจของคุณ
หากคุณเห็นป๊อปอัปนั้นแสดงว่าขนาดไฟล์เพจเริ่มต้นของคุณนั้นเล็กเกินไป (ฉันต้องการตั้งค่าการใช้งานที่สังเกตได้สูงสุด 4x เช่นตัวนับ perfmon counter% "สูงสุด pagefile ควรต่ำกว่า 25% เหตุผล: พื้นที่ Pagefile ถูกจัดการเหมือนกับฮีปอื่น ๆ และทำงานได้ดีที่สุดกับพื้นที่ว่างมากมาย เพื่อเล่นค่ะ)
แต่ทำไมพวกเขาไม่เพียงแค่ ...
หนึ่งอาจโต้แย้งว่าระบบปฏิบัติการควรปล่อยให้การจัดสรรเกิดขึ้นแล้วปล่อยให้การอ้างอิงล้มเหลวหากไม่มี RAM พร้อมใช้งานเพื่อแก้ไขข้อบกพร่องของหน้า กล่าวอีกนัยหนึ่งข้างต้นที่เราอธิบายว่าข้อบกพร่องของหน้าเริ่มต้นทำงานอย่างไรถ้า "จัดสรรหน้าทางกายภาพที่มีอยู่ของ RAM" (ขั้นตอนที่ 1) ไม่สามารถทำได้เพราะไม่มีที่ว่างและไม่มีที่ ออกจากหน้าไปยังหน้าอะไรเพื่อให้พร้อมใช้งานหรือไม่
จากนั้นเพจเจอร์จะไม่สามารถแก้ไขข้อบกพร่องของหน้าได้ มันจะต้องอนุญาตให้มีการรายงานข้อยกเว้น (ความผิดพลาดของหน้า) กลับไปที่เธรดที่มีข้อผิดพลาดซึ่งอาจเปลี่ยนเป็นรหัสข้อยกเว้นอื่น ๆ
ปรัชญาการออกแบบคือ VirtualAlloc จะส่งกลับค่าศูนย์ (ตัวชี้ NULL ทางเทคนิค) แทนที่จะเป็นที่อยู่หากคุณไม่มีขีด จำกัด การส่งมอบและมีเหตุผลอย่างสมบูรณ์ที่คาดว่าโปรแกรมเมอร์จะรู้ว่าการเรียก VirtualAlloc สามารถล้มเหลวได้ ดังนั้นโปรแกรมเมอร์คาดว่าจะตรวจสอบกรณีนั้นและทำสิ่งที่สมเหตุสมผลในการตอบสนอง (เช่นให้โอกาสคุณบันทึกงานของคุณจนถึงจุดนั้นและจากนั้นจบโปรแกรม "อย่างสง่างาม") (โปรแกรมเมอร์: คุณตรวจสอบตัวชี้ NULL ที่ส่งคืนจาก malloc ใหม่ ฯลฯ ใช่แล้วทำไมคุณไม่ทำเช่นนี้?)
แต่โปรแกรมเมอร์ไม่ควรคาดหวังว่าจะมีการอ้างอิงหน่วยความจำอย่างง่าย
i = 0; // initialize loop counter
อาจล้มเหลว - ไม่ใช่ถ้าอยู่ในพื้นที่ที่กำหนดพื้นที่สำเร็จ (หรือพื้นที่ที่อยู่ที่แมปสำหรับเรื่องนั้น) แต่นั่นคือสิ่งที่อาจเกิดขึ้นหากมีการปฏิบัติตามปรัชญา "อนุญาตให้มีการจัดสรรมากเกินไปให้การอ้างอิงหน่วยความจำล้มเหลว"
น่าเสียดายที่การอ้างอิงหน่วยความจำเช่นเดียวกับในโค้ดข้างบนนั้นไม่มีวิธีที่สะดวกในการส่งคืนสถานะที่ไม่ดี! พวกมันควรจะทำงานเช่นเดียวกับการบวกและการลบ วิธีเดียวที่จะรายงานความล้มเหลวดังกล่าวจะเป็นข้อยกเว้น ดังนั้นในการจัดการกับพวกเขาโปรแกรมเมอร์จะต้องห่อโปรแกรมทั้งหมดไว้ในตัวจัดการข้อยกเว้น (ลอง ... จับและทั้งหมดนั้น)
สามารถทำได้ ... แต่มันเป็นเรื่องยากสำหรับผู้ดำเนินการที่จะรู้วิธี "ทำสิ่งที่ถูกต้อง" เพื่อตอบสนองต่อข้อยกเว้นเหล่านั้นเนื่องจากจะมีหลายจุดหลายจุดในรหัสที่สามารถเกิดขึ้นได้ (โดยเฉพาะพวกมันสามารถเกิดขึ้นได้ทุกหน่วยความจำที่อ้างอิงถึงหน่วยความจำ VirtualAlloc, ไปยังหน่วยความจำที่จัดสรรด้วย malloc หรือใหม่ ... และตัวแปรท้องถิ่นทั้งหมดเช่นกันเนื่องจากสแต็กคือ VirtualAlloc'd เช่นกัน)
ในระยะสั้นทำให้โปรแกรมล้มเหลวอย่างสง่างามในกรณีเหล่านี้จะเป็นเรื่องยากมาก
ในทางกลับกันมันค่อนข้างง่ายที่จะตรวจสอบตัวชี้ NULL ที่ส่งคืนจาก VirtualAlloc (หรือ malloc หรือใหม่สำหรับเรื่องนั้นแม้ว่าพวกเขาจะไม่เหมือนกัน) และจากนั้นทำสิ่งที่สมเหตุสมผล ... เช่นไม่พยายามไป ในและทำสิ่งที่มันเป็นโปรแกรมที่ต้องการพื้นที่เสมือนจริงสำหรับ และอาจถามผู้ใช้ว่าพวกเขาต้องการบันทึกงานของพวกเขาหรือไม่ถ้ามี (ได้รับแอพจำนวนมากเกินไปไม่ต้องกังวลกับการทำสิ่งนั้นมาก)
ผู้ใช้รายอื่นที่กระทำ
อนึ่ง "ขีด จำกัด การส่งมอบ" จะไม่ลดลงเนื่องจากการปันส่วนต่าง ๆ ของระบบปฏิบัติการเช่นกลุ่มเพจและเพจที่ไม่ใช่เพจรายการ PFN และอื่น ๆ ; สิ่งเหล่านี้จะถูกคิดค่าใช้จ่ายเพื่อรับผิดชอบเมื่อมันเกิดขึ้น และไม่รับผิดชอบค่าใช้จ่ายหรือขีด จำกัด ที่ได้รับผลกระทบจาก Video RAM หรือแม้แต่ขนาดหน้าต่าง "RAM" วิดีโอเช่นกัน
ทดสอบด้วยตัวเอง
คุณสามารถสาธิตทั้งหมดนี้ได้ด้วยเครื่องมือทดสอบจากเว็บไซต์ SysInternals ตัวเลือก -m จะจัดสรรพื้นที่ที่อยู่ที่กำหนด แต่จะไม่ "แตะ" มันดังนั้นจะไม่ทำให้เกิดการจัดสรร RAM ในขณะที่ตัวเลือก -d จะจัดสรรและอ้างอิงหน้าเว็บทำให้ทั้งสองยอมรับการเพิ่มและ RAM ที่พร้อมใช้งานเพื่อลด
อ้างอิง
Windows Internalsโดย Russinovich, Solomon และ Ionescu แม้จะมีการสาธิตที่ช่วยให้คุณสามารถพิสูจน์จุดเหล่านี้ทั้งหมดโดยใช้เครื่องมือทดสอบ อย่างไรก็ตามฉันต้องเตือนคุณว่าถ้าคุณคิดว่ามันนานให้เตือน: บท Mm เพียงอย่างเดียวคือ 200 หน้า; ด้านบนเป็นเวอร์ชั่นที่ง่ายมาก (โปรดดูที่ส่วน "การรับทราบ" ในบทนำ)
ดูเอกสารประกอบของ MSDN VirtualAlloc