Hiển thị các bài đăng có nhãn buffer. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn buffer. Hiển thị tất cả bài đăng

Thứ Sáu, 17 tháng 3, 2017

Buffer and Cache Part III

 Phân biệt Cache Và Buffer?

Cache: 
- Cache là tên gọi của bộ nhớ đệm, dạng bộ nhớ trung gian như RAM - trung gian giữa nơi xử lí (CPU) và nơi chứa dữ liệu (HDD), nơi lưu trữ các dữ liệu nằm chờ các ứng dụng hay phần cứng xử lý. Mục đích của nó là để tăng tốc độ xử lý (có sẵn xài liền không cần tốn thời gian đi lùng sục tìm kéo về).
- Cache là một cơ chế lưu trữ tốc độ cao đặc biệt. Bộ nhớ Cache là bộ nhớ nằm bên trong của CPU, nó có tốc độ truy cập dữ liệu theo kịp tốc độ xủa lý của CPU, điều này khiến cho CPU trong lúc xử lý không phải chờ dữ liệu từ RAM vì dữ liệu từ RAM phải đi qua Bus của hệ thống nên mất nhiều thời gian. Nó có thể là một vùng lưu trữ của bộ nhớ chính hay một thiết bị lưu trữ tốc độ cao độc lập. Có hai dạng lưu trữ Cache được dùng phổ biến trong máy tính cá nhân là memory caching (bộ nhớ cache hay bộ nhớ truy xuất nhanh) và disk caching (bộ nhớ đệm đĩa).
Ví dụ: Hàng đã có trong kho thì không cần phải mất thêm thời gian ra tiệm mua mới mà chỉ cần vào kho lấy ra thôi.

Buffer: 
- Buffer là bộ đệm, bộ nhớ trung gian, một đơn vị của bộ nhớ được giao nhiệm vụ tạm thời lưu giữ các thông tin.
Bộ đệm (Buffer) hay bộ nhớ đệm là vùng nhớ tạm trong khi chờ đến lượt vì CPU và các thiết bị khác không làm việc cùng tốc độ, HDH thì xử lý các tiến trình có chia thời gian. Do đó cần có bộ đệm để chứa tạm thời. Bộ đệm hoạt động theo cơ chế FIFO.
Ví dụ: 
+ Khi ghi dữ liệu lên ổ cứng hoặc đọc dữ liệu từ ổ cứng cũng cần Buffer. 
+ Khi hai máy tính truyền dữ liệu cũng cần Buffer…

---------------------------------------

Buffer và cache

Đây là hai khái niệm không mới nhưng lại rất dễ gây nhầm lẫn.

Khi thực hiện free -m, hẳn bạn đã từng thấy các tham số buffer và cache này.

             total       used       free     shared    buffers     cached
Mem:         31790      31600        190          0        143      23248
-/+ buffers/cache:       8207      23582
Swap:        15967          0      15967

Trên server này, tôi có buffers là 143M còn cached là 23248M (khoảng 23G rất lớn)

Buffer

Là một vùng nhớ physical memory được dùng để làm vùng chứa data tạm thời trước khi chuyển đến một nơi khác. Ví dụ khi bạn cần đọc/ghi data từ/ra một thiết bị ngoại vi như disk, network, màn hình hoặc keyboard... Đây là vùng physical memory được cấp sẵn. Nhờ vậy, hệ thống sẽ không cần tốn công điều tác để cấp phát vùng nhớ mỗi khi sử dụng.

Buffer sẽ giải quyết được vấn đề đồng bộ thời gian giữa hai đầu gửi và nhận. Ví dụ process cần ghi data xuống disk. Process sẽ gọi một system call nhưng do tốc độ xử lý của disk khá chậm so với memory nên hàm system call sẽ phải chờ. Thời gian chờ này rất lãng phí vì khi đó process không thể làm gì được cho đến khi system call return. Buffer sẽ khắc phục sự lãng phí này. Data thay vì đẩy ngay xuống disk thì đẩy trước vào buffer, system call sẽ trả kết quả về ngay lập tức. Data sau đó sẽ dần được đẩy từ buffer xuống disk.

Một lợi thế nữa khi dùng buffer là cho phép tái điều chỉnh kích cỡ các block data. Nếu process ghi block data có kích cỡ nhỏ hơn block size trên disk thì khi qua buffer, data sẽ được gom lại để khớp với block size của disk rồi mới flush xuống disk.

Buffer xuất hiện ở cả hai đầu đọc/ghi và thường được implement ở dạng queue, một đầu đọc, một đầu ghi.

Buffer cũng có thể làm trung gian để truyền data giữa hai process.

Cache

Thường là một lớp lưu trữ memory để giữ lại các data thường được sử dụng nhằm giảm việc truy cập đến các storage có tốc độ chậm hơn. Một data vừa được ghi thì sẽ sớm được đọc. Nguyên tắc này dẫn đến các data vừa ghi sẽ được đưa vào cache ngay để phục vụ cho thao tác đọc sau này.

Mở rộng ra, cache còn có thể là các static file được sử dụng thường xuyên, nằm trên proxy nhằm giảm việc truy cập đến các backend hoặc cũng có thể là một container chứa các object, nằm trên tầng web nhằm giảm truy cập đến db.

Buffer and Cached Part II

Buffer vs Cache


Chào bạn, tôi băn khoăn không biết nên chọn ý tưởng gì cho blog của tôi: chém gió, đời sống, xã hội hay công nghệ. Ý tưởng có một blog để viết thứ hay ho khá thú vị nhưng nay có rồi thì nó cũng khiến bản thân mình thêm suy nghĩ. Cuối cùng tôi chọn chủ đề chính xuyên suốt blog là chia sẻ, cái gì hay mà tôi học được, đọc được, đúc kết được tôi thấy hay thì tôi sẽ chia sẻ lên đây.

Bài đăng hôm nay sẽ là về một vấn đề kỹ thuật sự khác biệt giữa buffer và cache. Nếu các bạn nghĩ hai thuật ngữ này đều là bộ nhớ giúp tăng hiệu suất làm việc cho cả hệ thống thì bạn đúng rồi. Chỉ có điều vai trò của hai bộ nhớ này có khác nhau chút thôi. Buffer là một bộ đệm được kernel dành riêng ra trên bộ nhớ RAM để lưu trữ dữ liệu trước khi di chuyển đến nơi khác. Buffer giống như khu vực bạn ngồi đợi trước khi lên máy bay đấy. Trong hệ thống thì đây là trạm trung gian giữa process đến một process, hay một process đến một block device ( Nhấn mạnh là chỉ có block device nhé. Có hai loại device: character và block, character device thì không sử dụng buffer đâu ). Đặc điểm đáng lưu ý của buffer là nó sẽ chỉ đẩy dữ liệu (flush) đi khi buffer đầy. Lấy đặc điểm này làm cơ sở phân tích thì chúng ta có thể thấy các lợi ích của buffer:

- Hạn chế việc truy cập trưc tiếp vào device. Số lần truy cập sẽ tính bằng số lần đẩy dữ liệu từ buffer đến device, rõ là nó ít hơn so với khi không dùng buffer. Hạn chế số lần truy cập trực tiếp nghĩa là tăng thời gian đọc ghi vì đọc ghi trực tiếp trên device luôn chậm hơn, cỡ cả ngàn lần so với đọc ghi từ RAM. Vây là ta có công thức Thời gian đọc ghi dữ liệu = Thời gian đọc ghi buffer trên RAM + Thời gian đọc ghi device. Hiệu suất tăng cao bởi vì phần thời gian đọc ghi buffer trên RAM rất ngắn còn thời gian đọc ghi lên I/O device tuy lâu nhưng được hạn chế lại số lần

- Ngoài ra, sử dụng buffer còn hạn chế việc dữ liệu đến quá nhanh khiến device không xử lý kịp cũng như khi dữ liệu đến quá chậm. Đến quá nhanh hay quá chậm đều là vấn đề. Đến chậm quá thì không tận dụng khả năng của thiết bị. Thiết bị xử lý được 5MB mà mỗi lần do độ chậm trễ nó chỉ có 1MB để xử lý. Còn đến quá nhanh thì thiết bị bị quá tải. Cả hai trường hợp này đều được giải quyết bằng buffer.

Tóm lại, buffer là phương án dùng khi có sự chênh lệch giữa tốc độ dữ liệu đến và tốc độ xử lý dữ liệu.

Còn cache thì sao. Cache là bộ nhớ dùng để chứa các dữ liệu thường dùng. Ý tưởng ở đây là thay vì truy cập dữ liệu từ nguồn thì bạn chỉ cần truy cập dữ liệu nhân bản của nó nằm ở đâu đó gần bạn hơn hoặc đó là những dữ liệu đã qua xử lý, sẵn sàng được xài ngay lập tức. Đặc trưng của cache là dữ liệu lưu ở dạng key-value giống như hashtable vậy. Vì dữ liệu nguồn có thể thay đổi nên dữ liệu nhân bản của nó là cache không thể lúc nào cũng chính xác vi thế dữ liệu cache cần có thời hạn sử dụng nhất định. Tùy vào hệ thống mà đặt thời hạn này cho hợp lý, không thể đoán mò mà đặt bừa bãi được. Tóm lại cache là phương án làm giảm sự truy cập trực tiếp đến nguồn dữ liệu.

Cache Part I

Trong tin họccache ( /ˈkæʃ/ KASH-'[1]) là bộ nhớ đệm chứa dữ liệu, các dữ liệu được nằm chờ yêu cầu từ ứng dụng hoặc phần cứng. Dữ liệu được chứa trong cache có thể là kết quả của tính toán trước đó, hoặc là sự trùng lặp dữ liệu được lưu trữ ở một nơi khác.

Cách vận hành


Phần cứng cài đặt cache như một nơi chứa dữ liệu tạm thời để có thể sử dụng lại.Vi xử lí (CPUs) và ổ đĩa cứng (HDD) thường xuyên sử dụng Cache,tương tự trình duyệt web và máy chủ (server).
Cache gồm thanh ghi.Mỗi thanh ghi chứa 1 bit để đánh dấu là đang lưu dữ liệu từ bộ nhớ hoặc chưa được sử dung,1 nhãn (tag) để kiểm tra xem nó có phải là dữ liệu ứng với bộ nhớ hay không và 1 vùng để lưu trữ dữ liệu giống với bộ nhớ.
Khi cache client (vi xử lí,trình duyệt web,...) cần truy cập đễn dữ liệu ở bộ nhớ,nó sẽ kiểm tra cache.Nếu 1 thanh ghi có nhãn tương ứng với dữ liệu mong muốn thì cache client sẽ sử dụng dữ liệu trên thanh ghi đó.Tình huống này đựoc gọi là cache-hit.Ngược lại,nếu không tìm được thanh ghi tương ứng,cache miss xảy ra.Lúc này CPU sẽ truy cập vào bộ nhớ,lấy dữ liệu cần truy cập,đồng thời lưu dữ liệu đó vào 1 thanh ghi nào đó.
Trong khi cache miss,CPU sẽ loại bỏ một số thanh ghi để dọn chỗ cho dữ liêu không nằm trong cache.Việc loại bỏ thanh ghi phải tuân thủ các quy định về thay thế,thông dụng nhất là "least recently used" (LRU),tức là loại bỏ những cache ít được sử dụng nhất.

Nguyên tắc ghi của hệ thống(Writing policies)


Khi CPU ghi dữ liêu vào Cache,cần phải có một số quy tắc ghi dữ liệu đó vào bộ nhớ.
Có 2 cách tiếp cận:
Write-through: ghi ngay lập tức dữ liệu lên cả cache và bộ nhớ(DRAM)
-Write-back: ghi cho cache trước,việc ghi lên bộ nhớ bị trì hoãn đến khi có dữ liệu mới cần đặt lên vùng lưu trữ đó.
Một write-back cache được cài đặt khá phức tạp.Nó đánh dấu những thanh ghi có dữ liệu thay đổi,đánh dấu chúng là ghi đè"dirty",khi thanh ghi bị thay thế,dữ liệu trên(được đánh dấu) sẽ được ghi vào bộ nhớ.Do đó,khi read-miss trên write-back cache,mất 2 lần truy cập,một là để ghi dữ liệu bị thay đổi vào bộ nhớ,hai là để lấy dữ liệu cần dùng và ghi lên cache.
Khi write-miss(cache-miss xảy ra) ,có 2 cách xử lý:
-Write allocate: dữ liệu sẽ được ghi lên cache,một thanh ghi sẽ bị thay thế.Cách này tương tự read-miss
-No-write allocate: dữ liệu sẽ được ghi vào bộ nhớ nhưng không ghi trên cache
Cả write-through và write-back đều sử dụng 2 cách trên khi write-miss,nhưng phổ biến chúng được ứng với từng cách:
-Write-back cache sử dụng write allocate giúp ghi đè dữ liệu trên cache hiệu quả hơn
-Write-through cache sử dụng no-write allocate và việc ghi dư liệu khong được lưu trữ trong cache không có hiệu quả.

Ứng dụng


Bộ nhớ đệm CPU

Bộ nhớ đệm được sử dụng bởi đơn vị xử lý trung tâm (CPU) của máy tính để giảm thiểu thời gian trung bình trong việc truy cập dữ liệu trong bộ nhớ chính. Bộ nhớ đệm nhỏ hơn, nhanh hơn trong việc lưu trữ dữ liệu sao chép từ vùng bộ nhớ chính được sử dụng thường xuyên nhất. Hầu hết CPU sở hữu những bộ nhớ đệm độc lập khác biệt nhau, bao gồm lệnh và bộ nhớ đệm dữ liệu, nơi mà bộ nhớ đệm dữ liệu thường được thiết lập như một hệ thống cấp bậc của nhiều hơn các cấp bộ nhớ đệm.

Bộ nhớ đệm của vi xử lý đồ họa

Các phiên bản trước của vi xử lý đồ họa (GPUs) không có các bộ nhớ đệm cứng; tuy nhiên, khi GPUs chuyển sang vi xử lý không mang tính đồ họa, chúng lại sử dụng các bộ nhớ đệm lớn. Chẳng hạn như GT200 không có bộ đệm L2, trong khi bộ đệm của Fermi lại có 768KB, của Kepler là 1536KB và Maxwell có 2048KB.

Bộ đệm chuyển đổi

Đơn vị quản lý dữ liệu (MMU): tìm nạp những lối vào của trang bảng từ bộ nhớ chính sở hữu bộ nhớ đệm đặc biệt, được sử dụng để ghi lại kết quả của địa chỉ ảo đến địa chỉ vật lý. Bộ nhớ đệm đặc biệt này được gọi là Bộ Đệm Chuyển Đổi.


Bộ nhớ đệm Web (Web Cache)


Trình duyệt web và Máy chủ Web sử dụng Bộ nhớ đệm Web để chứa các phản hồi từ hệ thống máy chủ, chẳng hạn như hình ảnh và các trang web.
Bộ nhớ đệm Web giảm thiểu thông tin cần được truyền bằng mạng, bởi vì thông tin được chứa trong bộ nhớ đệm có thể được tái sử dụng. Điều này giúp giảm băng thông và nhận được yêu cầu dữ liệu từ máy chủ nhanh hơn, đồng thời cải thiện tốc độ phản hồi của người dùng trên mạng.
Các trình duyệt web sử dụng bộ nhớ đệm liền, một số nhà cung cấp mạng hay tổ chức lại thích dùng máy chủ đệm để bộ nhớ đệm được chia sẻ cho tất cả người dùng trong hệ thống đó.
Một dạng khác của bộ nhớ đệm là P2P (peer to peer). Nó giúp các tập tin được các ứng dụng P2P tìm kiếm nhiều nhất và còn giúp tăng tốc chuyển dữ liệu P2P. Tương tự, các vùng tương đương sẽ xuất hiện, điều này giúp cộng đồng thực hiện các nhiệm vụ vận chuyển P2P chẳng hạn như Corelli.

Sự khác biệt giữa buffer và bộ nhớ cache


Hai từ ngữ "buffer" và "cache" không bao gồm nhau; thậm chí, có sự khác biệt cơ bản trong ý nghĩa giữa các quá trình của bộ nhớ cache và các quá trình của buffer.
Về cơ bản, bộ nhớ đệm nhận ra một sự gia tăng hiệu suất cho việc lấy đi lấy lại dữ liệu nhiều lần. Trong khi cache có thể nhận ra một sự gia tăng hiệu suất ngay từ ban đầu của một dữ liệu, quá trình tăng hiệu suất xảy ra trong hệ thống bộ nhớ đệm.
Với đọc cache, một mục dữ liệu phải được lấy từ vị trí gốc của nó ít nhất một lần để cho sau này đọc liên tiếp dữ liệu nhiều lần để thấy một sự gia tăng hiệu suất bằng hiệu lực của việc có thể lưu trữ trung gian của bộ nhớ cache nhanh hơn của dữ liệu gốc. Với ghi cache, một sự gia tăng hiệu suất của việc viết một dữ liệu có thể được nhận ra khi viết lần đầu tiên của các dữ liệu bằng hiệu lực của các dữ liệu được lưu trữ ngay trên bộ nhớ cache, trì hoãn việc chuyển giao các dữ liệu về sau hay nói cách khác nó xảy ra như là một tiến trình nền. Trái với đệm nghiêm ngặt, một quá trình trong bộ nhớ đệm phải tuân thủ một (phân phối tiềm năng) bộ nhớ cache giao thức mạch lạc để duy trì sự thống nhất giữa lưu trữ trung gian của bộ nhớ cache và vị trí nơi chứa dữ liệu. Buffering, mặt khác,
+ làm giảm số lượng các quá trình chuyển dữ liệu giữa quá trình giao tiếp, mà tối ưu trên không đề cập đến những truy cập một dữ liệu ít lần.
+ cung cấp quá trình giao tiếp trung gian
+ đảm bảo một kích thước dữ liệu tối thiểu hoặc đại diện theo yêu cầu của ít nhất một trong các quá trình giao tiếp liên quan đến việc truy cập.
Buffer là một vị trí bộ nhớ tạm thời thường được sử dụng vì các instruction CPU không thể trực tiếp truy cập các dữ liệu được lưu trữ trong các thiết bị ngoại vi. Như vậy, bộ nhớ địa chỉ được sử dụng như là một giai đoạn trung gian. Ngoài ra, một buffer như vậy có thể khả thi khi một khối lượng lớn các dữ liệu được lắp ráp hoặc tháo rời (theo yêu cầu của một thiết bị lưu trữ), hoặc khi dữ liệu có thể được gửi theo một thứ tự khác nhau hơn là trong đó nó được tạo ra. Ngoài ra, một bộ đệm toàn bộ dữ liệu thường được chuyển tuần tự (ví dụ vào đĩa cứng), vì vậy chính buffer đôi khi làm tăng hiệu suất truyền tải hoặc làm giảm sự biến đổi hoặc sự rối loạn của độ trễ việc chuyển giao như trái ngược với bộ nhớ đệm mà mục đích là để giảm độ trễ. Những lợi ích này có mặt ngay cả khi dữ liệu buffer được ghi vào buffer một lần và đọc từ bộ đệm một lần.
Một bộ nhớ cache cũng làm tăng hiệu suất truyền tải. Một phần của sự gia tăng tương tự xuất phát từ khả năng rằng nhiều giao dịch chuyển nhỏ sẽ kết hợp thành một khối lớn. Nhưng chính hiệu-được xảy ra bởi vì có một cơ hội tốt mà cùng một dữ liệu sẽ được đọc từ bộ nhớ cache nhiều lần, hoặc số liệu bằng văn bản sẽ sớm được đọc. Mục đích duy nhất của một bộ nhớ cache là để giảm truy cập vào kho chậm hơn nằm bên dưới. Bộ nhớ cache cũng thường là một lớp trừu tượng được thiết kế để có thể nhìn thấy từ quan điểm của các lớp lân cận.

Bộ nhớ đệm đĩa (Disk Cache)

Bộ nhớ đệm đĩa là một bộ phận để cải thiện thời gian đọc từ đĩa cứng hoặc ghi lên đĩa cứng. Hiện nay, bộ nhớ đệm đĩa thường được xem như một phần của đĩa cứng. Bộ nhớ đệm đĩa cũng có thể là một phần riêng biệt của RAM. Nó chứa dữ liệu đã được đọc gần đây và những vùng dữ liệu gần kề có thể được kết nối trong thời gian tới.Việc viết bộ nhớ đệm cũng được hộ trỡ bởi một số bộ nhớ đệm đĩa.

Một số bộ nhớ đệm khác


Những cỗ máy tìm kiếm (như Google, Yahoo,...) thường dùng bộ nhớ đệm để lưu giữ những trang web đã được tìm kiếm. Ví dụ, Google sẽ cung cấp một đường link bên cạnh kết quả tìm kiếm trỏ đến bộ nhớ đệm đối với những trang web đã được tìm kiếm trước đó. Điều này trở nên hữu ích khi những trang web từ một máy chủ nào đó trở nên khó truy cập trong thời gian ngắn hoặc lâu dài.
Một loại bộ nhớ đệm khác sẽ được dùng để lưu giữ những kết quả tính toán mà có thể sẽ được sử dụng trở lại. Ví dụ, cache là một chương trình tạo ra bộ nhớ đệm cho đầu ra của trình biên dịch để tăng tốc độ biên dịch cho những lần biên dịch sau.
Việc tạo bộ nhớ đệm cho cơ sở dữ liệu có thể cải thiện đáng kể khả năng vận hành của những ứng dụng cơ sở dữ liệu, như trong vận hành các đề mục, dữ liệu từ điển, hay những dạng thông dụng khác của dữ liệu.