Windows แจ้งว่า RAM หมดในขณะที่ยังมีหน่วยความจำกายภาพ 4 GB ให้เลือก


24

สกรีนช็อตของข้อมูลระบบจาก Process Explorer

ข้อมูลระบบนี้มาจาก Process Explorer ยังคงมีหน่วยความจำกายภาพ แต่ระบบแสดงให้เห็นว่าแทบจะไม่มี RAM เหลืออยู่

ตัวจัดการงานยังแสดงให้เห็นว่ามีการใช้ RAM ทั้งหมดประมาณ 74%

ตั้งแต่ติดตั้ง Windows 8.1 คอมพิวเตอร์มี RAM 4 + 8 = 12 GB ฉันอัพเกรดมันโดยเปลี่ยน 4 GB เป็นโมดูล 8 GB นั่นอาจเป็นปัญหาหรือไม่ หรือพฤติกรรมนี้เป็นเรื่องปกติและฉันเพิ่งเข้าใจความหมายของความจำทางกายภาพที่มีอยู่ผิดหรือเปล่า?


รูปภาพที่เขาพยายามแนบอยู่ที่นี่: tinypic.com/view.php?pic=npon5c&s=8#.Va3P3_lVhBc ฉันอนุมัติการแก้ไขเพื่อเพิ่ม URL นี้ แต่เห็นได้ชัดว่าไม่เพียงพอ
เจมี่ Hanrahan

@JamieHanrahan: ควรอัปโหลดรูปภาพโดยใช้Ctrl+Gทางลัดเพื่อให้ Stack Exchange สามารถป้องกันไม่ให้เน่าเปื่อยไปตามกาลเวลา
Deltik

@Deltik ไม่ใช่ภาพของฉันที่จะอัพโหลด
เจมี่ Hanrahan

@JamieHanrahan - เมื่อคำถามที่ถูกส่งวัสดุที่ได้รับมอบหมายให้ใบอนุญาตให้ใช้ภาพเป็นชุมชนที่จุดนี้ ..
Ramhound

ระบุไว้สำหรับการอ้างอิงในอนาคตขอบคุณ ฉันเห็นลิงค์ไปยังไซต์จิ๋วในการแก้ไขที่เสนอและฉันอนุมัติการแก้ไขนั้น แต่ไม่มีผลใด ๆ
เจมี่ Hanrahan

คำตอบ:


65

คำตอบสั้น ๆ

ป๊อปอัพ "หน่วยความจำไม่เพียงพอ" แจ้งว่าคุณมีหน่วยความจำส่วนตัวที่กำหนดไว้ไม่เกินขีด จำกัด- ประเภทของหน่วยความจำเสมือน ไม่ใช่ว่าคุณหมด 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") จะ:

  1. จัดสรรฟิสิคัลเพจของ RAM (ในอุดมคติจากรายการหน้าศูนย์ แต่ไม่ว่าในกรณีใดมันมาจากสิ่งที่ Windows เรียกว่า "ว่าง": รายการหน้าศูนย์ว่างหรือสแตนด์บายตามลำดับที่ต้องการ);
  2. กรอกข้อมูลในรายการตารางหน้าเพื่อเชื่อมโยงหน้าทางกายภาพกับหน้าเสมือน; และในที่สุดก็
  3. ยกเลิกข้อผิดพลาดหน้า

หลังจากนั้นรหัสที่ทำการอ้างอิงหน่วยความจำจะดำเนินการคำสั่งที่ทำให้เกิดความผิดพลาดของหน้าอีกครั้งและในครั้งนี้การอ้างอิงจะสำเร็จ

เราบอกว่าหน้านี้ถูก "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


4
@ ACEPL ฉันอธิบายว่าทำไม โดยสรุป: มันเกิดขึ้นเพราะขีดจำกัดความรับผิดชอบของเขาต่ำเกินไปสำหรับภาระงานของเขา ข้อ จำกัด การคอมมิตคือขนาด RAM ทั้งหมด + ขนาดไฟล์เพจปัจจุบัน จำนวนแรม "พร้อมใช้" ไม่ได้ใส่เข้าไป กลไก "ขีด จำกัด การกระทำ" จะไม่อนุญาตให้มีการจัดสรรพื้นที่ที่อยู่เสมือนเกินกว่าความพร้อมใช้งานของที่เก็บข้อมูลจริง (RAM + ที่เก็บข้อมูลสำรองบนดิสก์เช่นเพจไฟล์) เพื่อเก็บข้อมูล โปรดจำไว้ว่าแม้ว่ามันจะเป็นเสมือนจริง แต่ก็ต้องถูกเก็บไว้ที่ใดที่หนึ่งเมื่อมีข้อบกพร่องในครั้งแรก
เจมี่ Hanrahan

5
@AcePL - ผู้ใช้มีหน่วยความจำไม่เพียงพอ เขาใช้หน่วยความจำเสมือนไม่เพียงพอ คำอธิบายนี้ถูกต้อง 100%
Ramhound

1
@Rahul Basu ที่จริงแล้วฉันคาดหวังว่าความคิดเห็นสั้น ๆ นั้นจะยากกว่าที่จะเข้าใจ ;) คำถามที่คล้ายกันนี้เป็นหลักฐานว่าหลายคนมีความเข้าใจที่คลาดเคลื่อนเกี่ยวกับหน่วยความจำเสมือนพื้นที่ที่อยู่ชุดการทำงาน ฯลฯ ไม่ใช่ความผิดของพวกเขา - มันเป็นเรื่องที่ซับซ้อนมากและการแสดงของ MS ไม่เคยชัดเจนเท่าที่ควร . แต่มันต้องใช้คำมากมายในการอธิบายแม้แต่ชิ้นเดียว ของ Windows Internalsจะมีแผนภาพซึ่งความช่วยเหลือ ไดอะแกรมแบบภาพเคลื่อนไหวจะดียิ่งขึ้น ...
Jamie Hanrahan

3
อาจเป็นไปได้ที่น่าสนใจ: "ปล่อยให้การจัดสรรเกิดขึ้นจากนั้นปล่อยให้การอ้างอิงล้มเหลวหากไม่มี RAM ที่ใช้ในการแก้ไขข้อบกพร่องของหน้า" คล้ายกับสิ่งที่ Linux ทำตามค่าเริ่มต้น: มันอนุญาตจำนวน overcommit แต่ในบางจุด จะวิ่งออกมาจากหน่วยความจำเสมือนสำหรับหน้าสกปรกและที่ว่าเมื่อออกจากหน่วยความจำเตะฆาตกรใน ... และฆ่าสิ่งที่อาจจะเป็นกระบวนการที่เกี่ยวข้องอย่างสมบูรณ์ ใช่น่ารังเกียจ
Bob

1
@JamieHanrahan ดูเหมือนว่าคุณได้ทำไปแล้ว (ขอโทษนะยุ่งนิดหน่อย) ใช่ overcommit สามารถกำหนดค่าได้และ distros บางตัวจะปิดการใช้งาน แต่ดูเหมือนว่ามันยังคงเป็นเรื่องปกติในปี 2013และ2014และฉันเชื่อว่ามันเป็นค่าเริ่มต้นเคอร์เนลเมื่อไม่ได้ตั้งค่าอย่างชัดเจน (โดย distro หรือโดยผู้ใช้)
Bob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.