LittleBee
ศิริวัฒน์ เคน สุอนันต์พรพนิต

Virtual Caches


Virtual Caches

  Virtual Cache คือ index และ tag ของ virtual address ของคำสั่งหรือข้อมูลซึ่งถูกทำสำเนาเก็บไว้ภายในหน่วยความจำ cache ( ถูกcached ไว้) สิ่งเหล่านี้อาจซับซ้อนสำหรับระบบปฏิบัติการเมื่อ virtual address เดียวกันสามารถถูกใช้โดย process ที่แตกต่างกัน ข้อมูลที่ถูก cached โดย process หนึ่งสามารถสร้างความผิดพลาดให้กับข้อมูลของอีก process หนึ่งได้ เพื่อแก้ปัญหาดังกล่าวไม่ให้เกิดขึ้น ระบบปฏิบัติการต้อง flush cache ก่อนที่จะเกิดความกำกวม(Ambiguities) ในบทนี้จะอธิบายถึงการทำงานของ virtual cache, ความกำกวมและ aliases ว่าสามารถเกิดขึ้นได้อย่างไร และระบบปฏิบัติการทำอย่างไรเพื่อป้องกันพวกมันจากผลกระทบของโปรแกรมที่ทำงานในระบบที่ใช้ processor เพียงตัวเดียว(Uniprocessor environment)

                เมื่อมีการใช้ virtual cache แล้ว virtual address ของโปรแกรมจะถูกใช้เป็นตัวชี้หรือดัชนี(index) ของ cache และใช้เป็นป้าย(tag) ของข้อมูล ข้อดีที่สำคัญของวิธีนี้คือ cache สามารถเข้าถึงข้อมูลได้โดยปราศจากความจำเป็นที่จะต้องเปลี่ยน virtual address ไปเป็น physical address ในทุก ๆ ครั้งที่มีการอ่านหรือเขียนเกิดขึ้น จากรูปที่ 3-1 จะเห็นว่าการทำงานของโปรแกรมบน CPU จะระบุ virtual address ของข้อมูลที่ต้องการดึงเข้ามาใช้งาน(load) หรือ จัดเก็บ(store) หรือ คำสั่งที่ต้องการ fetch โดย virtual address ดังกล่าวจะถูกส่งไปยัง cache ซึ่งกระบวนการค้นหา(look-up operation)สำหรับการค้นหาถ้าข้อมูลถูก cached อยู่ ถ้าหาใน cache ไม่พบ(เกิด miss)ในกระบวนการอ่าน(read operation) แล้ว physical address ที่ถูกคำนวณโดย Memory Management Unit (MMU) จะถูกส่งไปยังหน่วยความจำหลักซึ่งจะส่งข้อมูลกลับมา(ในการประยุกต์ใช้บางครั้งจะเริ่มแปลง address ไปพร้อมกับการค้นหาใน cache) ข้อมูลจะถูกนำเข้าสู่ cache (ทำให้มันพร้อมสำหรับการอ้างถึงในอนาคต) และส่งกลับไปยัง CPU

  ระบบที่ใช้ virtual cache อาจจะใช้หรือไม่ใช้ MMU ระหว่าง read operation ซึ่งค้นหาข้อมูลพบใน cache(เกิด hit) ตัวอย่างเช่น ในตระกูลของ Intel i860 ใช้ virtual cache สำหรับ on-chip instruction cache  MMU สำหรับ CPU ดังกล่าวจะไม่แปลง virtual address ซึ่งสร้าง hit ใน cache คำสั่งระหว่างการ fetches    คำสั่งนั้นหมายความว่าฮาร์ดแวร์จะไม่ตรวจสอบการอนุญาตหรือสิทธิ์ในการเข้าถึง เช่นเดียวกันสำหรับ virtual cache ที่พบในระบบ Apollo DN4000 และ Sun 3/200 ระบบดังกล่าวจะเป็นไปตามโมเดล ในรูปที่ 3-1 โดยที่ MMU จะแปลง virtual address หลังจากเกิด miss ขึ้นใน cache แล้วเท่านั้น ระบบที่ใช้ virtual cache ในรูปแบบนี้จะมีสมมุติฐานว่าถ้าโปรแกรมสามารถอ่านข้อมูลได้สำเร็จระหว่างที่เกิด miss operation แล้วโปรแกรมดังกล่าวจะมีสิทธ์ที่จะอ่านข้อมูลดังกล่าวได้เมื่อเกิด hit ขึ้นในภายหลังด้วย อย่างที่กล่าวไว้ในตอนต้นว่าระบบปฏิบัติการจะต้องแน่ใจว่าข้อมูลที่โปรแกรมไม่มีสิทธิในการอ่าน

ถูกทำให้ invalidated จาก cache

                การจัดเก็บ(store)นั้นจะทำงานตามขั้นตอนต่อไปนี้ : ถ้า write-through policy ถูกใช้ แล้วข้อมูลที่จะถูกเขียนและ virtual address ของข้อมูลดังกล่าวจะถูกส่งไปยัง cache หลังจากนั้น virtual address จะถูกส่งไปยัง MMU ในทันทีสำหรับการแปลงและสำหรับการตรวจสอบสิทธ์เพื่อให้แน่ใจว่า process ได้รับการอนุญาตที่จะเขียนข้อมูลไปยัง address ดังกล่าว ถ้าอนุญาตให้เขียนได้และเกิด hit ขึ้นใน cache แล้วข้อมูลใหม่จะถูกแทรกลงในบรรทัด และถูกเขียนในหน่วยความจำหลักโดยใช้ address ที่แปลงได้จาก MMU หากค้นหาไม่พบ (miss) และมีการใช้ write-allocate อยู่ อย่างแรกที่ cache จะทำคือ อ่านบรรทัดข้อมูลจากหน่วยความจำโดยใช้ address ที่ผ่านการแปลงแล้ว (แต่ถ้าหากว่าขนาดของบรรทัดข้อมูลใน cache มีขนาดใหญ่กว่าขนาดของข้อมูลที่กำลังถูกเขียนโดย CPU) ข้อมูลใหม่ที่ได้จะถูกแทรกลงในบรรทัดและถูกเขียนไปยัง cache หาก write-allocate ไม่ได้ถูกใช้ แล้ว เนื้อหาที่อยู่ใน cache จะไม่เปลี่ยนระหว่างกระบวนการจัดเก็บซึ่งค้นหาไม่พบ ในกรณีอื่น ๆ ข้อมูลใหม่จากที่เก็บจะถูกเขียนไปยังหน่วยความจำหลักโดยใช้ physical address ถ้าสิทธิ์ในการเขียนไม่ได้รับอนุญาติ แล้วจะมีการส่งสัญญาณไปยัง CPU และทั้ง cache และหน่วยความจำหลักจะไม่ได้รับผลกระทบ

                การรับรองว่าสิทธิ์ในการเข้าถึงข้อมูลจะไม่ถูกฝ่าฝืนนั้นจะซับซ้อนขึ้นเล็กน้อยถ้า write-back caching ถูกนำมาใช้ สมมุติว่า write-allocate ถูกนำมาใช้ (คล้ายกันสำหรับ write-back cache) และ ไม่พบ virtual address ที่จะเขียนใน cache แล้ว MMU จะต้องแปลง address และ fetch บรรทัดที่สมบูรณ์จากหน่วยความจำหลักเช่นเดียวกับก่อนหน้านี้ สิ่งนี้ทำให้เกิดจังหวะสำหรับการตรวจสอบสิทธิ์ในการเข้าถึง ถ้าสิทธิ์ในการเขียนได้รับอนุญาต ข้อมูลใหม่จะถูกแทรกลงในบรรทัดโดยอ่านจากหน่วยความจำหลักและแก้ไข bit สำหรับบรรทัดนั้นให้ set ถ้า write-allocate ไม่ถูกใช้ แล้ว พฤติกรรมจะคล้ายกับ write-through โดยปราศจาก write-allocate เมื่อเกิด miss คือ ข้อมูลจะถูกเขียนในหน่วยความจำหลักเพียงอย่างเดียว และ cache จะไม่ถูกเปลี่ยนแปลง

ถ้าเกิด cache hit ขึ้นระหว่างการจัดเก็บใน write-back virtual cache และบรรทัดดังกล่าวได้ถูกแก้ไข แล้ว (โดยดูได้จาก modified bit ใน tag) สามารถสมมุติไว้ว่า process ยังคงมีสิทธิ์ในการเขียนเช่นเดียวกับก่อนหน้านี้ที่มีสิทธิ์ในการเขียนในการแก้ไขครั้งแรก ในกรณีนี้ไม่จำเป็นต้อง validation ใน cache ที่บรรทัดที่เกิด hit ที่ได้รับการแก้ไขนั้น เช่นเดียวกับก่อนหน้านี้ ระบบปฏิบัติการจะต้อง flush cache ถ้าสิทธิ์ในการเข้าถึงเปลี่ยนไประหว่างการทำงานของ process

ความแตกต่างจะเกิดขึ้นเมื่อมีความพยายามที่จะเขียนบรรทัดที่ไม่ได้แก้ไขที่เกิด hit ใน cache จะไม่สามารถรู้ได้ว่าสิทธิ์ในการเขียนได้รับการอนุญาตหรือไม่ ดังนั้น address จะถูกส่งไปยัง MMU เพื่อทำการ validation นี่เป็นการทำงานของ on-chip virtual write-back data cache ของ Intel i860 XR  MMU จะตรวจสอบสิทธิ์ในการเข้าถึงสำหรับทุกการเข้าถึงไปยัง data cache (ทั้งที่ hit และmiss)  การตรวจสอบนี้เกิดขึ้นพร้อม ๆ กับการค้นหาใน cache เพื่อป้องกันความล่าช้าในการเข้าถึง cache ถ้าสิทธิ์ในการเขียนได้รับการอนุญาตสำหรับการจัดเก็บแล้วข้อมูลใหม่จะถูกแทรกในบรรทัดและ modified bit จะถูก set ไม่จำเป็นต้องเข้าถึงหน่วยความจำหลักเลยในกรณีนี้เมื่อบรรทัดดังกล่าวอยู่ภายใน cache แล้ว

การประยุกต์ใช้ write-back cache ซึ่งแปลง virtual address และตรวจสอบสิทธิ์การเข้าถึงหลังจากเกิด miss เท่านั้น (อย่างเช่น Apollo DN4000 ) มีข้อเสียของ serialized cache lookup/MMU validation operation ในกรณีนี้โดยการเพิ่ม writable bit ในส่วนควบคุมของ tag  โดย bit นี้จะ set เมื่อมีบรรทัดใหม่ถูกดึงเข้ามาระหว่าง cache miss โดย process ที่มีสิทธิ์ในการเขียน bit จะ set ในตำแหน่งที่สมนัยกัน bit นี้เป็นสำเนาของ write-permission bit ในตารางหน้า(page table) และอนุญาตให้มีการตรวจสอบ write validation ได้อย่างสมบูรณ์โดยตัว cache เอง ช่วยลด overhead ของกระบวนการ MMU ตัวอย่างการนำมาประยุกต์ใช้ที่เห็นได้ชัดคือ  ระบบปฏิบัติการ (Operating System)

เมื่อ write-back caching ปล่อยให้ข้อมูลที่ได้รับการแก้ไขแล้วอยู่ใน cache โดยบรรทัดดังกล่าวจะถูกเขียนกลับไปเมื่อมันถูกแทนที่(replaced)ระหว่าง miss processing หรือ การ flush โดยระบบปฏิบัติการ(เพื่อให้ข้อมูลในหน่วยความจำหลักมีความถูกต้องตรงกันกับข้อมูลที่ได้รับการแก้ไข) ถ้า write-back มีความจำเป็นภายใต้สถานการณ์บางอย่าง cache จะส่ง virtual address ของข้อมูลที่ต้องการเขียนกลับไป(ซึ่งอยู่ใน tag) โดยจะส่งไปให้ MMU แล้ว physical address จะถูกคำนวณขึ้นมาหนึ่ง address ต่อไปบรรทัดที่ได้รับการแก้ไขจะถูกเขียนกลับไปยังหน่วยความจำหลัก 

3.2 Problems with Virtual Caches

                virtual cache (ซึ่งช่วยให้สามารถคืนข้อมูลได้อย่างรวดเร็วโดยการลดขั้นตอนการแปลง address ลงไป) เป็น cache ที่มีความยุ่งยากสำหรับระบบปฏิบัติการที่จะจัดการ วิธีการแก้ไขโดยใช้ความจริงที่ว่า virtual address จะถูกใช้เป็น index และ tag ของบรรทัด และ virtual address ไม่ได้ระบุถึงของมูลแบบ unique เมื่อหลาย ๆ process สามารถที่จะใช้ ช่วงของ virtual address ที่เหมือนกันได้ สิ่งนี้ทำให้เกิดความกำกวม (ambiguities) และ alias ขึ้นใน cache จนกว่าระบบปฏิบัติการจะมีขั้นตอนที่จะป้องกันปัญหานี้ หัวข้อ 2 หัวข้อต่อไปนี้จะเป็นการอธิบายถึงปัญหาเหล่านี้

3.2.1 Ambiguities

                ความกำกวมจะเกิดขึ้นเมื่อส่วนของข้อมูลที่แตกต่างกันมี index และtag เหมือนกันภายใน cache นี้หลายความว่า cache จะไม่สามารถที่จะแยกความแตกต่างของส่วนของข้อมูลที่แตกต่างกันนี้ได้ เมื่อ index และ tag เป็นเพียงสิ่งเดียวที่ทำให้ cache สามารถจะแยกแยะแต่ละข้อมูลออกจากกันได้ การอ้างถึงข้อมูลเหล่านั้นจะเรียกว่าเป็นความกำกวม (ambiguities)” สำหรับ virtual cache แล้วความกำกวมจะเกิดขึ้นเมื่อ virtual cache ใช้การจับคู่ physical address ที่แตกต่างกัน ณ เวลาที่แตกต่างกัน ตัวอย่างเช่น (การใช้เนื้อหาของ physical address แสดงในรูปที่ 3-2)

 ถ้า ณ เวลาที่ 1 virtual address 0x1000 ถูกจับคู่กับ physical address 0x5000 แล้วถ้ามีการอ้างถึงตำแหน่งนี้ 5678 จะถูกดึงเข้าสู่ cache ดังรูปที่ 3-3 การอ้างอิงถึงมันจะ hit ใน cache และ หน่วยความจำหลักจะไม่ถูกเข้าถึง(สังเกตว่า entire ของ virtual address จะแสดงใน tag เพื่อความจัดเจน การประยุกต์ใช้คือเพียงแต่เก็บ upper bit ของ address เท่านั้นไม่ได้ถูกใช้โดย hashing algorithm)

 ถ้า ณ เวลาที่ 2 การจับคู่ได้เปลี่ยนไปยัง physical address 0x1000 แล้วการอ้างถึง virtual address 0x1000 จะยังคงคืนค่าข้อมูลของ physical location 0x5000 เมื่อ virtual address จะยังคงทำให้เกิด hit ใน cache (ดังรูปที่ 3-4) cache look-up จะอยู่บนพื้นฐานของ virtual address เพียงอย่างเดียวเท่านั้น และทำให้มีการสร้าง index และ tag ที่เหมือนกันสำหรับ virtual address 0x1000 แม้ว่า physical address จะเปลี่ยนไปแล้วก็ตาม                ผลลัพธ์คือ โปรแกรมจะได้รับข้อมูลที่ไม่ถูกต้อง(ไม่ตรงกันกับเนื้อหาในหน่วยความจำหลัก) จนกระทั่งบรรทัดที่บรรจุข้อมูลที่ไม่ถูกต้องนั้นจะถูกแทนที่ระหว่าง miss processing มันขึ้นอยู่กับ virtual address เพียงอย่างเดียวและไม่สามารถจะบอกได้ว่าการจับคู่กับ physical address ได้เปลี่ยนแปลงไปแล้ว

                เป็นหน้าที่ของระบบปฏิบัติการที่จะทำให้แน่ใจว่าข้อมูลเก่าจะถูกเขียนกลับไปยังหน่วยความจำหลัก และ invalidated ทุก ๆ การเปลี่ยน ใน virtual address space เพื่อไม่ให้เกิดความกำกวม ถ้าความกำกวมสามารถเกิดขึ้นได้แล้วโปรแกรมจะอ่านข้อมูลที่ไม่ถูกต้องจาก cache ทำให้เกิดพฤติกรรมที่ไม่คาดคิดและไม่ได้กำหนดเอาไว้ได้ ถ้าหากความกำกวมเกิดขึ้นกับข้อมูลของระบบปฏิบัติการแล้วจะทำให้ระบบล้มเหลว(crash) หรือทำงานไม่ถูกต้อง

3.2.2 Aliases

alias เกิดขึ้นเมื่อ virtual address มากกว่า 1 อันถูกใช้เพื่ออ้างถึง physical memory ที่เดียวกัน(virtual address ที่ถูกอ้างถึงเรียกว่า aliases) สิ่งนี้สามารถเกิดขึ้นได้ถ้า process มีการแชร์หน่วยความจำหลักโดยการใช้ virtual address 2 อันที่แตกต่างกันใน address space ของโปรแกรม หรือเมื่อ 2 โปรแกรมที่แตกต่างกันใช้หน่วยความจำที่แชร์ไว้ที่เดียวกันโดยใช้ address ที่แตกต่างกันใน address space ของแต่ละโปรแกรม ถ้าแต่ละ address hash สร้างดัชนีของบรรทัดที่แตกต่างกัน และข้อมูลที่เหมือนกันสามารถจะถูกจัดเก็บยังตำแหน่งที่แตกต่างกันใน cache ได้ ผลลัพธ์ที่ไม่สามารถคาดการได้จะเกิดขึ้นถ้าทั้ง 2 ตำแหน่งนั้นไม่ทำการ sync กันเอง

                เมื่อพิจารณา process ซึ่งมี page ที่ physical memory location 0x3000 จับคู่กับ virtual address 0x2000 และ 0x4000 ดังรูปที่3-5 (สมมุติว่า page ขนาด 0x1000 (4k)byte) จากการจับคู่ดังกล่าว โปรแกรมจะสามารถอ่านข้อมูลจาก virtual address 0x2000 หรือ 0x4000 ก็ได้และจะได้รับค่าผลลัพธ์เดียวกันเมื่อทั้ง 2 อ้างถึง physical page เดียวกัน สมมุติว่าระบบในตัวอย่างนี้ใช้ direct mapped แล้ว virtual cache ที่ใช้ bit <15..4> ของ virtual address เป็น index นั้นหมายความว่า address 0x2000 จะ hash ไปยังบรรทัดที่ 0x200 และ address 0x4000 จะ hash ไปยังบรรทัดที่ 0x400 ถ้า word แรกที่ physical address 0x3000 คือ 1234 แล้วถ้า process อ้างไปยัง virtual address 0x2000 และ 0x4000 ค่าที่อยู่ใน physical address 0x3000 จะถูกดึงไปยัง 2 ตำแหน่งที่แตกต่างกันใน cache (ดังรูปที่ 3-6)  เมื่อ address สร้าง index ที่แตกต่างกัน

                อย่างไรก็ตาม process ไม่ได้รับผลที่ผิดพลาดเมื่อข้อมูลที่คืนกลับมาจากการใช้ address ทั้งสอง process ยังคงได้รับข้อมูลที่ถูกต้องจากตำแหน่งดังกล่าว จนกว่าจะมีความพยายามเขียนไปยังหนึ่งในสอง address ดังกล่าว ถ้ามีการเขียน 5678 ไปยัง virtual address 0x2000 แล้วบรรทัดที่ 0x200 จะถูกปรับปรุงแต่ alias ที่ address 0x400 จะไม่ได้รับการปรับปรุง ซึ่งทำให้ cache มีข้อมูลที่ไม่ตรงกันสำหรับสอง alias ดังกล่าว สามารถแสดงให้เห็นในรูปที่ 3-7

                 การอ้างถึง virtual address 0x4000 จะคืนค่าเก่ากลับมา(เนื้อหาเก่าของ physical location 0x3000) จะยังคงเป็นเช่นนี้ไปเรื่อย ๆ จนกว่าบรรทัดดังกล่าวจะถูกแทนที่ระหว่าง miss processing หรือเกิดการ flush ขึ้น ข้อมูลเก่าใน cache จะทำให้เกิดพฤติกรรมที่ประหลาดและคาดไม่ถึงในการทำงานของโปรแกรมได้ ผลลัพธ์ที่รุนแรงจะเกิดขึ้นถ้า process เขียนค่าที่แตกต่างกันไปยัง virtual address 0x4000 ผลลัพธ์จะขึ้นอยู่กับว่า cache ใช้ write-through หรือ write-back policy

Chapter 3 Virtual Caches

                Virtual Cache คือ index และ tag ของ virtual address ของคำสั่งหรือข้อมูลซึ่งถูกทำสำเนาเก็บไว้ภายในหน่วยความจำ cache ( ถูกcached ไว้) สิ่งเหล่านี้อาจซับซ้อนสำหรับระบบปฏิบัติการเมื่อ virtual address เดียวกันสามารถถูกใช้โดย process ที่แตกต่างกัน ข้อมูลที่ถูก cached โดย process หนึ่งสามารถสร้างความผิดพลาดให้กับข้อมูลของอีก process หนึ่งได้ เพื่อแก้ปัญหาดังกล่าวไม่ให้เกิดขึ้น ระบบปฏิบัติการต้อง flush cache ก่อนที่จะเกิดความกำกวม(Ambiguities) ในบทนี้จะอธิบายถึงการทำงานของ virtual cache, ความกำกวมและ aliases ว่าสามารถเกิดขึ้นได้อย่างไร และระบบปฏิบัติการทำอย่างไรเพื่อป้องกันพวกมันจากผลกระทบของโปรแกรมที่ทำงานในระบบที่ใช้ processor เพียงตัวเดียว(Uniprocessor environment)

3.1 Virtual Cache Operation

                เมื่อมีการใช้ virtual cache แล้ว virtual address ของโปรแกรมจะถูกใช้เป็นตัวชี้หรือดัชนี(index) ของ cache และใช้เป็นป้าย(tag) ของข้อมูล ข้อดีที่สำคัญของวิธีนี้คือ cache สามารถเข้าถึงข้อมูลได้โดยปราศจากความจำเป็นที่จะต้องเปลี่ยน virtual address ไปเป็น physical address ในทุก ๆ ครั้งที่มีการอ่านหรือเขียนเกิดขึ้น จากรูปที่ 3-1 จะเห็นว่าการทำงานของโปรแกรมบน CPU จะระบุ virtual address ของข้อมูลที่ต้องการดึงเข้ามาใช้งาน(load) หรือ จัดเก็บ(store) หรือ คำสั่งที่ต้องการ fetch โดย virtual address ดังกล่าวจะถูกส่งไปยัง cache ซึ่งกระบวนการค้นหา(look-up operation)สำหรับการค้นหาถ้าข้อมูลถูก cached อยู่ ถ้าหาใน cache ไม่พบ(เกิด miss)ในกระบวนการอ่าน(read operation) แล้ว physical address ที่ถูกคำนวณโดย Memory Management Unit (MMU) จะถูกส่งไปยังหน่วยความจำหลักซึ่งจะส่งข้อมูลกลับมา(ในการประยุกต์ใช้บางครั้งจะเริ่มแปลง address ไปพร้อมกับการค้นหาใน cache) ข้อมูลจะถูกนำเข้าสู่ cache (ทำให้มันพร้อมสำหรับการอ้างถึงในอนาคต) และส่งกลับไปยัง CPU

                ระบบที่ใช้ virtual cache อาจจะใช้หรือไม่ใช้ MMU ระหว่าง read operation ซึ่งค้นหาข้อมูลพบใน cache(เกิด hit) ตัวอย่างเช่น ในตระกูลของ Intel i860 ใช้ virtual cache สำหรับ on-chip instruction cache  MMU สำหรับ CPU ดังกล่าวจะไม่แปลง virtual address ซึ่งสร้าง hit ใน cache คำสั่งระหว่างการ fetches    คำสั่งนั้นหมายความว่าฮาร์ดแวร์จะไม่ตรวจสอบการอนุญาตหรือสิทธิ์ในการเข้าถึง เช่นเดียวกันสำหรับ virtual cache ที่พบในระบบ Apollo DN4000 และ Sun 3/200 ระบบดังกล่าวจะเป็นไปตามโมเดล ในรูปที่ 3-1 โดยที่ MMU จะแปลง virtual address หลังจากเกิด miss ขึ้นใน cache แล้วเท่านั้น ระบบที่ใช้ virtual cache ในรูปแบบนี้จะมีสมมุติฐานว่าถ้าโปรแกรมสามารถอ่านข้อมูลได้สำเร็จระหว่างที่เกิด miss operation แล้วโปรแกรมดังกล่าวจะมีสิทธ์ที่จะอ่านข้อมูลดังกล่าวได้เมื่อเกิด hit ขึ้นในภายหลังด้วย อย่างที่กล่าวไว้ในตอนต้นว่าระบบปฏิบัติการจะต้องแน่ใจว่าข้อมูลที่โปรแกรมไม่มีสิทธิในการอ่านจะถูกทำให้ invalidated จาก cache

                การจัดเก็บ(store)นั้นจะทำงานตามขั้นตอนต่อไปนี้ : ถ้า write-through policy ถูกใช้ แล้วข้อมูลที่จะถูกเขียนและ virtual address ของข้อมูลดังกล่าวจะถูกส่งไปยัง cache หลังจากนั้น virtual address จะถูกส่งไปยัง MMU ในทันทีสำหรับการแปลงและสำหรับการตรวจสอบสิทธ์เพื่อให้แน่ใจว่า process ได้รับการอนุญาตที่จะเขียนข้อมูลไปยัง address ดังกล่าว ถ้าอนุญาตให้เขียนได้และเกิด hit ขึ้นใน cache แล้วข้อมูลใหม่จะถูกแทรกลงในบรรทัด และถูกเขียนในหน่วยความจำหลักโดยใช้ address ที่แปลงได้จาก MMU หากค้นหาไม่พบ (miss) และมีการใช้ write-allocate อยู่ อย่างแรกที่ cache จะทำคือ อ่านบรรทัดข้อมูลจากหน่วยความจำโดยใช้ address ที่ผ่านการแปลงแล้ว (แต่ถ้าหากว่าขนาดของบรรทัดข้อมูลใน cache มีขนาดใหญ่กว่าขนาดของข้อมูลที่กำลังถูกเขียนโดย CPU) ข้อมูลใหม่ที่ได้จะถูกแทรกลงในบรรทัดและถูกเขียนไปยัง cache หาก write-allocate ไม่ได้ถูกใช้ แล้ว เนื้อหาที่อยู่ใน cache จะไม่เปลี่ยนระหว่างกระบวนการจัดเก็บซึ่งค้นหาไม่พบ ในกรณีอื่น ๆ ข้อมูลใหม่จากที่เก็บจะถูกเขียนไปยังหน่วยความจำหลักโดยใช้ physical address ถ้าสิทธิ์ในการเขียนไม่ได้รับอนุญาติ แล้วจะมีการส่งสัญญาณไปยัง CPU และทั้ง cache และหน่วยความจำหลักจะไม่ได้รับผลกระทบ

                การรับรองว่าสิทธิ์ในการเข้าถึงข้อมูลจะไม่ถูกฝ่าฝืนนั้นจะซับซ้อนขึ้นเล็กน้อยถ้า write-back caching ถูกนำมาใช้ สมมุติว่า write-allocate ถูกนำมาใช้ (คล้ายกันสำหรับ write-back cache) และ ไม่พบ virtual address ที่จะเขียนใน cache แล้ว MMU จะต้องแปลง address และ fetch บรรทัดที่สมบูรณ์จากหน่วยความจำหลักเช่นเดียวกับก่อนหน้านี้ สิ่งนี้ทำให้เกิดจังหวะสำหรับการตรวจสอบสิทธิ์ในการเข้าถึง ถ้าสิทธิ์ในการเขียนได้รับอนุญาต ข้อมูลใหม่จะถูกแทรกลงในบรรทัดโดยอ่านจากหน่วยความจำหลักและแก้ไข bit สำหรับบรรทัดนั้นให้ set ถ้า write-allocate ไม่ถูกใช้ แล้ว พฤติกรรมจะคล้ายกับ write-through โดยปราศจาก write-allocate เมื่อเกิด miss คือ ข้อมูลจะถูกเขียนในหน่วยความจำหลักเพียงอย่างเดียว และ cache จะไม่ถูกเปลี่ยนแปลง

ถ้าเกิด cache hit ขึ้นระหว่างการจัดเก็บใน write-back virtual cache และบรรทัดดังกล่าวได้ถูกแก้ไข แล้ว (โดยดูได้จาก modified bit ใน tag) สามารถสมมุติไว้ว่า process ยังคงมีสิทธิ์ในการเขียนเช่นเดียวกับก่อนหน้านี้ที่มีสิทธิ์ในการเขียนในการแก้ไขครั้งแรก ในกรณีนี้ไม่จำเป็นต้อง validation ใน cache ที่บรรทัดที่เกิด hit ที่ได้รับการแก้ไขนั้น เช่นเดียวกับก่อนหน้านี้ ระบบปฏิบัติการจะต้อง flush cache ถ้าสิทธิ์ในการเข้าถึงเปลี่ยนไประหว่างการทำงานของ process

ความแตกต่างจะเกิดขึ้นเมื่อมีความพยายามที่จะเขียนบรรทัดที่ไม่ได้แก้ไขที่เกิด hit ใน cache จะไม่สามารถรู้ได้ว่าสิทธิ์ในการเขียนได้รับการอนุญาตหรือไม่ ดังนั้น address จะถูกส่งไปยัง MMU เพื่อทำการ validation นี่เป็นการทำงานของ on-chip virtual write-back data cache ของ Intel i860 XR  MMU จะตรวจสอบสิทธิ์ในการเข้าถึงสำหรับทุกการเข้าถึงไปยัง data cache (ทั้งที่ hit และmiss)  การตรวจสอบนี้เกิดขึ้นพร้อม ๆ กับการค้นหาใน cache เพื่อป้องกันความล่าช้าในการเข้าถึง cache ถ้าสิทธิ์ในการเขียนได้รับการอนุญาตสำหรับการจัดเก็บแล้วข้อมูลใหม่จะถูกแทรกในบรรทัดและ modified bit จะถูก set ไม่จำเป็นต้องเข้าถึงหน่วยความจำหลักเลยในกรณีนี้เมื่อบรรทัดดังกล่าวอยู่ภายใน cache แล้ว

การประยุกต์ใช้ write-back cache ซึ่งแปลง virtual address และตรวจสอบสิทธิ์การเข้าถึงหลังจากเกิด miss เท่านั้น (อย่างเช่น Apollo DN4000 ) มีข้อเสียของ serialized cache lookup/MMU validation operation ในกรณีนี้โดยการเพิ่ม writable bit ในส่วนควบคุมของ tag  โดย bit นี้จะ set เมื่อมีบรรทัดใหม่ถูกดึงเข้ามาระหว่าง cache miss โดย process ที่มีสิทธิ์ในการเขียน bit จะ set ในตำแหน่งที่สมนัยกัน bit นี้เป็นสำเนาของ write-permission bit ในตารางหน้า(page table) และอนุญาตให้มีการตรวจสอบ write validation ได้อย่างสมบูรณ์โดยตัว cache เอง ช่วยลด overhead ของกระบวนการ MMU ตัวอย่างการนำมาประยุกต์ใช้ที่เห็นได้ชัดคือ  ระบบปฏิบัติการ (Operating System)

เมื่อ write-back caching ปล่อยให้ข้อมูลที่ได้รับการแก้ไขแล้วอยู่ใน cache โดยบ

คำสำคัญ (Tags): #virtual caches
หมายเลขบันทึก: 246161เขียนเมื่อ 4 มีนาคม 2009 04:51 น. ()แก้ไขเมื่อ 20 มิถุนายน 2012 20:43 น. ()สัญญาอนุญาต: ไม่สงวนสิทธิ์ใดๆจำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (0)

ไม่มีความเห็น

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท