ดังนั้นฉันมีการพูดคุยกับเจ้านายของฉันเล็กน้อยเกี่ยวกับการจัดการหน่วยความจำ
ฉันได้รับแจ้งว่าการฆ่ากระบวนการไม่อนุญาตให้ยกเลิกการจัดสรรหน่วยความจำ เป็นเช่นนั้นหรือไม่หรือเป็นปีที่ผ่านมา?
เรากำลังพูดถึงทั้ง Windows และ OS X ที่นี่
ดังนั้นฉันมีการพูดคุยกับเจ้านายของฉันเล็กน้อยเกี่ยวกับการจัดการหน่วยความจำ
ฉันได้รับแจ้งว่าการฆ่ากระบวนการไม่อนุญาตให้ยกเลิกการจัดสรรหน่วยความจำ เป็นเช่นนั้นหรือไม่หรือเป็นปีที่ผ่านมา?
เรากำลังพูดถึงทั้ง Windows และ OS X ที่นี่
คำตอบ:
เป็นเวลานานแล้วที่ฉันได้เรียนรู้สิ่งนี้ แต่นี่จะไป
เมื่อระบบปฏิบัติการเปิดตัวกระบวนการมันจะกำหนดหน้าจากตารางหน่วยความจำเสมือน ระบบปฏิบัติการมีหน้าที่รับผิดชอบในการดูแลรักษาแผนที่จากตารางหน่วยความจำเสมือนไปยังหน่วยความจำจริงหรือไปยังพื้นที่สว็อปบนดิสก์ เมื่อกระบวนการถูกฆ่า OS ไม่เพียงหยุดให้ CPU ทำงาน รายการล้างข้อมูลไม่กี่รายการซึ่งหนึ่งในนั้นทำเครื่องหมายหน้าหน่วยความจำทั้งหมดว่าว่าง สิ่งนี้ทำให้แอปพลิเคชันอื่นสามารถนำกลับมาใช้ซ้ำได้ ระบบปฏิบัติการอาจล้างข้อมูลทรัพยากรที่กระบวนการนั้น ๆ ปิดไฟล์โดยอัตโนมัติการเชื่อมต่อเครือข่ายท่อไปสู่กระบวนการและอื่น ๆ กระบวนการนี้อยู่ภายใต้การควบคุมของระบบปฏิบัติการทั้งหมดและขั้นตอนเหล่านี้จะถูกนำมาใช้ไม่ว่ากระบวนการจะตายอย่างไร
จำไว้ว่าทั้งหมดนี้ใช้กับกระบวนการของระบบปฏิบัติการ หากคุณมีเครื่องเสมือนบางอย่างและใช้กระบวนการเสมือนหลายอย่างพร้อมกัน VM ก็มีหน้าที่ตัดสินใจว่าจะจัดสรรและยกเลิกการจัดสรรได้อย่างไร อย่างไรก็ตามจากระบบปฏิบัติการดูเหมือนว่ายังมีกระบวนการเดียวอยู่ ดังนั้นในกรณีนี้ถ้าคุณมี VM ที่รันหลายกระบวนการและคุณฆ่าหนึ่งใน VM คุณอาจจะไม่ได้รับหน่วยความจำกลับมาในโฮสต์ระบบปฏิบัติการทันที แต่คุณจะเอามันกลับคืนมาใน VM หากคุณฆ่า VM ภายในระบบปฏิบัติการดังนั้น OS จะฆ่า VM (ซึ่งจะทำการฆ่ากระบวนการของ VM) โดยอ้อม) และเรียกคืนหน่วยความจำทั้งหมด (ซึ่งไม่จำเป็นต้องผ่านตัวรวบรวมขยะฟรี) () ลบหรือสิ่งอื่นใด)
เก็งกำไรสูง:
หาก. NET ทำงานเป็นเครื่องเสมือนที่มีแอพ. NET มากกว่าหนึ่งรายการบน VM เดียวกันดังนั้น. NET สามารถเก็บไว้ในหน่วยความจำที่ไม่ใช่ GCd จนกว่าจะรัน GC และ Windows จะคิดว่า. NET เป็น ใช้มากกว่าที่เป็นจริง (และถ้า MS ลื่นจริงๆ Windows ก็สามารถบอก. NET ถึง GC ในสถานการณ์ความทรงจำที่แน่นหนา แต่แทบจะไม่มีข้อแม้เลยเพราะนั่นคือพื้นที่ว่างในการแลกเปลี่ยนของดิสก์)
ถ้า. NET ทำงานในลักษณะนั้นระบบปฏิบัติการจะยังคงคิดว่ามันเป็นกระบวนการหนึ่งสำหรับวัตถุประสงค์ของระบบปฏิบัติการซึ่งรับผิดชอบในการตัดสินใจว่าจะเก็บอะไรและอะไรที่จะต้องทิ้งไปและมันก็ไม่ใช่ปัญหาของ Windows ที่จะบอกกระบวนการที่ต้องการ เพื่อเริ่มการจัดสรรคืนหน่วยความจำ ณ จุดนี้เป็นไปได้ที่ MS จะสร้าง API พิเศษเฉพาะสำหรับ. NET เพื่อให้กระบวนการ. NET มีลักษณะคล้ายกับกระบวนการของ Windows ยกเว้นว่าเป็นเช่นนั้นนั่นคือสาเหตุที่คนทั่วไปคิดว่าหน่วยความจำกระบวนการไม่ได้รับการจัดสรรคืน มันคือจริง ๆ ; เป็นเพียงว่าคุณกำลังดูกระบวนการที่ผิด
ฉันไม่รู้เกี่ยวกับ. NET ที่จะบอกว่ามันใช้งานได้จริง Java VM ไม่แน่นอน
สิ้นสุดการเก็งกำไร
แก้ไข:ตราบเท่าที่การฆ่ากระบวนการไม่ดีสำหรับการจัดการหน่วยความจำที่เกี่ยวข้องนั้นต้องใช้หลายกระบวนการในการจัดสรรออกจากกลุ่มเดียวกัน (เช่นพวกเขาเป็นเหมือนกระทู้มากกว่ากระบวนการจริง) และหน่วยความจำที่จะไม่เป็นอิสระหลังจากกระบวนการคือ ถูกฆ่าตาย ที่เกือบจะต้องใช้ระบบมัลติทาสกิ้งแบบมีส่วนร่วมเพราะหน่วยความจำเสมือนและมัลติทาสกิ้งแบบ pre-emptive เป็นความรู้ของฉันซึ่งมักจะนำมาใช้ร่วมกัน (VM ทำให้มันแยกกระบวนการออกจากกัน การมีหน่วยความจำเสมือนทำให้ทำความสะอาดได้ไม่ยากหลังจากกระบวนการในระดับระบบปฏิบัติการ คุณเพียงแค่ย้ายหน้าทั้งหมดจากกลุ่มของกระบวนการไปยังกลุ่มอิสระ
ไม่มีปัญหาในประสบการณ์ของฉันฆ่าไป
ตัวอย่างเช่นหากคุณมี RAM 4 GB ซึ่ง 3 GB ถูกใช้โดยเกมและคุณฆ่ากระบวนการเกมคุณสามารถเริ่มเกมใหม่ได้โดยไม่มีปัญหาและจะมี RAM 3 GB อีกครั้งในกระบวนการ
ระบบปฏิบัติการที่ระบุไว้ในแท็กคำถาม (Windows และ OS X) ใช้หน่วยความจำเสมือนโดยที่แต่ละกระบวนการได้รับพื้นที่ที่อยู่ของตัวเองซึ่งจะถูกแมปกับหน่วยความจำกายภาพโดยระบบปฏิบัติการ ตารางการแม็พเหล่านี้ใช้ในการล้างการจัดสรรหน่วยความจำเมื่อกระบวนการถูกยกเลิกดังนั้นหน่วยความจำจึงถูกปล่อยอย่างสมบูรณ์ เพจแบบฟิสิคัลอาจถูกแบ่งใช้ระหว่างกระบวนการจำนวนมากซึ่งในกรณีนี้เพจเหล่านั้นจะถูกทำให้เป็นอิสระเมื่อไม่มีผู้ใช้อีกต่อไป
โดยทั่วไปแล้วทรัพยากรอื่น ๆ เช่นการจัดการไฟล์จะถูกกำหนดให้กับกระบวนการในรูปแบบของความสามารถในการที่กระบวนการได้รับการจัดการกับทรัพยากรและจัดการกับมันผ่านฟังก์ชั่นการเข้าถึงที่กำหนดไว้อย่างดี ระบบปฏิบัติการจะทำการแมปตารางจากค่าหมายเลขอ้างอิงไปยังวัตถุในเคอร์เนลที่จัดเตรียมฟังก์ชันไว้ อีกครั้งตารางนี้สามารถใช้สำหรับการล้างข้อมูลเมื่อกระบวนการถูกยกเลิก
มีรีซอร์สพิเศษที่รอดชีวิตจากกระบวนการที่สร้างขึ้นมาตัวอย่างเช่นเป็นไปได้ที่จะสร้างการจัดสรรหน่วยความจำแบบแบ่งใช้ที่กำหนดชื่อแบบถาวรซึ่งสามารถใช้ในการสื่อสารระหว่างกระบวนการ สิ่งเหล่านี้มักถูกใช้อย่างแม่นยำเพราะระบบปฏิบัติการไม่สามารถระบุได้ว่ายังจำเป็นหรือไม่
ในระบบปฏิบัติการอื่นบางครั้งก็ไม่มีกระบวนการแยกที่ชัดเจน ซึ่งทำให้ภาระการล้างข้อมูลบนแต่ละแอปพลิเคชัน
การบังคับให้ปิดกระบวนการจะเป็นการยุติกระบวนการโดยไม่ให้โอกาสใด ๆ ในการทำความสะอาด หากระบบปฏิบัติการมีรายการทรัพยากรทั้งหมดครบถ้วนสิ่งนี้จะไม่มีผลกระทบใด ๆ
ย้อนกลับไปในวันก่อนที่การจัดการหน่วยความจำจะถูกนำไปใช้อย่างกว้างขวาง ทุกวันนี้หน่วยความจำเพียงอย่างเดียวที่คุณอาจพลาดคือหน่วยความจำที่ใช้โดยไดรเวอร์และโมดูลเคอร์เนลที่ยังคงไม่มีทักษะหรือเป็นซอมบี้ แต่นั่นก็คือถั่วลิสงจริงๆ