กลับไปหน้าบทความ

อ่าน 3 นาที

ไม่มีชื่อบทความ

ใน วิทยาการคอมพิวเตอร์ หน่วย ความจำร่วม (Shared Memory) คือ หน่วยความจำ ที่ โปรแกรมหลายโปรแกรม...

หน่วยความจำที่ใช้ร่วมกัน

ภาพประกอบระบบหน่วยความจำร่วมที่มีโปรเซสเซอร์สามตัว

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

การใช้หน่วยความจำเพื่อการสื่อสารภายในโปรแกรมเดียว เช่น ระหว่างเธรดหลายๆเธรดเรียกว่า หน่วยความจำร่วม (shared memory)

ในด้านฮาร์ดแวร์

HSAกำหนดกรณีพิเศษของการแบ่งปันหน่วยความจำ โดยที่MMUของ CPU และIOMMUของ GPU มีพื้นที่แอดเดรสเสมือนที่สามารถแบ่งหน้าได้เหมือนกัน

ในฮาร์ดแวร์คอมพิวเตอร์หน่วยความจำร่วม (shared memory ) หมายถึง บล็อก (โดยทั่วไปจะมีขนาดใหญ่) ของหน่วยความจำเข้าถึงแบบสุ่ม (RAM) ที่สามารถเข้าถึงได้โดยหน่วยประมวลผลกลาง (CPU) หลายตัวใน ระบบคอมพิวเตอร์แบบ มัลติโปรเซสเซอร์

ระบบหน่วยความจำร่วมอาจใช้: [ 1 ]

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

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

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

ในกรณีของสถาปัตยกรรมระบบแบบผสมผสาน (สถาปัตยกรรมโปรเซสเซอร์ที่รวมโปรเซสเซอร์ประเภทต่างๆ เช่นCPUและGPU เข้าด้วยกัน โดยใช้หน่วยความจำร่วมกัน) หน่วยจัดการหน่วยความจำ (MMU) ของ CPU และหน่วยจัดการหน่วยความจำอินพุต-เอาต์พุต (IOMMU) ของ GPU จะต้องมีลักษณะบางอย่างร่วมกัน เช่น พื้นที่แอดเดรสร่วมกัน

ทางเลือกอื่นนอกเหนือจากหน่วยความจำร่วม (shared memory) ได้แก่หน่วยความจำแบบกระจาย (distributed memory)และหน่วยความจำแบบกระจายร่วม (distributed shared memory ) ซึ่งแต่ละแบบก็มีปัญหาคล้ายคลึงกัน

ในซอฟต์แวร์

ในซอฟต์แวร์คอมพิวเตอร์หน่วยความจำร่วม (shared memory)คืออย่างใดอย่างหนึ่ง

  • วิธีการสื่อสารระหว่างกระบวนการ (IPC) กล่าวคือ วิธีการแลกเปลี่ยนข้อมูลระหว่างโปรแกรมที่ทำงานพร้อมกันกระบวนการ หนึ่ง จะสร้างพื้นที่ในRAMซึ่งกระบวนการอื่นสามารถเข้าถึงได้
  • วิธีการประหยัดพื้นที่หน่วยความจำโดยการกำหนดทิศทางการเข้าถึงข้อมูลที่โดยปกติจะเป็นสำเนาของข้อมูลชิ้นหนึ่ง ไปยังอินสแตนซ์เดียวแทน โดยใช้ การแมปหน่วย ความจำเสมือนหรือการสนับสนุนอย่างชัดเจนจากโปรแกรมที่เกี่ยวข้อง วิธีนี้มักใช้กับไลบรารีที่ใช้ร่วมกันและสำหรับ การเรียกใช้งานแบบ XIP ( Execute in Place )

เนื่องจากทั้งสองกระบวนการสามารถเข้าถึงพื้นที่หน่วยความจำที่ใช้ร่วมกันได้เหมือนกับหน่วยความจำใช้งานทั่วไป วิธีนี้จึงเป็นวิธีที่รวดเร็วมากในการสื่อสาร (เมื่อเทียบกับกลไก IPC อื่นๆ เช่นnamed pipes , Unix domain socketsหรือCORBA ) ในทางกลับกัน วิธีนี้มีความสามารถในการขยายขนาดได้น้อยกว่า ตัวอย่างเช่น กระบวนการที่สื่อสารกันจะต้องทำงานอยู่บนเครื่องเดียวกัน (ในบรรดาวิธี IPC อื่นๆ มีเพียง Internet domain sockets เท่านั้นที่สามารถใช้ เครือข่ายคอมพิวเตอร์ได้ ไม่ใช่ Unix domain sockets ) และต้องระมัดระวังเพื่อหลีกเลี่ยงปัญหาหากกระบวนการที่ใช้หน่วยความจำร่วมกันทำงานอยู่บน CPU ที่แยกจากกัน และสถาปัตยกรรมพื้นฐานไม่ได้ มีความสอดคล้องกัน ของแคช

การสื่อสารระหว่างกระบวนการ (IPC) โดยใช้หน่วยความจำร่วมกันนั้น ใช้เพื่อถ่ายโอนภาพระหว่างแอปพลิเคชันและเซิร์ฟเวอร์ Xบนระบบ Unix หรือภายในอ็อบเจ็กต์ IStream ที่ส่งคืนโดย CoMarshalInterThreadInterfaceInStream ในไลบรารี COM ภายใต้Windowsเป็นต้น

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

เมื่อเปรียบเทียบกับระบบปฏิบัติการที่มีพื้นที่แอดเดรสหลายแห่ง การแบ่งปันหน่วยความจำ โดยเฉพาะการแบ่งปันขั้นตอนหรือโครงสร้างที่ใช้ตัวชี้ จะง่ายกว่าในระบบปฏิบัติการที่มีพื้นที่แอดเดรสเดียว[ 2 ]

รองรับระบบที่คล้าย Unix

POSIXมีAPI มาตรฐาน สำหรับการใช้หน่วยความจำร่วมกันPOSIX Shared Memoryซึ่งใช้ฟังก์ชันshm_openจาก sys/mman.h [ 3 ]การสื่อสารระหว่างกระบวนการของ POSIX (ส่วนหนึ่งของส่วนขยาย POSIX:XSI) ประกอบด้วยฟังก์ชันหน่วยความจำร่วมกันshmat, shmctl, shmdtและ[ 4 ] [ 5 ]shmget ระบบ Unix System V ก็มี API สำหรับหน่วยความจำร่วมกันเช่นกัน ซึ่งใช้ shmget จาก sys/shm.h ระบบ BSD มี "หน่วยความจำที่แมปแบบไม่ระบุชื่อ" ซึ่งสามารถใช้งาน ได้โดยหลายกระบวนการ

หน่วยความจำร่วมที่สร้างขึ้นโดยนั้นshm_openมีความคงทน มันจะอยู่ในระบบจนกว่าจะถูกลบออกโดยกระบวนการอย่างชัดเจน ซึ่งมีข้อเสียคือ หากกระบวนการล้มเหลวและไม่สามารถล้างหน่วยความจำร่วมได้ หน่วยความจำนั้นจะยังคงอยู่จนกว่าระบบจะปิดตัวลง ข้อจำกัดนี้ไม่มีอยู่ในการใช้งานเฉพาะของ Android ที่เรียกashmemว่า[ 6 ]

นอกจากนี้ POSIX ยังมีmmapAPI สำหรับการแมปไฟล์เข้าสู่หน่วยความจำ การแมปนั้นสามารถใช้ร่วมกันได้ ทำให้สามารถใช้เนื้อหาของไฟล์เป็นหน่วยความจำที่ใช้ร่วมกันได้

ระบบปฏิบัติการ Linux ที่ใช้เคอร์เนลเวอร์ชัน 2.6 ขึ้นไปมี /dev/shm เป็นหน่วยความจำร่วมในรูปแบบของดิสก์ RAMโดยเฉพาะอย่างยิ่งเป็นไดเร็กทอรีที่ทุกคนสามารถเขียนได้ (ไดเร็กทอรีที่ผู้ใช้ทุกคนในระบบสามารถสร้างไฟล์ได้) ซึ่งจัดเก็บไว้ในหน่วยความจำ ทั้ง ระบบปฏิบัติการ RedHatและDebian ต่าง ก็มีให้ใช้งานโดยค่าเริ่มต้น การสนับสนุนดิสก์ RAM ประเภทนี้เป็นทางเลือกเสริมในไฟล์การกำหนดค่าเคอร์เนล[ 7 ]

รองรับบน Windows

บน Windows สามารถใช้CreateFileMappingฟังก์ชันMapViewOfFileเพื่อแมปพื้นที่ของไฟล์ลงในหน่วยความจำในกระบวนการหลายกระบวนการได้[ 8 ]

รองรับหลายแพลตฟอร์ม

ไลบรารี C++ บางส่วนให้การเข้าถึงฟังก์ชันหน่วยความจำที่ใช้ร่วมกันแบบพกพาและเชิงวัตถุ ตัวอย่างเช่นBoostมีไลบรารี Boost.Interprocess C++ [ 9 ]และQtมีคลาส QSharedMemory [ 10 ]

การสนับสนุนภาษาโปรแกรม

สำหรับภาษาโปรแกรมที่มีการผูก POSIX (เช่น C/C++) สามารถสร้างและเข้าถึงพื้นที่หน่วยความจำที่ใช้ร่วมกันได้โดยการเรียกใช้ฟังก์ชันที่ระบบปฏิบัติการจัดเตรียมไว้ให้ ภาษาโปรแกรมอื่นๆ อาจมีวิธีการใช้สิ่งอำนวยความสะดวกของระบบปฏิบัติการเหล่านี้ในลักษณะเดียวกัน ตัวอย่างเช่นPHPมีAPIสำหรับสร้างหน่วยความจำที่ใช้ร่วมกัน ซึ่งคล้ายกับฟังก์ชันPOSIX [ 11 ]

ดูเพิ่มเติม

  • IPC: ความทรงจำร่วมกันโดย เดฟ มาร์แชลล์
  • บทนำเกี่ยวกับหน่วยความจำร่วมบทที่ 12 จากหนังสือของริชาร์ด สตีเวนส์ เรื่อง "การเขียนโปรแกรมเครือข่าย UNIX เล่ม 2 ฉบับที่สอง: การสื่อสารระหว่างกระบวนการ"
  • SharedHashFileคือตารางแฮชแบบโอเพนซอร์สที่ใช้หน่วยความจำร่วมกัน

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ไม่มีชื่อบทความ

ใน วิทยาการคอมพิวเตอร์ หน่วย ความจำร่วม (Shared Memory) คือ หน่วยความจำ ที่ โปรแกรมหลายโปรแกรม...

ในด้านฮาร์ดแวร์

ในฮาร์ดแวร์คอมพิวเตอร์ หน่วยความจำร่วม (shared memory ) หมายถึง บล็อก (โดยทั่วไปจะมีขนาดใหญ่) ของ หน่วยความจำเข้าถึงแบบสุ่ม (RAM) ที่สามารถเข้าถึงได้โดย หน่วยประมวลผลกลาง (CPU) หลายตัวใน ระบบคอมพิวเตอร์แบบ มัลติ โปรเซสเซอร์

ในซอฟต์แวร์

ในซอฟต์แวร์คอมพิวเตอร์ หน่วยความจำร่วม (shared memory) คืออย่างใดอย่างหนึ่ง

รองรับระบบที่คล้าย Unix

POSIX มี API มาตรฐาน สำหรับการใช้หน่วยความจำร่วมกัน POSIX Shared Memory ซึ่งใช้ฟังก์ชัน shm_open จาก sys/mman.