ความแตกต่างระหว่างแคชและบัฟเฟอร์คืออะไร?


12

การบอกว่าแคชเป็นบัฟเฟอร์ชนิดพิเศษที่ถูกต้อง? พวกเขาทั้งสองทำหน้าที่คล้ายกัน แต่มีความแตกต่างพื้นฐานบางอย่างที่ฉันพลาดไปหรือไม่?


คำตอบ:


12

จากบทความของ Wikipedia เกี่ยวกับdata buffer :

บัฟเฟอร์เป็นพื้นที่ของหน่วยความจำกายภาพที่ใช้เก็บข้อมูลชั่วคราวในขณะที่มันถูกย้ายจากที่หนึ่งไปอีกที่หนึ่ง

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

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

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

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


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

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

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


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

@PeanutsMonkey ถูกต้องวิดีโอ Youtube จะถูกดาวน์โหลดโดยตรงไปยังแคชเบราว์เซอร์ของคุณขณะที่บัฟเฟอร์ บัฟเฟอร์ในกรณีนี้เป็นเพียงคำศัพท์ระดับสูงเนื่องจากคุณดูสิ่งที่อยู่ในแคชอยู่เสมอ ในขณะที่วิดีโอถูกบัฟเฟอร์วิดีโอจะถูกย้ายไปที่แคช (พวกเขาแบ่งปันตำแหน่งทางกายภาพเดียวกัน) ฉันอัพเดตคำตอบด้วยตัวอย่างของบัฟเฟอร์ในบริบทของเครื่องเล่นเสียง
พัฒนา

2
tl; dr เวอร์ชั่น: หากคุณต้องการดึงข้อมูลออกมาให้เร็วที่สุดมันเป็นบัฟเฟอร์ หากคุณต้องการเก็บข้อมูลไว้นานที่สุดก็เป็นแคช
David Schwartz

10

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

อย่างไรก็ตามมีการเหลื่อมกันอย่างมากทั้งในการติดตั้งและใช้งาน


3

ความแตกต่างที่สำคัญอย่างหนึ่งระหว่างแคชและบัฟเฟอร์คือ:

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

ในทางกลับกันแคชเป็นหน่วยความจำกายภาพแยกต่างหากในลำดับชั้นหน่วยความจำของคอมพิวเตอร์

บางครั้งก็เรียกบัฟเฟอร์ด้วย - แคชบัฟเฟอร์ ชื่อนี้เน้นความจริงที่ว่าการใช้บัฟเฟอร์คล้ายกับแคชคือการเก็บข้อมูล ในขณะที่ความแตกต่างอยู่ในบริบทของการใช้งาน

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

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


-1 คุณเขียน "แคชเป็นหน่วยความจำกายภาพแยก" <--- ไม่ไม่จำเป็น IE เก็บแคชบน HDD และไม่ต้องสงสัยโหลดลงใน RAM stackoverflow.com/questions/854412/ … ฉันไม่คิดว่ารหัส C สามารถระบุให้โหลดลงในหน่วยความจำกายภาพที่รู้จักกันในชื่อแคช สิ่งที่ได้รับในแคชนั้นเป็นสิ่งที่อยู่ในระดับต่ำกว่าอาจจะมีเพียงระบบปฏิบัติการที่สามารถระบุได้ แต่ก็ยังเรียกว่าแคชแม้ว่าจะอยู่ใน RAM และเว็บเซิร์ฟเวอร์ปลาหมึกสามารถตั้งค่าแคชได้โดยไม่มีเหตุผลที่จะคิดว่านั่นคือทั้งหมดที่อยู่ในหน่วยความจำแคชทางกายภาพหรือจำเป็นต้องมี
barlop

แคชเป็นฟังก์ชั่นมันไม่จำเป็นต้องอยู่ในหน่วยความจำพิเศษ
barlop

1

สิ่งที่พบได้ทั่วไป: ทั้งคู่เป็นส่วนประกอบหน่วยเก็บข้อมูลกลาง (ซอฟต์แวร์หรือฮาร์ดแวร์) ระหว่างการคำนวณและที่เก็บข้อมูล "หลัก"

ให้ฉันแตกต่างดังต่อไปนี้:

กันชน:

  • จัดการการเข้าถึงข้อมูลตามลำดับ (เช่นการอ่าน / การเขียนข้อมูลจากไฟล์หรือซ็อกเก็ต)
  • เปิดใช้งานอินเทอร์เฟซระหว่างการคำนวณและที่เก็บข้อมูลหลักปรับรูปแบบการถ่ายโอนข้อมูลที่แตกต่างกันของผู้ผลิตข้อมูลและผู้ใช้ข้อมูล เช่นการคำนวณเขียน chuncks ของข้อมูลขนาดเล็ก แต่ดิสก์ไดรฟ์สามารถยอมรับข้อมูลที่มีขนาดเฉพาะ ดังนั้นบัฟเฟอร์จะสะสมชิ้นส่วนเล็ก ๆ เป็นอินพุตและจัดกลุ่มใหม่เป็นชิ้นส่วนที่ใหญ่กว่าของเอาต์พุต
  • ดังนั้นมันจึงเหมือนกับรูปแบบการออกแบบอะแดปเตอร์ มันรวมสององค์ประกอบการโต้ตอบที่ไม่สามารถทำงานร่วมกันได้โดยตรง
  • ตัวอย่าง: บัฟเฟอร์ดิสก์, BufferedReader ในภาษาจาวา, ระบายข้อมูลในคอมพิวเตอร์กราฟิก

แคช:

  • จัดการการเข้าถึงข้อมูลแบบสุ่ม (เช่นแคชแคชของหน่วยความจำที่ไม่จำเป็นต้องเรียงตามลำดับ)
  • เพิ่มประสิทธิภาพการเข้าถึงที่เก็บข้อมูลหลักทำให้เร็วขึ้น เช่นแคช CPU หลีกเลี่ยงการเข้าถึงหน่วยความจำทำให้คำสั่ง CPU เร็วขึ้น
  • มันเหมือนรูปแบบการออกแบบมัณฑนากร มันเข้าร่วม (มักจะโปร่งใส) สององค์ประกอบที่สามารถโต้ตอบได้ในหลักการทำงานร่วมกันโดยตรง แต่มันทำให้การโต้ตอบเร็วขึ้น
  • ตัวอย่าง: แคช CPU, แคชหน้าเว็บพร็อกซี, แคชเบราว์เซอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.