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

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

แคชและลำดับชั้นของหน่วยความจำในซีพียูแบบมัลติคอร์
แคชของซีพียูเป็นหน่วยความจำขนาดเล็กและเร็วมาก ซึ่งเก็บสำเนาของข้อมูลส่วนที่ใช้งานบ่อยจาก RAMเมื่อโปรเซสเซอร์ประมวลผลโค้ด แทนที่จะเข้าถึง RAM (ซึ่งค่อนข้างช้า) อย่างต่อเนื่อง มันจะพยายามอ่านและเขียนข้อมูลจากแคช ซึ่งช่วยลดความหน่วงได้อย่างมาก
เคล็ดลับอยู่ที่ว่าแคชไม่ได้เก็บ "เวอร์ชันอย่างเป็นทางการ" ของข้อมูล แต่เก็บเพียงสำเนาชั่วคราวเท่านั้นหากเปรียบเทียบกับเทอร์มินัล หน่วยความจำ RAM ก็เปรียบเสมือนเอกสารบนเซิร์ฟเวอร์ ในขณะที่แคชก็เปรียบเสมือนหน้าจอในเครื่องที่แสดงสำเนาของบางส่วนของไฟล์
ในซีพียูแบบมัลติคอร์ การออกแบบจะซับซ้อนมากขึ้น เนื่องจากแต่ละคอร์มักจะมีแคชระดับ 1 (L1) และแม้แต่แคชระดับ 2 (L2) ส่วนตัวของตัวเองเหนือกว่านั้น จะมีการเพิ่มแคชระดับ 3 ที่ใช้ร่วมกัน (เช่น) ซึ่งอยู่ระหว่างคอร์และตัวควบคุมหน่วยความจำที่ทำหน้าที่เข้าถึง RAM
แคชแบบใช้ร่วมกันนี้ถูกนำมาใช้เนื่องจากการอนุญาตให้ทุกคอร์เข้าถึง RAM โดยตรงและอย่างหนักหน่วงจะทำให้เกิดความขัดแย้งในการเข้าถึง การแย่งชิงทรัพยากรบนบัสหน่วยความจำ และประสิทธิภาพลดลงอย่างมากแคชระดับสุดท้ายทำหน้าที่เป็น "บัฟเฟอร์" ทั่วไปที่ช่วยลดการเข้าถึง RAM และรวมศูนย์การรับส่งข้อมูลส่วนใหญ่ไว้ที่ส่วนกลาง
นอกจากนี้ สถาปัตยกรรมหลายๆ แบบยังจัดระเบียบแคชแบบรวม: บรรทัดที่จัดเก็บในระดับที่อยู่ใกล้กับโปรเซสเซอร์จะปรากฏในระดับที่สูงกว่าของลำดับชั้นด้วยกล่าวคือ บรรทัดที่ปรากฏใน L1 ก็จะปรากฏใน L2 และในทางกลับกันใน L3 ซึ่งมีผลดีอย่างมากต่อความสอดคล้อง: เพียงแค่ทำการอัปเดตแคชระดับต่ำสุดอย่างถูกต้องก็เพียงพอที่จะควบคุมสถานะของระดับอื่นๆโดยไม่ต้องเข้าถึง RAM อย่างต่อเนื่อง
เหตุใดการแคชร่วมระดับสุดท้ายจึงเป็นกุญแจสำคัญต่อความสม่ำเสมอ
หากไม่มีแคชระดับสุดท้ายแบบทั่วโลกนี้ แต่ละคอร์จะต้องตรวจสอบความสอดคล้องกับหน่วยความจำหลักโดยตรงทุกครั้งที่มีการแก้ไขบรรทัดหน่วยความจำในแคชส่วนตัว จะต้องตรวจสอบว่าคอร์อื่น ๆ เก็บสำเนาของบรรทัดเดียวกันนั้นไว้หรือไม่ และหากมี ก็ต้องอัปเดตหรือลบล้างสำเนานั้นในทุกที่
ในระบบที่มีคอร์จำนวนมาก ภาระงานตรวจสอบเหล่านี้จะส่งผลให้เกิดการทำธุรกรรมกับ RAM จำนวนมหาศาลซึ่งจะทำให้ประโยชน์ของการมีแคชที่รวดเร็วลดลงไปมาก การวางแคชที่ใช้ร่วมกันระหว่างคอร์และหน่วยความจำจะช่วยให้ CPU สามารถรวมศูนย์การควบคุมความสอดคล้องไว้ในตำแหน่งตัวกลางเพียงแห่งเดียว
ในการใช้งานหลายๆ รูปแบบ แคชในระดับที่สูงกว่า (ไกลจากโปรเซสเซอร์) จะเก็บสำเนาของบรรทัดที่อยู่ในระดับที่อยู่ใกล้กับแกน ประมวลผลมากกว่า ด้วยโครงสร้างแบบนี้ โปรโตคอลการรักษาความสอดคล้องจึงจำเป็นต้องตรวจสอบให้แน่ใจเพียงว่าระดับสุดท้ายนั้นซิงโครไนซ์กับหน่วยความจำหลัก และระดับส่วนตัวของแต่ละแกนประมวลผลนั้นซิงโครไนซ์กับระดับที่อยู่เหนือกว่าทันที
สามารถมองภาพนี้ได้เหมือนตุ๊กตาซ้อนกันของรัสเซีย: แคชระดับที่สามประกอบด้วยเนื้อหาของระดับที่สองและระดับแรก ระดับที่สองประกอบด้วยเนื้อหาของตัวเองและของระดับแรก และระดับแรกจะรู้จักเฉพาะบรรทัดของตัวเองเท่านั้น ดังนั้น ด้วยการควบคุม "ตุ๊กตาตัวใหญ่" (ระดับสุดท้าย) ระบบจึงสามารถประสานงานส่วนที่เหลือได้อย่างมีประสิทธิภาพมากขึ้น
ผลลัพธ์ที่ได้คือ การรักษาความสม่ำเสมอจะประหยัดมากขึ้นทั้งในแง่ของการออกแบบและการรับส่งข้อมูลในหน่วยความจำแทนที่จะบังคับให้แต่ละคอร์จัดการกับ RAM อย่างต่อเนื่อง โปรโตคอลจะทำงานบนแคชที่ใช้ร่วมกัน และจากนั้นจึงจัดการว่าบรรทัดใดควรได้รับการอัปเดตหรือทำให้ไม่ถูกต้องในแคชส่วนตัว
วิธีการอัปเดต: การยกเลิกและการอัปเดตสำเนา
ปัญหาสำคัญเกิดขึ้นเมื่อหน่วยประมวลผลตั้งแต่สองหน่วยขึ้นไปต้องการเข้าถึงข้อมูลบรรทัดเดียวกันที่ถูกทำสำเนาไว้ในแคชหลายแห่ง เกือบพร้อมกัน ในบริบทนี้ ระบบรักษาความสอดคล้องโดยทั่วไปจะใช้กลยุทธ์พื้นฐานสองประการในการจัดการการเขียนข้อมูล
วิธีแรกนั้นใช้หลักการของการทำให้ข้อมูลไม่ถูกต้อง เมื่อเคอร์เนลต้องการเขียนข้อมูลลงในแคชไลน์เฉพาะ โปรโตคอลจะทำให้สำเนาของบรรทัดเดียวกันนั้นที่อาจมีอยู่ในแคชอื่นๆ ไม่ถูกต้อง เฉพาะเคอร์เนลที่จะทำการเขียนเท่านั้นที่จะเก็บบรรทัดนั้นไว้ในสถานะที่อ่านและเขียนได้ ส่วนเคอร์เนลอื่นๆ หากต้องการใช้ข้อมูลนั้นอีกครั้ง จะต้องโหลดบรรทัดนั้นใหม่จากระดับที่สูงกว่า (หรือจากหน่วยความจำ) ด้วยเวอร์ชันที่อัปเดตแล้ว
กลยุทธ์ที่สองเกี่ยวข้องกับการอัปเดต ในกรณีนี้ เมื่อเคอร์เนลแก้ไขบรรทัดใดบรรทัดหนึ่ง ระบบจะพยายามเผยแพร่เนื้อหาใหม่ไปยังสำเนาที่มีอยู่แล้วในแคชอื่นๆ โดยอัตโนมัติด้วยวิธีนี้ แคชทั้งหมดที่จัดเก็บบรรทัดนั้นจะได้รับเวอร์ชันที่อัปเดตแล้วโดยไม่จำเป็นต้องล้างข้อมูลและโหลดใหม่ในภายหลัง
แต่ละวิธีมีข้อดีและข้อเสีย การทำให้ข้อมูลไม่ถูกต้องมักจะมีประสิทธิภาพมากกว่าเมื่อมีการเขียนข้อมูลบ่อยครั้งเพราะจะช่วยหลีกเลี่ยงการทำให้ระบบหน่วยความจำเต็มไปด้วยการอัปเดตที่คอร์อื่นๆ อาจไม่ต้องการใช้งานในทันที ในทางกลับกัน การอัปเดตอาจมีข้อดีเมื่อหลายคอร์อ่านข้อมูลเดียวกันบ่อยๆ ซึ่งมีการแก้ไขไม่บ่อยนักเพราะจะช่วยลดความหน่วงโดยไม่จำเป็นต้องโหลดบรรทัดใหม่หลังจากทำให้ข้อมูลไม่ถูกต้องแต่ละครั้ง
ไม่ว่าในกรณีใด ทั้งสองวิธีต่างก็ใช้สถานะเพิ่มเติมและบิตควบคุมในแคชไลน์ โดยทั่วไปแล้วแต่ละไลน์จะประกอบด้วยข้อมูลเกี่ยวกับว่าเนื้อหาตรงกับเนื้อหาใน RAM หรือไม่และเป็นแบบใช้ร่วมกัน แก้ไข เฉพาะ หรือสงวนไว้หรือไม่ ขึ้นอยู่กับโปรโตคอลเฉพาะ (MESI, MOESI, MSI เป็นต้น) ซึ่งช่วยให้ฮาร์ดแวร์สามารถตัดสินใจได้อย่างรวดเร็วว่าจะทำอย่างไรเมื่อมีการอ่านหรือเขียนข้อมูลบนไลน์ที่จำลองไว้แล้ว
ตรวจสอบความสอดคล้องระหว่างแคชและหน่วยความจำ
การตรวจสอบความสอดคล้องระหว่างแคชทุกระดับของ CPU หรือ GPU กับหน่วยความจำหลัก โดยตรง นั้นเป็นงานที่ยากมาก ทั้งในแง่ของความซับซ้อนในการออกแบบและต้นทุนด้านประสิทธิภาพ ดังนั้น ระบบสมัยใหม่จึงจัดระเบียบการตรวจสอบนี้ในรูปแบบลำดับชั้น
แคชที่อยู่ใกล้กับโปรเซสเซอร์มากที่สุด (L1, L2) โดยทั่วไปจะไม่เชื่อมต่อโดยตรงกับ RAM แต่จะเชื่อมต่อกับแคชระดับถัดไป ซึ่งหมายความว่าความสอดคล้องจะไม่ถูกตรวจสอบกับหน่วยความจำหลักในแต่ละระดับ แต่จะตรวจสอบกับระดับที่สูงกว่าทันทีวิธีนี้ช่วยลดจำนวนการเข้าถึง RAM และทำให้ตรรกะที่จำเป็นในระดับล่างง่ายขึ้น
โดยสรุปแล้ว การเปรียบเทียบระหว่างเนื้อหาในแคชและเนื้อหาใน RAM จะดำเนินการระหว่างแคชระดับสุดท้ายกับหน่วยความจำหลักหากแคชระดับสุดท้ายนี้รักษาสถานะที่ถูกต้องและสอดคล้องกัน และแต่ละระดับที่ต่ำกว่ารักษาความสอดคล้องกับระดับที่อยู่เหนือกว่า ลำดับชั้นทั้งหมดก็จะยังคงสอดคล้องกันโดยไม่ต้องตรวจสอบแต่ละบรรทัดกับ RAM ซ้ำๆ
เมื่อเคอร์เนลเขียนข้อมูลลงในแคชไลน์และเปลี่ยนแปลงข้อมูลนั้น สถานะของแคชไลน์จะถูกทำเครื่องหมายเพื่อระบุว่าข้อมูลนั้นไม่ตรงกับสำเนาที่เก็บไว้ในหน่วยความจำหลักอีกต่อไป จากนั้น โปรโตคอลจะประสานงานการอัปเดต โดยจะทำเครื่องหมายสำเนาที่เกี่ยวข้องในแคชอื่นๆ ว่าสงวนไว้หรือไม่ถูกต้อง และเมื่อเหมาะสม ก็ จะเขียนเนื้อหาใหม่ลงในแคช ไลน์หน่วยความจำหลักที่เกี่ยวข้อง
โครงสร้างแบบเรียงลำดับนี้ช่วยให้การเปลี่ยนแปลงแพร่กระจายอย่างต่อเนื่องจากเคอร์เนลซึ่งทำหน้าที่อัปเดตข้อมูล ไปยังหน่วยความจำหลัก โดยผ่านแต่ละระดับของแคชอย่างเป็นระบบ ด้วยวิธีนี้ การรักษาความสอดคล้องจึงไม่กลายเป็นปัญหาคอขวดที่ยากเกินกว่าจะแก้ไขได้สำหรับโปรเซสเซอร์
ความสอดคล้องของฮาร์ดแวร์เทียบกับความสอดคล้องของซอฟต์แวร์
ที่ผ่านมาเราได้กล่าวถึงกลไกการรักษาความสอดคล้องซึ่งส่วนใหญ่ถูกนำไปใช้ในฮาร์ดแวร์ เช่น โปรโตคอล บิตสถานะ แคชที่ใช้ร่วมกัน เป็นต้น อย่างไรก็ตาม ยังมีอีกแนวทางหนึ่งที่พยายามถ่ายโอนความซับซ้อนบางส่วนไปยังซอฟต์แวร์โดยเฉพาะอย่างยิ่งไปยังคอมไพเลอร์และระบบปฏิบัติการ
ระบบการรักษาความสอดคล้องของข้อมูลโดยใช้ซอฟต์แวร์พยายามลดความจำเป็นในการใช้ตรรกะเพิ่มเติมบนชิป โดยการวิเคราะห์โค้ดและตัดสินใจในระหว่างการคอมไพล์แนวคิดก็คือ หากคอมไพเลอร์สามารถอนุมานได้ว่าข้อมูลที่ใช้ร่วมกันบางอย่างถูกเข้าถึงเมื่อใดและอย่างไร ในหลายกรณี คอมไพเลอร์ก็สามารถป้องกันไม่ให้ข้อมูลนั้นถูกแคช หรือจัดการการมองเห็นข้อมูลนั้นได้อย่างชัดเจน
แนวทางนี้มีข้อดีที่ชัดเจนคือ ภาระงานบางส่วนจะเปลี่ยนจากการแก้ไขปัญหาขณะรันไทม์ไปเป็นการแก้ไขปัญหาขณะคอมไพล์แทนที่ฮาร์ดแวร์จะตรวจจับและจัดการข้อขัดแย้งทั้งหมดในทันที คอมไพเลอร์จะพยายามคาดการณ์ข้อขัดแย้งเหล่านั้นและสร้างโค้ดที่หลีกเลี่ยงสถานการณ์อันตราย
ข้อเสียคือ การวิเคราะห์โค้ดแบบคงที่นั้นมีข้อจำกัด ดังนั้นคอมไพเลอร์จึงมักจะระมัดระวังเป็นพิเศษซึ่งหมายความว่า เพื่อหลีกเลี่ยงการละเมิดความสอดคล้อง พวกมันมักจะตัดสินใจที่ลดประสิทธิภาพของแคชลง หากพวกมันสงสัยว่าข้อมูลบางอย่างอาจมีปัญหา พวกมันมักจะป้องกันไม่ให้ข้อมูลนั้นถูกแคช หรือบังคับให้เกิดการซิงโครไนซ์บ่อยกว่าที่จำเป็น
ดังนั้น แม้ว่าแผนงานซอฟต์แวร์เหล่านี้จะดูน่าสนใจในทางทฤษฎี โดยเฉพาะอย่างยิ่งสำหรับการลดความซับซ้อนของการออกแบบฮาร์ดแวร์ แต่ในทางปฏิบัติแล้ว แผนงานเหล่านี้ไม่ได้มาแทนที่การสนับสนุนความสอดคล้องที่รวมอยู่ใน CPU เองแต่เป็นการเสริมการทำงานดังกล่าวในบางสถานการณ์เฉพาะเท่านั้น
บทบาทของคอมไพเลอร์ในการรักษาความสอดคล้องของแคช
องค์ประกอบสำคัญของแนวทางการรักษาความสอดคล้องโดยใช้ซอฟต์แวร์คือบทบาทของคอมไพเลอร์ คอมไพเลอร์สามารถวิเคราะห์โค้ดอย่างละเอียดและระบุโครงสร้างข้อมูลที่ใช้ร่วมกันที่อาจไม่ปลอดภัยสำหรับการแคชจากนั้นจึงทำเครื่องหมายองค์ประกอบเหล่านั้นด้วยวิธีพิเศษหรือปรับการสร้างโค้ดให้เหมาะสม
แนวทางที่ง่ายที่สุดและอนุรักษ์นิยมที่สุดคือการป้องกันไม่ให้ตัวแปรข้อมูลที่ใช้ร่วมกันถูกแคชนั่นคือ การเข้าถึงตัวแปรเหล่านี้แต่ละครั้งจะบังคับให้เข้าถึงหน่วยความจำหลักหรือพื้นที่ที่ไม่สามารถแคชได้ วิธีนี้รับประกันความสอดคล้อง แต่จะพลาดโอกาสด้านประสิทธิภาพหลายอย่าง เนื่องจากโครงสร้างที่ใช้ร่วมกันนั้นสามารถใช้งานแบบส่วนตัวได้ในช่วงเวลาหนึ่ง หรือใช้งานแบบอ่านอย่างเดียวในช่วงเวลาอื่นได้
ในความเป็นจริง ปัญหาความสอดคล้องจะเกิดขึ้นเฉพาะในช่วงเวลาที่มีอย่างน้อยหนึ่งกระบวนการที่สามารถเขียนข้อมูลลงในตัวแปรได้ และอีกกระบวนการหนึ่งสามารถอ่านค่าจากตัวแปรได้นอกเหนือจากช่วงเวลาวิกฤตเหล่านี้ ตัวแปรสามารถถูกมองว่าเป็นตัวแปรที่ใช้เฉพาะเธรดเดียว หรือแม้กระทั่งเป็นค่าคงที่ชั่วขณะหนึ่ง ทำให้สามารถแคชข้อมูลได้โดยไม่มีปัญหา
กลยุทธ์การคอมไพล์ที่ทันสมัยที่สุดพยายามระบุช่วงเวลา "ปลอดภัย" ที่ตัวแปรที่ใช้ร่วมกันนั้นถือว่าไม่เกิดข้อขัดแย้งในการทำเช่นนี้ คอมไพเลอร์จะวิเคราะห์เส้นทางการทำงาน การเข้าถึงพร้อมกันที่อาจเกิดขึ้น และรูปแบบการซิงโครไนซ์ (การล็อก ส่วนวิกฤต ฯลฯ) จากผลการวิเคราะห์นี้ คอมไพเลอร์จะแบ่งอายุการใช้งานของตัวแปรออกเป็นหลายช่วง: บางช่วงเหมาะสมสำหรับการแคช ในขณะที่บางช่วงต้องการการจัดการเป็นพิเศษ
ในช่วงเวลาวิกฤต เมื่อตรวจพบการเข้าถึงพร้อมกับการเขียนข้อมูลพร้อมกันคอมไพเลอร์จะแทรกคำสั่งเพิ่มเติมลงในโค้ดที่สร้างขึ้นเพื่อบังคับใช้ความสอดคล้องของแคชคำสั่งเหล่านี้อาจบังคับให้ล้างแคช โหลดหน่วยความจำใหม่ สร้างตัวกั้นหน่วยความจำ หรือเข้าถึงพื้นที่ที่ทำเครื่องหมายว่าไม่สามารถแคชได้ ขึ้นอยู่กับรูปแบบการเขียนโปรแกรมและสถาปัตยกรรมพื้นฐาน
ความสัมพันธ์ระหว่างคอมไพเลอร์ ระบบปฏิบัติการ และฮาร์ดแวร์
วลีที่ว่า "คอมไพเลอร์แทรกคำสั่งลงในโค้ดที่สร้างขึ้นเพื่อบังคับใช้ความสอดคล้องของแคช" อาจทำให้หลายคนเข้าใจผิดว่าระบบปฏิบัติการอ่านคำสั่งเหล่านี้ราวกับเป็นคำแนะนำระดับสูงและจากนั้นจึงตัดสินใจว่าจะดำเนินการโปรแกรมอย่างไร แต่ในความเป็นจริง กลไกนั้นแตกต่างออกไปเล็กน้อย
เมื่อคอมไพเลอร์เพิ่มคำสั่งประเภทนี้ สิ่งที่มันเพิ่มเข้าไปในไบนารีคือการดำเนินการเฉพาะที่ได้รับการสนับสนุนโดยสถาปัตยกรรมหรือสภาพแวดล้อมรันไทม์ตัวอย่างเช่น มันสามารถแทรกคำสั่งล้างแคช ตัวกั้นหน่วยความจำ คำสั่งพิเศษเพื่อทำเครื่องหมายพื้นที่ที่ไม่สามารถแคชได้ หรือการเรียกใช้บริการของระบบปฏิบัติการที่กำหนดค่าคุณลักษณะของหน่วยความจำ
ระบบปฏิบัติการไม่ได้ตีความคำสั่งเหล่านี้ว่าเป็น "คำอธิบาย" หรือ "คำแนะนำ" ระดับสูงที่เขียนโดยคอมไพเลอร์ แต่จะดำเนินการตามรหัสเครื่องเหมือนกับคำสั่งอื่นๆอย่างไรก็ตาม คำสั่งบางส่วนได้รับการออกแบบมาเพื่อโต้ตอบกับระบบหน่วยความจำและการจัดการแคช ซึ่งจะเปลี่ยนแปลงวิธีการที่ CPU เข้าถึงข้อมูลบางอย่าง
กล่าวอีกนัยหนึ่ง คอมไพเลอร์จะทำการวิเคราะห์เบื้องต้นและสร้างโค้ดที่เมื่อประมวลผลแล้วจะทำให้ได้พฤติกรรมแคชที่ต้องการระบบปฏิบัติการจะร่วมมือโดยการกำหนดคุณลักษณะของหน่วยความจำ (พื้นที่ที่สามารถแคชได้หรือไม่สามารถแคชได้ นโยบายการเขียน ฯลฯ) และจัดเตรียมกลไกการซิงโครไนซ์ แต่ระบบปฏิบัติการไม่ได้ "อ่าน" คำสั่งพิเศษในแง่ของการตีความความหมายเหมือนที่คอมไพเลอร์ทำ
นอกจากนี้ ยังอาจเกิดขึ้นได้ว่าฮาร์ดแวร์ เมื่อได้รับคำสั่งบางอย่างจะเปิดใช้งานกลไกความสอดคล้องหรือการซิงโครไนซ์เฉพาะ ตัวอย่างเช่น คำสั่ง fence หรือ barrier รับประกันลำดับการเข้าถึงหน่วยความจำและบังคับใช้เอฟเฟกต์การมองเห็นบางอย่างในลำดับชั้นของแคช ในกรณีนี้ จะมีการทำงานร่วมกันสามฝ่าย ได้แก่ คอมไพเลอร์ตัดสินใจว่าจะวางคำสั่งเหล่านี้ไว้ที่ใด ระบบปฏิบัติการกำหนดค่าสภาพแวดล้อมการทำงาน และฮาร์ดแวร์ดำเนินการพฤติกรรมจริงในระดับแคชและบัสหน่วยความจำ
องค์ประกอบทั้งหมดเหล่านี้รวมกันทำให้มั่นใจได้ว่า แม้จะมีข้อมูลชุดเดียวกันกระจายอยู่หลายชุดในแคชและหน่วยความจำหลักที่แตกต่างกัน โปรแกรมแบบขนานก็ยังคงทำงานด้วยโมเดลหน่วยความจำที่สอดคล้องกัน ความสอดคล้องของแคชไม่ใช่เพียงแค่รายละเอียดภายในของ CPU เท่านั้น แต่ยังเป็นส่วนประกอบสำคัญที่ทำให้ระบบมัลติคอร์ทำงานได้อย่างน่าเชื่อถือและมีประสิทธิภาพ
การทำความเข้าใจว่าลำดับชั้นของแคช โปรโตคอลความสอดคล้องของฮาร์ดแวร์ และเทคนิคการสนับสนุนซอฟต์แวร์ทำงานร่วมกันอย่างไร จะทำให้เห็นได้ชัดเจนยิ่งขึ้นว่าทำไมการออกแบบ CPU สมัยใหม่จึงมีโครงสร้างที่คล้ายคลึงกัน และทำไมความล้มเหลวเล็กน้อยในกลไกใดๆ เหล่านั้นจึงสามารถก่อให้เกิดพฤติกรรมที่วุ่นวายในแอปพลิเคชันแบบขนานที่ต้องอาศัยคอร์ทั้งหมดเห็นข้อมูลเดียวกันในเวลาที่เหมาะสม