Cache ของ CPU ถูกล้างเมื่อใดกลับไปยังหน่วยความจำหลัก
หากคุณเพิ่งเริ่มเรียนรู้วิธีการทำงานของซีพียูมัลติคอร์แคชการเชื่อมโยงกันของแคชและการทำงานของหน่วยความจำอาจดูสับสนเล็กน้อยในตอนแรก เมื่อคำนึงถึงเรื่องนี้แล้วคำถาม & คำตอบ SuperUser ของวันนี้มีคำตอบสำหรับคำถามของผู้อ่านที่อยากรู้อยากเห็น.
เซสชั่นคำถามและคำตอบในวันนี้มาถึงเราด้วยความอนุเคราะห์จาก SuperUser - แผนกย่อยของ Exchange Exchange ซึ่งเป็นกลุ่มที่ขับเคลื่อนด้วยชุมชนของเว็บไซต์ถาม - ตอบ.
คำถาม
ผู้อ่าน SuperUser CarmeloS ต้องการทราบเมื่อแคชของ CPU ถูกล้างกลับไปยังหน่วยความจำหลัก:
หากฉันมี CPU ที่มีสองคอร์และแต่ละคอร์มีแคช L1 ของตัวเองเป็นไปได้หรือไม่ที่ Core1 และ Core2 ทั้งคู่แคชหน่วยความจำส่วนเดียวกันในเวลาเดียวกันได้หรือไม่ ถ้าเป็นไปได้ค่าของหน่วยความจำหลักจะเป็นอย่างไรถ้าทั้ง Core1 และ Core2 ได้แก้ไขค่าในแคช?
เมื่อใดที่แคชของ CPU ถูกล้างกลับไปยังหน่วยความจำหลัก?
คำตอบ
ผู้สนับสนุน SuperUser David Schwartz, sleske และ Kimberly W มีคำตอบสำหรับเรา มาก่อน David Schwartz:
ถ้าฉันมีซีพียูที่มีสองคอร์และแต่ละคอร์มีแคช L1 ของตัวเองเป็นไปได้หรือไม่ที่ Core1 และ Core2 ทั้งคู่แคชในส่วนเดียวกันของหน่วยความจำในเวลาเดียวกัน?
ใช่ประสิทธิภาพจะแย่มากถ้าไม่ใช่อย่างนั้น พิจารณาสองเธรดที่ใช้รหัสเดียวกัน คุณต้องการรหัสนั้นในแคช L1 ทั้งสอง.
ถ้าเป็นไปได้ค่าของหน่วยความจำหลักจะเป็นอย่างไรถ้าทั้ง Core1 และ Core2 ได้แก้ไขค่าในแคช?
ค่าเก่าจะอยู่ในหน่วยความจำหลักซึ่งจะไม่สำคัญเนื่องจากคอร์จะไม่อ่าน ก่อนที่จะนำค่าที่แก้ไขจากแคชออกจะต้องถูกเขียนลงในหน่วยความจำ โดยทั่วไปแล้วตัวแปร MESI บางส่วนจะถูกใช้ ในการใช้งานแบบดั้งเดิมของ MESI หากค่าถูกแก้ไขในแคชหนึ่งค่าจะไม่สามารถแสดงได้ในแคชอื่นใดในระดับเดียวกัน.
ตามมาด้วยคำตอบจาก sleske:
ใช่การมีแคชสองแคชในส่วนของหน่วยความจำเดียวกันสามารถเกิดขึ้นได้และเป็นปัญหาที่เกิดขึ้นจริงในทางปฏิบัติ มีวิธีแก้ไขปัญหาต่าง ๆ เช่น:
- แคชทั้งสองสามารถสื่อสารกันได้เพื่อให้แน่ใจว่าพวกเขาจะไม่เห็นด้วย
- คุณสามารถมีหัวหน้างานบางประเภทที่คอยตรวจสอบแคชทั้งหมดและอัพเดทตามนั้น
- โปรเซสเซอร์แต่ละตัวตรวจสอบพื้นที่หน่วยความจำที่แคชไว้และเมื่อตรวจพบการเขียนก็จะส่งแคช (ตอนนี้ไม่ถูกต้อง) ออกไป
ปัญหานี้เรียกว่าการเชื่อมโยงกันแคชและบทความ Wikipedia ในหัวข้อมีภาพรวมที่ดีของปัญหาและแนวทางแก้ไขที่เป็นไปได้.
และคำตอบสุดท้ายของเราจาก Kimberly W:
หากต้องการตอบคำถามในชื่อโพสต์ของคุณขึ้นอยู่กับว่าโปรโตคอลแคชคืออะไร หากเป็นการเขียนกลับแคชจะถูกล้างกลับไปยังหน่วยความจำหลักเท่านั้นเมื่อตัวควบคุมแคชไม่มีทางเลือกนอกจากใส่บล็อกแคชใหม่ในพื้นที่ว่างที่ถูกครอบครองแล้ว บล็อกที่ครอบครองพื้นที่ก่อนหน้านี้จะถูกลบออกและค่าของมันจะถูกเขียนกลับไปยังหน่วยความจำหลัก.
โปรโตคอลอื่นคือการเขียนผ่าน ในกรณีนั้นเมื่อใดก็ตามที่แคชบล็อกถูกเขียนในระดับ n, บล็อกที่สอดคล้องกันในระดับ 1 + n มีการอัปเดต มันคล้ายกับแนวคิดในการกรอกแบบฟอร์มด้วยกระดาษคาร์บอนด้านล่าง สิ่งที่คุณเขียนด้านบนจะถูกคัดลอกลงในแผ่นงานด้านล่าง สิ่งนี้ช้าลงเพราะเห็นได้ชัดว่าเกี่ยวข้องกับการเขียนมากขึ้น แต่ค่าระหว่างแคชมีความสอดคล้องกันมากขึ้น ในรูปแบบการเขียนกลับเฉพาะแคชระดับสูงสุดเท่านั้นที่จะมีค่าที่ทันสมัยที่สุดสำหรับบล็อกหน่วยความจำที่เฉพาะเจาะจง.
มีสิ่งที่จะเพิ่มคำอธิบายหรือไม่ ปิดเสียงในความคิดเห็น ต้องการอ่านคำตอบเพิ่มเติมจากผู้ใช้ Stack Exchange คนอื่นหรือไม่ ลองอ่านหัวข้อสนทนาเต็มได้ที่นี่.
เครดิตรูปภาพ: Lemsipmatt (Flickr)