รั้วความทรงจำคืออะไร?


คำตอบ:


115

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

รั้ว / อุปสรรคหน่วยความจำคือชั้นของคำสั่งที่หมายความว่าหน่วยความจำอ่าน / เขียนเกิดขึ้นตามลำดับที่คุณคาดหวัง ตัวอย่างเช่น "เต็มรั้ว" หมายถึงอ่าน / เขียนทั้งหมดก่อนที่รั้วจะมาถึงก่อนรั้วหลังรั้ว

หมายเหตุรั้วหน่วยความจำเป็นแนวคิดของฮาร์ดแวร์ ในภาษาระดับสูงเราใช้ในการจัดการกับ mutexes และ semaphores ซึ่งอาจนำไปใช้งานได้ดีโดยใช้ memory fences ในระดับต่ำและไม่จำเป็นต้องใช้อุปสรรคด้านความจำอย่างชัดเจน การใช้อุปสรรคด้านหน่วยความจำจำเป็นต้องมีการศึกษาสถาปัตยกรรมฮาร์ดแวร์อย่างรอบคอบและมักพบในไดรเวอร์อุปกรณ์มากกว่ารหัสแอปพลิเคชัน

การจัดลำดับใหม่ของ CPU นั้นแตกต่างจากการเพิ่มประสิทธิภาพคอมไพเลอร์ - แม้ว่าสิ่งประดิษฐ์จะคล้ายกันก็ตาม คุณจำเป็นต้องใช้มาตรการแยกต่างหากเพื่อหยุดคอมไพลเลอร์ที่จัดลำดับคำสั่งของคุณใหม่หากสิ่งนั้นอาจทำให้เกิดพฤติกรรมที่ไม่พึงปรารถนา (เช่นการใช้คีย์เวิร์ดระเหยใน C)


26
ฉันไม่คิดว่าการระเหยจะเพียงพอที่จะหยุดการเรียงลำดับคอมไพเลอร์ใหม่ AFAIK เพียงทำให้แน่ใจว่าคอมไพเลอร์ไม่สามารถแคชค่าตัวแปรได้ เคอร์เนล Linux ใช้ส่วนขยาย gcc ( asm __volatile __ ("":: "memory")) เพื่อสร้างอุปสรรคการเพิ่มประสิทธิภาพคอมไพเลอร์แบบเต็ม
CesarB

5
true, volatile ไม่ทราบเธรด แต่คุณสามารถใช้เพื่อหยุดคอมไพลเลอร์ที่ใช้การเพิ่มประสิทธิภาพบางอย่างซึ่งไม่เกี่ยวข้องกับรั้ว)
Gwaredd

3
(.NET CLR) การอ่านแบบระเหยได้รับรั้วการเขียนคือรั้วปล่อย การดำเนินการที่เชื่อมต่อกันเต็มรูปแบบเช่นเดียวกับเมธอด MemoryBarrier
Luke Puplett

3
คุณสามารถอ่านสิ่งที่น่าสนใจเกี่ยวกับคำสำคัญที่ระเหยได้ใน. net ได้ที่นี่albahari.com/threading/part4.aspx#_NonBlockingSynchไซต์นี้มีข้อมูลที่เป็นประโยชน์มากมายเกี่ยวกับเธรดใน c #
Bas Smit

developerWorks มี [บทความ] [1] ที่ดีเกี่ยวกับรูปแบบการจัดเก็บหน่วยความจำ PowerPC [1]: ibm.com/developerworks/systems/articles/powerpc.html
Iouri Goussev

17

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

สิ่งที่สำคัญที่สุดคือการจัดลำดับการเข้าถึงหน่วยความจำใหม่

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

การรักษาที่ดีมากของเรื่องที่สามารถพบได้ในเอกสารที่มาลินุกซ์เคอร์เนลที่เอกสาร / หน่วยความจำ barriers.txt

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


มีผลต่อขั้นตอนการจัดลำดับใหม่อย่างไร เมื่อคุณพูดว่าAlpha is known for being the weakestทำไมweakest? ไม่ดีกว่าเหรอที่จะเรียงลำดับใหม่มากขึ้นดังนั้นมันจะทำให้การดำเนินการเร็วขึ้นมาก? (ฉันไม่ใช่ผู้ใช้อัลฟ่า แต่ถามเกี่ยวกับผลของvery reorderingvs restricted reordering) ดังนั้นข้อเสียของการเรียงลำดับล็อตใหม่คืออะไร (ยกเว้นความเสี่ยงของพฤติกรรมที่ไม่ได้กำหนด แต่ฉันเดาว่าซีพียูที่ทันสมัยส่วนใหญ่ควรแก้ไขการเรียงลำดับใหม่ที่ดีและได้ใช้การจัดลำดับใหม่ที่กำหนดไว้เท่านั้นมิฉะนั้นจะไม่สมเหตุสมผลกับการตัดสินใจที่ทำ)
เลี้ยงสัตว์

8

จากประสบการณ์ของฉันมันอ้างถึงอุปสรรคหน่วยความจำซึ่งเป็นคำสั่ง (โดยชัดแจ้งหรือโดยนัย) เพื่อซิงโครไนซ์การเข้าถึงหน่วยความจำระหว่างเธรดหลายชุด

ปัญหาเกิดขึ้นจากการรวมกันของคอมไพเลอร์ agressive สมัยใหม่ (พวกเขามีอิสระอย่างน่าอัศจรรย์ในการเรียงลำดับคำสั่งใหม่ แต่โดยปกติแล้วจะไม่รู้อะไรเลยในเธรดของคุณ) และซีพียูมัลติคอร์ที่ทันสมัย

คำแนะนำที่ดีสำหรับปัญหาคือ "การประกาศ" การตรวจสอบการล็อกสองครั้งเสีย "" สำหรับหลาย ๆ คนมันคือการปลุกว่ามีมังกร

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


2

วิกิพีเดียรู้หมด ...

Memory barrier หรือที่เรียกว่า membar หรือ memory fence เป็นคลาสของคำสั่งที่ทำให้หน่วยประมวลผลกลาง (CPU) บังคับใช้ข้อ จำกัด ในการสั่งซื้อสำหรับการดำเนินการของหน่วยความจำที่ออกก่อนและหลังคำสั่งกั้น

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.