เขียนกลับหรือเขียนผ่านแคช?


93

ความเข้าใจของฉันคือความแตกต่างที่สำคัญระหว่างสองวิธีคือในวิธีการ "เขียนผ่าน" ข้อมูลจะถูกเขียนไปยังหน่วยความจำหลักผ่านแคชทันทีในขณะที่ข้อมูล "เขียนกลับ" จะถูกเขียนใน "ครั้งหลัง"

เรายังคงต้องรอความทรงจำใน "ครั้งหลัง" ดังนั้น "การเขียนผ่าน" มีประโยชน์อย่างไร?


@EricWang ฉันคิดว่าคุณหมายถึงwrite backมีประสิทธิภาพที่ดีขึ้น?
wln Nirvana

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

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

ฉันเห็นว่ามีคำตอบที่อธิบายได้ ฉันแนะนำให้คุณดูที่แท็ก Write-Allocate, Write-NoAllocate หลังจากครอบคลุมอัลกอริทึมการเขียนกลับแล้ว
ÇağlayanDÖKME

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

คำตอบ:


111

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

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

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

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


7
สำหรับ I / O ที่แมปหน่วยความจำโดยทั่วไปแอดเดรสเหล่านั้นจะถูกแมปว่าไม่ได้เชื่อมต่อ นอกจากนี้ยังสามารถใช้การเขียนผ่านเพื่อเพิ่มความน่าเชื่อถือ (เช่นหาก L1 มีเพียงการป้องกันความเท่าเทียมกันและ L2 มี ECC) การเขียนผ่านยังเป็นที่นิยมมากขึ้นสำหรับแคชขนาดเล็กที่ใช้การจัดสรรแบบไม่เขียน (เช่นการเขียนพลาดไม่ได้จัดสรรบล็อกไปยังแคชซึ่งอาจช่วยลดความต้องการความจุ L1 และแบนด์วิดท์การอ่าน L2 / L1) เนื่องจากฮาร์ดแวร์ส่วนใหญ่ ข้อกำหนดสำหรับการเขียนผ่านมีอยู่แล้วสำหรับการเขียนดังกล่าว
Paul A. Clayton

1
เป็นไปได้ไหมที่จะตรวจสอบว่าวิธีแคชของฉันในคอร์ของฉันเป็นแบบเขียนกลับหรือเขียนผ่าน
ArtificiallyIntelligence

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

คำสั่ง @Shaowu "lshw" ที่แสดงความสามารถของแคชเช่น "การเขียนกลับภายในแบบอะซิงโครนัส"
Mug896

ฉันยังไม่เข้าใจว่าขั้นตอนจริงที่ใช้ในการเขียนกลับคืออะไร แต่เพิ่งรู้ว่ามันซับซ้อน ... คุณช่วยระบุแหล่งข้อมูล / รายละเอียดเพิ่มเติมได้ไหม
qwerty9898

10

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

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

Dirty bit บ่งบอกว่าเป็นบรรทัดแคชที่เคยเขียนไว้ตั้งแต่ถูกนำเข้าสู่แคชครั้งล่าสุด

ตอนนี้สมมติว่ามีการดำเนินการอื่น: อ่าน E (โดยที่ E ถูกแมปกับบรรทัดแคชแรกด้วย)

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

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

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


7

บทความนี้อาจช่วยคุณเชื่อมโยงที่นี่

การเขียนผ่าน: การเขียนจะดำเนินการพร้อมกันทั้งในแคชและที่เก็บสำรอง

การเขียนกลับ (หรือเขียนไว้ข้างหลัง): การเขียนจะกระทำกับแคชเท่านั้น บล็อกแคชที่แก้ไขจะถูกเขียนกลับไปที่ร้านค้าก่อนที่จะถูกแทนที่

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

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


3

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

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

การเขียนกลับ:ข้อมูลถูกเขียนลงในบล็อกในแคช บล็อกแคชที่แก้ไขจะถูกเขียนลงในหน่วยความจำเมื่อถูกแทนที่เท่านั้น (มีผลคือการเขียนแบบขี้เกียจ ) บิตพิเศษสำหรับแต่ละบล็อกแคชบิตสกปรกจะทำเครื่องหมายว่าบล็อกแคชได้รับการแก้ไขหรือไม่ขณะอยู่ในแคช หากไม่ได้ตั้งค่าบิตสกปรกบล็อกแคชจะ "สะอาด" และการเขียนพลาดไม่จำเป็นต้องเขียนบล็อกลงในหน่วยความจำ

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

นโยบายสำหรับการเขียนพลาดมีรายละเอียดอยู่ในลิงก์แรกของฉัน

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

แหล่งข้อมูลที่ดี:


0

การเขียนกลับเป็นสิ่งที่ซับซ้อนกว่าและต้องใช้ Cache Coherence Protocol (MOESI) ที่ซับซ้อน แต่ก็คุ้มค่าเพราะทำให้ระบบรวดเร็วและมีประสิทธิภาพ

ข้อดีประการเดียวของการเขียนผ่านคือทำให้การใช้งานง่ายมากและไม่จำเป็นต้องมีโปรโตคอลการเชื่อมโยงกันของแคชที่ซับซ้อน


1
WT ยังคงต้องการโปรโตคอลการเชื่อมโยงกัน ร้านค้าจากคอร์เดียวยังคงต้องยกเลิกการทำสำเนาในแคชอื่น ๆ เพื่อไม่ให้อ่านข้อมูลเก่าไปเรื่อย ๆ Atomic RMW ต้องการการสนับสนุนพิเศษบางอย่าง ทั้งหมดนี้ง่ายกว่าด้วย WT ฉันคิดว่า แต่การเชื่อมโยงกันที่ต้องการยังค่อนข้างซับซ้อน
Peter Cordes

หรือบางทีคุณอาจกำลังพูดถึงระบบ single-core ที่มีลำดับชั้นของแคชเป็น L1 / L2 (และอาจมากกว่านั้น) ในกรณีนี้คุณไม่จำเป็นต้องใช้ MESI / MOESI สำหรับแคชภายในที่ดึงข้อมูลผ่านแคชภายนอกเว้นแต่คุณต้องการรองรับ DMA ที่เชื่อมโยงกับแคชซึ่งสามารถเข้าถึงทิศทางแคชด้านนอกสุดได้ แต่คุณยังคงต้องใช้ความสอดคล้องกันสำหรับการเขียน DMA เพื่อทำให้แคชภายในเป็นโมฆะ
Peter Cordes

1
โปรโตคอลแคช Coherency จำเป็นเฉพาะในกรณีที่จำเป็นต้องรองรับแคช / โปรเซสเซอร์หลายตัวหรือมีบางอย่างที่ส่งผลต่อหน่วยความจำเช่น DMA การเขียนผ่านมีข้อดีแม้กระทั่งสำหรับระบบโปรเซสเซอร์เดี่ยวคือความเร็วในการเขียน
qwr

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