การจัดการหน่วยความจำ

จากวิกิพีเดีย สารานุกรมเสรี
ข้ามไปที่การนำทาง ข้ามไปที่การค้นหา

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

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

ใน ระบบปฏิบัติการบาง ระบบ เช่นOS/360 และรุ่นต่อๆ มา[2]หน่วยความจำได้รับการจัดการโดยระบบปฏิบัติการ [หมายเหตุ 1]ในระบบปฏิบัติการอื่น เช่นระบบปฏิบัติการที่คล้ายกับ Unixหน่วยความจำจะได้รับการจัดการที่ระดับแอปพลิเคชัน

การจัดการหน่วยความจำภายในพื้นที่ที่อยู่โดยทั่วไปจะจัดอยู่ในประเภท การจัดการหน่วยความจำ ด้วย ตนเองหรือ การจัดการ หน่วยความจำอัตโนมัติ

การจัดการหน่วยความจำด้วยตนเอง

ตัวอย่างของการกระจายตัวภายนอก

งานในการดำเนินการตามคำขอการจัดสรรประกอบด้วยการค้นหาบล็อกของหน่วยความจำที่ไม่ได้ใช้ซึ่งมีขนาดเพียงพอ คำขอหน่วยความจำได้รับความพึงพอใจโดยการจัดสรรบางส่วนจากพูลขนาดใหญ่[หมายเหตุ 2]ของหน่วยความจำที่เรียกว่าฮีปหรือที่เก็บอิสระ [หมายเหตุ 3]ในช่วงเวลาใดก็ตาม บางส่วนของฮีปถูกใช้งาน ในขณะที่บางส่วน "ว่าง" (ไม่ได้ใช้) ดังนั้นจึงพร้อมสำหรับการจัดสรรในอนาคต

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

ประสิทธิภาพ

อัลกอริธึมการจัดสรรหน่วยความจำแบบไดนามิกที่นำมาใช้อาจส่งผลกระทบต่อประสิทธิภาพอย่างมาก การศึกษาที่ดำเนินการในปี 1994 โดยDigital Equipment Corporationแสดงให้เห็นถึงค่าใช้จ่าย ที่ เกี่ยวข้องกับผู้จัดสรรที่หลากหลาย ความยาวพาธคำสั่งเฉลี่ยต่ำสุด ที่จำเป็นในการจัดสรรสล็อตหน่วยความจำเดียวคือ 52 (ซึ่งวัดด้วยตัวสร้าง โปรไฟล์ระดับคำสั่งในซอฟต์แวร์ต่างๆ) [1]

การใช้งาน

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

การจัดสรรบล็อกขนาดคงที่

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

บัดดี้บล็อค

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

การจัดสรรแผ่นพื้น

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

การจัดสรรกอง

ระบบที่คล้าย UnixจำนวนมากรวมถึงMicrosoft Windowsใช้ฟังก์ชันที่เรียกว่าallocaการจัดสรรหน่วยความจำสแต็กแบบไดนามิกในลักษณะที่คล้ายกับไฟล์malloc. คอมไพเลอร์มักจะแปลเป็นคำสั่งแบบอินไลน์เพื่อจัดการกับตัวชี้สแต็ก [4]แม้ว่าจะไม่จำเป็นต้องเพิ่มหน่วยความจำด้วยตนเองที่จัดสรรด้วยวิธีนี้ เนื่องจากจะว่างโดยอัตโนมัติเมื่อฟังก์ชันที่เรียกallocaกลับมา มีความเสี่ยงที่จะล้น และเนื่องจาก alloca เป็นส่วน ขยาย เฉพาะกิจ ที่ เห็นได้ในหลายระบบแต่ไม่เคยเกิดขึ้นใน POSIX หรือมาตรฐาน C พฤติกรรมของมันในกรณีที่สแต็กโอเวอร์โฟลว์ไม่ได้กำหนดไว้

มี alloca เวอร์ชันที่ปลอดภัยกว่า_mallocaซึ่งรายงานข้อผิดพลาดอยู่ใน Microsoft Windows มันต้องใช้_freea. [5] gnulibจัดเตรียมอินเทอร์เฟซที่เทียบเท่า แม้ว่าแทนที่จะโยนข้อยกเว้น SEH บนโอเวอร์โฟลว์ มันจะมอบหมายให้ malloc เมื่อตรวจพบขนาดที่ใหญ่เกิน [6]คุณลักษณะที่คล้ายกันสามารถจำลองได้โดยใช้การบัญชีด้วยตนเองและการตรวจสอบขนาด เช่น ในการใช้งานalloca_accountใน glibc [7]

การจัดการหน่วยความจำอัตโนมัติ

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

การเก็บขยะ

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

ระบบที่มีหน่วยความจำเสมือน

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

ในระบบหน่วยความจำเสมือน ระบบปฏิบัติการจำกัดวิธีที่กระบวนการสามารถเข้าถึงหน่วยความจำได้ คุณลักษณะนี้เรียกว่าการป้องกันหน่วยความจำสามารถใช้เพื่อไม่อนุญาตให้กระบวนการอ่านหรือเขียนไปยังหน่วยความจำที่ไม่ได้จัดสรรให้ ป้องกันไม่ให้โค้ดที่เป็นอันตรายหรือทำงานผิดพลาดในโปรแกรมหนึ่งรบกวนการทำงานของอีกโปรแกรมหนึ่ง

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

โดยปกติหน่วยความจำจะจำแนกตามอัตราการเข้าถึงเป็นหน่วยเก็บข้อมูลหลักและ หน่วยเก็บ ข้อมูลรอง ระบบการจัดการหน่วยความจำ รวมถึงการดำเนินการอื่นๆ ยังจัดการการย้ายข้อมูลระหว่างหน่วยความจำสองระดับนี้ด้วย

การจัดการหน่วยความจำใน OS/360 และผู้สืบทอด

IBM System/360ไม่สนับสนุนหน่วยความจำเสมือน [หมายเหตุ 4]การแยกหน่วยความจำของงานสามารถทำได้โดยใช้คีย์การป้องกันโดยกำหนดให้ที่เก็บสำหรับแต่ละงานมีคีย์ที่แตกต่างกัน 0 สำหรับผู้บังคับบัญชา หรือ 1–15 การจัดการหน่วยความจำในOS/360เป็นฟังก์ชันผู้ดูแล มีการขอพื้นที่เก็บข้อมูลโดยใช้GETMAINมาโครและปล่อยให้ว่างโดยใช้FREEMAINมาโคร ซึ่งส่งผลให้มีการเรียกผู้บังคับบัญชา ( SVC ) เพื่อดำเนินการ

ใน OS/360 รายละเอียดแตกต่างกันไปขึ้นอยู่กับวิธีการสร้าง ระบบเช่น สำหรับPCP , MFT , MVT

ใน OS/360 MVT การจัดสรรช่วงภายในขอบเขตของงานหรือ System Queue Area (SQA) ที่แชร์จะขึ้นอยู่กับพูลย่อยโดยแบ่งพื้นที่ออกเป็น 2 KB ในขนาด—ขนาดของพื้นที่ที่ป้องกันโดยคีย์การป้องกัน พูลย่อยมีหมายเลข 0–255 [9]ภายในกลุ่มย่อยของภูมิภาคจะได้รับการกำหนดการป้องกันการจัดเก็บของงานหรือคีย์ของหัวหน้างาน นั่นคือ คีย์ 0 พูลย่อย 0–127 ได้รับคีย์ของงาน เริ่มแรกสร้างพูลย่อย 0 เท่านั้น และคำขอหน่วยเก็บข้อมูลผู้ใช้ทั้งหมดได้รับการตอบสนองจากพูลย่อย 0 เว้นแต่จะระบุอย่างอื่นในคำขอหน่วยความจำ พูลย่อย 250–255 ถูกสร้างขึ้นโดยการร้องขอหน่วยความจำโดยหัวหน้างานในนามของงาน ส่วนใหญ่ได้รับมอบหมายคีย์ 0 แม้ว่าจะมีบางส่วนที่ได้รับคีย์ของงานก็ตาม หมายเลขซับพูลมีความเกี่ยวข้องใน MFT แม้ว่ารายละเอียดจะง่ายกว่ามาก [10] MFT ใช้พาร์ติ ชั่นแบบ ตายตัวที่ตัวดำเนินการกำหนดใหม่ได้ แทนขอบเขตไดนามิก และ PCP มีเพียงพาร์ติชั่นเดียว

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

รายละเอียดสำหรับOS/VS1มีความคล้ายคลึง[12] กับ MFT และ MVT; รายละเอียดสำหรับOS/VS2นั้นคล้ายกับของ MVT ยกเว้นว่าขนาดหน้าคือ 4 KiB สำหรับทั้ง OS/VS1 และ OS/VS2 พื้นที่คิวระบบ ที่ใช้ร่วมกัน (SQA) นั้นไม่สามารถเพจได้

ในMVSพื้นที่ที่อยู่รวมถึงพื้นที่แชร์ที่สามารถเพจเพิ่มเติมได้Common Storage Area (CSA) และพื้นที่ส่วนตัวเพิ่มเติม พื้นที่System Work (SWA) นอกจากนี้ คีย์การจัดเก็บ 0-7 ยังสงวนไว้สำหรับใช้โดยรหัสพิเศษ

ดูเพิ่มเติม

หมายเหตุ

  1. ^ อย่างไรก็ตาม สภาวะแวดล้อมรันไทม์สำหรับตัวประมวลผลภาษาอาจแบ่งย่อยหน่วยความจำที่ได้รับมาจากระบบปฏิบัติการ เช่น การนำสแต็กไปใช้
  2. ^ ในบางระบบปฏิบัติการ เช่น OS/360พื้นที่เก็บข้อมูลฟรีอาจแบ่งย่อยได้หลายวิธี เช่น พูลย่อยใน OS/360 ใต้บรรทัด เหนือบรรทัด และ เหนือแถบใน z/OS
  3. ^ เพื่อไม่ให้สับสนกับโครงสร้างข้อมูลฮีป ที่ไม่เกี่ยวข้อง
  4. ^ ยกเว้นในรุ่น 67

อ้างอิง

  1. อรรถa b Detlefs, D.; Dosser, A.; Zorn, B. (มิถุนายน 2537). "ค่าใช้จ่ายในการจัดสรรหน่วยความจำในโปรแกรม C และ C++ ขนาดใหญ่" (PDF ) ซอฟต์แวร์: การฝึกฝนและประสบการณ์ 24 (6): 527–542. CiteSeerX  10.1.1.30.3073 . ดอย : 10.1002/spe.4380240602 . S2CID  14214110 .
  2. ^ "การจัดสรรพื้นที่เก็บข้อมูลหลัก" (PDF ) แนวคิดและสิ่งอำนวยความสะดวกของระบบปฏิบัติการ IBM/360 ( PDF) ไลบรารีอ้างอิงระบบ (ฉบับแรก) ไอบีเอ็ม คอร์ปอเรชั่น พ.ศ. 2508 74 . สืบค้นเมื่อ3 เม.ย. 2019 .
  3. ซิลเบอร์ชาตซ์, อับราฮัม ; กัลวิน, ปีเตอร์ บี. (2004). แนวคิดระบบปฏิบัติการ ไวลีย์. ISBN 0-471-69466-5.
  4. ^ alloca(3)  – คู่มือโปรแกรมเมอร์ลินุกซ์ – ฟังก์ชั่นห้องสมุด
  5. ^ "_malloca" . เอกสารMicrosoft CRT
  6. ^ "gnulib/malloca.h" . GitHub . สืบค้นเมื่อ24 พฤศจิกายน 2019 .
  7. ^ "glibc/include/alloca.h" . กระจกของเบเรนไมเนอร์ 23 พฤศจิกายน 2562.
  8. ^ Tanenbaum, แอนดรูว์ เอส. (1992). ระบบ ปฏิบัติการสมัยใหม่ หน้าผาแองเกิลวูด รัฐนิวเจอร์ซี: Prentice-Hall หน้า 90. ISBN 0-13-588187-0.
  9. ^ OS360Sup , น.  82 -85.
  10. ^ OS360Sup , น.  82 .
  11. ^ IBM Corporation (พฤษภาคม 1973) ลอจิกของโปรแกรม: IBM System/360 Operating System MVT Supervisor (PDF ) หน้า 107–137 . สืบค้นเมื่อ3 เม.ย. 2019 .
  12. ^ OSVS1Dig , pp.  2.37 -2.39, VS1 Storage Subpools.
OS360Sup
OS รีลีส 21 IBM System/360 Operating System Supervisor Services และ Macro instructions (PDF ) ไลบรารีอ้างอิงระบบ (ฉบับที่แปด) ไอบีเอ็ม. กันยายน 2517 GC28-6646-7
OSVS1Dig
OS/VS1 Programmer's Reference Digest Release 6 (PDF ) ระบบ (ฉบับที่หก). ไอบีเอ็ม. พฤศจิกายน 2518 GC24-5091-5

อ่านเพิ่มเติม

ลิงค์ภายนอก