ล็อคหน่วยความจำคืออะไร?

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

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

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

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

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

เงื่อนไขการแข่งขัน

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

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

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

แข่งกับสถานการณ์ที่แย่ที่สุด

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

เงื่อนไขการแข่งขันก็ไม่จำเป็นต้องเรียบง่ายขนาดนั้น ตัวอย่างเช่น เป็นไปได้ที่เธรดหนึ่งจะอ่านส่วนของหน่วยความจำในเวลาเดียวกับที่เธรดอื่นกำลังเขียนอยู่ ในกรณีนี้ เธรดการอ่านอ��จได้รับข้อมูลผสมแปลกๆ จากทั้งก่อนและหลัง สมมติว่าเช็คนั้นเป็นเช็คจริง/เท็จอย่างง่าย

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

ปิดการแข่งขัน

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

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

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

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

บทสรุป

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

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



Leave a Comment

วิธีการโคลนฮาร์ดไดรฟ์

วิธีการโคลนฮาร์ดไดรฟ์

ในยุคดิจิทัลสมัยใหม่ ที่ข้อมูลเป็นทรัพย์สินที่มีค่า การโคลนฮาร์ดไดรฟ์บน Windows อาจเป็นกระบวนการที่สำคัญสำหรับหลายๆ คน คู่มือที่ครอบคลุมนี้

วิธีแก้ไขไดรเวอร์ WUDFRd ไม่สามารถโหลดบน Windows 10 ได้

วิธีแก้ไขไดรเวอร์ WUDFRd ไม่สามารถโหลดบน Windows 10 ได้

คุณกำลังเผชิญกับข้อความแสดงข้อผิดพลาดขณะบูตเครื่องคอมพิวเตอร์ซึ่งระบุว่าไดรเวอร์ WUDFRd ไม่สามารถโหลดบนคอมพิวเตอร์ของคุณได้ใช่หรือไม่?

วิธีแก้ไขรหัสข้อผิดพลาด NVIDIA GeForce Experience 0x0003

วิธีแก้ไขรหัสข้อผิดพลาด NVIDIA GeForce Experience 0x0003

คุณพบประสบการณ์รหัสข้อผิดพลาด NVIDIA GeForce 0x0003 บนเดสก์ท็อปของคุณหรือไม่? หากใช่ โปรดอ่านบล็อกเพื่อดูวิธีแก้ไขข้อผิดพลาดนี้อย่างรวดเร็วและง่ายดาย

Roomba Stops, Sticks and Turns Around – Fix

Roomba Stops, Sticks and Turns Around – Fix

Fix a problem where your Roomba robot vacuum stops, sticks, and keeps turning around.

วิธีลบ GPU ออกจากพีซีที่ใช้ Windows ในปี 2023

วิธีลบ GPU ออกจากพีซีที่ใช้ Windows ในปี 2023

คุณจำเป็นต้องลบ GPU ออกจากพีซีของคุณหรือไม่? เข้าร่วมกับฉันในขณะที่ฉันอธิบายวิธีลบ GPU ออกจากพีซีของคุณในคำแนะนำทีละขั้นตอนนี้

วิธีการติดตั้ง NVMe SSD ในเดสก์ท็อปและแล็ปท็อป

วิธีการติดตั้ง NVMe SSD ในเดสก์ท็อปและแล็ปท็อป

ซื้อ NVMe M.2 SSD ใหม่ แต่ไม่รู้ว่าจะติดตั้งอย่างไร? อ่านเพื่อเรียนรู้วิธีติดตั้ง NVMe SSD บนแล็ปท็อปหรือเดสก์ท็อป

Logic Bomb คืออะไร?

Logic Bomb คืออะไร?

ลอจิกบอมบ์คือเหตุการณ์ด้านความปลอดภัยที่ผู้โจมตีดำเนินการล่าช้า อ่านต่อเพื่อหาข้อมูลเพิ่มเติม

SoC คืออะไร?

SoC คืออะไร?

หากคุณเคยดูภายในพีซีทาวเวอร์ คุณจะเห็นว่ามีส่วนประกอบต่างๆ มากมาย แล็ปท็อปทั่วไปของคุณมีส่วนประกอบที่เหมือนกันเป็นส่วนใหญ่

การเข้ารหัสแบบอสมมาตรคืออะไร?

การเข้ารหัสแบบอสมมาตรคืออะไร?

อัลกอริธึมการเข้ารหัสแบบอสมมาตรใช้สองคีย์ที่แตกต่างกัน คีย์หนึ่งใช้สำหรับเข้ารหัสและอีกคีย์หนึ่งสำหรับถอดรหัส

Steam Deck: วิธีฟอร์แมตการ์ด SD

Steam Deck: วิธีฟอร์แมตการ์ด SD

Steam Deck มีตัวเลือกพื้นที่เก็บข้อมูลสามแบบ: 64GB eMMC, 256GB NVMe SSD และ 512GB NVMe SSD ขึ้นอยู่กับคลังเกมของคุณและขนาดของเกม