天天看點

pgsql本地緩沖區源碼分析

下面開始對pgsql源碼中緩沖區進行一個簡單的分析,目的指在弄懂緩沖區的實作方式,以及如何在這個方式上面實作其他的LRU替換算法

ps:找到一篇優秀的部落格,專門講pgsql中緩沖區部分的代碼

http://blog.sina.com.cn/s/articlelist_1221155353_0_4.html

1、首先pgsql來看下源碼目錄

pgsql本地緩沖區源碼分析

pgsql中的緩沖區分為兩個部分,一個部分是本地緩沖區,用來緩沖一些臨時結果檔案,例如Query execution plans查詢的臨時檔案。

第二個部分是共享緩沖區,共享緩沖區存放表資料和索引資料。

PostgreSQL中緩沖區管理主要分為共享緩沖區和管理和本地緩沖區管理兩大部分,其中本地緩沖區結構以及管理方法主要定義在檔案pgsql/src/backend/storage/buffer/localbuf.c中,在檔案最開始的注釋裡寫道:本地緩沖區管理器對臨時表進行快速的緩沖區管理,這些臨時表從來不需要被記錄日志或者設檢查點。是以我們可以知道本地緩沖的建立和維護主要是為了對資料庫系統運作過程中産生的臨時關系表進行管理。

2、兩個緩沖區分為兩個部分

首先對本地的緩沖區進行分析,因為本地的緩沖區是緩沖一些查詢的臨時檔案,是以不存在日志寫的問題,那麼實際緩沖區的算法就是最簡單的時鐘置換的方法。這種時鐘置換的方法,是通過計數來判斷資料的冷熱,并沒有維護所謂的LRU連結清單來實作的。

本地的緩沖區主要在localbuf.c中,主要有以下四個函數:

pgsql本地緩沖區源碼分析

首先看下定義的全局變量,也就是維護本地緩沖區的一些常見的資料結構

pgsql本地緩沖區源碼分析

一個是緩沖區的個數,每一個緩沖塊都對應有一個中繼資料描述塊,和一個引用計數,這個引用計數表示目前是否有程序占用這個使用者。

然後看下如何初始化這個緩沖區的:

pgsql本地緩沖區源碼分析

采用的是懶惰的初始化方式,因為大多數查詢(特别是多使用者的查詢)都不會涉及本地緩沖區,是以PostgreSQL在查詢的開始并不真正給它配置設定本地緩沖區,隻有這個查詢确實需要時才會給它配置設定實際空間,是以這個函數所做的工作隻是建立緩沖區頭部。

建立緩沖區的頭部,并且将對應的緩沖描述塊都置為初始化。

然後最重要的就是,當資料進入緩沖區的時候,如何配置設定一個緩存塊呢?調用的就是如下的函數:

pgsql本地緩沖區源碼分析

它是按照以下的步驟進行的:

是否在緩沖區命中,命中則直接傳回

未命中,尋找目前沒有被占用的塊,即對應塊的計數為0

尋找到沒有占用的塊,則判斷這個塊是否是髒頁,如果是髒頁則需要寫回到閃存上

找到了對應的緩沖區位址,則開辟一個資料塊的大小空間資料,寫入到替換移除的資料塊上。

給新填入的資料塊設定一些描述資訊

pgsql本地緩沖區源碼分析
pgsql本地緩沖區源碼分析
pgsql本地緩沖區源碼分析
pgsql本地緩沖區源碼分析

最後還提供了一些寫出本地緩沖區的函數,這個函數的功能是将緩沖區的資料刷到閃存上,但是實際并沒有移除,隻是設定了髒資料

pgsql本地緩沖區源碼分析