SlideShare a Scribd company logo
PostgreSQL Internals
- Buffer Management -
    Satoshi Nagayasu
    snaga@snaga.org
bufmgr関連データ
• 1つ以上のバックエンドによって参照されて
  いるバッファ(プール)のハッシュテーブル
     – SharedBufHash
• どこからも参照されていない(されなくなっ
  た)バッファのリスト(環状リスト)
     – SharedFreeList
• いずれも共有メモリ内の領域

2003/06/20              Satoshi Nagayasu
BufferDescriptor
• BufferDescriptorメンバ(抜粋)
     –   Buffer freeNext, freePrev
     –   SHMEM_OFFSET data
     –   int buf_id
     –   BufFlags flags
     –   unsigned refcount



2003/06/20               Satoshi Nagayasu
初期化直後のBufferDescriptorリスト(NBuffers=8)
                                                                 freeNext                       freeNext

                                   freeNext

                   freeNext       freeNext       freeNext       freeNext       freeNext
                                                                                               freeNext


                                                                                                                 SharedFreeList
0              1              2              3              4              5              6              7      8


    freePrev       freePrev       freePrev       freePrev       freePrev       freePrev       freePrev


                                     freePrev
               freePrev
                                                                                                             InitBufferPool()
                                                                                                             InitFreeList()

       NBuffers(GUC)+1のBufferDescriptorを確保する。
       最後の1個を空きバッファリストの先頭要素とする。
       freeNextを辿ると、「8→1→2→3→4→5→6→7→0→8」
    2003/06/20                                         Satoshi Nagayasu
ディスクからバッファへの読込み
• バッファに読み込むディスクブロックの指定
     – BufferTag
             • fileNode(テーブルOID)とブロック番号
• バッファプールの中に存在するか?
     – BufTableLookup()
             • BufferPoolのHashテーブルを検索
• 存在しなければディスクから読み込み
     – GetFreeBuffer() & smgrread()
2003/06/20              Satoshi Nagayasu
ディスクからバッファへの読込み
• ReadBuffer() / ReadBufferInternal()
     – BufferAlloc()
             • BufTableLookup() でHashテーブルを検索
             • 見つからなければ GetFreeBuffer() でバッファ取得
             • Hashテーブルに追加
     – Hash 内にあれば BufferDescriptorGetBuffer()
     – 無ければ smgrread()


2003/06/20              Satoshi Nagayasu
GetFreeBuffer()

                                                                 freeNext                       freeNext

                                   freeNext

                   freeNext       freeNext       freeNext       freeNext       freeNext
                                                                                               freeNext


                                                                                                             SharedFreeList
0              1              2              3              4              5              6              7   8


    freePrev       freePrev       freePrev       freePrev       freePrev       freePrev       freePrev


                                     freePrev
               freePrev




                buf = &(BufferDescriptors[SharedFreeList->freeNext]);
    2003/06/20                                         Satoshi Nagayasu
GetFreeBuffer()

                                                                 freeNext                       freeNext

                                   freeNext

                   freeNext       freeNext       freeNext       freeNext       freeNext
                                                                                               freeNext


                                                                                                             SharedFreeList
0              1              2              3              4              5              6              7   8


    freePrev       freePrev       freePrev       freePrev       freePrev       freePrev       freePrev


                                     freePrev
               freePrev




                BufferDescriptors[buf->freeNext].freePrev = buf->freePrev;
    2003/06/20                                         Satoshi Nagayasu
GetFreeBuffer()

                                                                 freeNext                       freeNext

                                   freeNext

                   freeNext       freeNext       freeNext       freeNext       freeNext
                                                                                               freeNext


                                                                                                             SharedFreeList
0              1              2              3              4              5              6              7   8


    freePrev       freePrev       freePrev       freePrev       freePrev       freePrev       freePrev


                                     freePrev
               freePrev




                BufferDescriptors[buf->freePrev].freeNext = buf->freeNext;
    2003/06/20                                         Satoshi Nagayasu
GetFreeBuffer()

                                                             freeNext                       freeNext

                               freeNext

                              freeNext       freeNext       freeNext       freeNext
                                                                                           freeNext


                                                                                                         SharedFreeList
0              1          2              3              4              5              6              7   8


    freePrev                  freePrev       freePrev       freePrev       freePrev       freePrev


                                 freePrev
               freePrev




                buf->freeNext = buf->freePrev = INVALID_DESCRIPTOR;
    2003/06/20                                     Satoshi Nagayasu
SharedBufHash
• ハッシュテーブルの操作(buf_table.c)
     – BufTableInsert()
     – BufTableDelete()
     – BufTableLookup()




2003/06/20           Satoshi Nagayasu
PinBuffer()/UnpinBuffer()
• PrivateRefCount (ローカル変数)
     – ひとつのバックエンド内で、そのバッファが何
       回参照(Pin)されているか
• BufferDesc->refcount (共有メモリ内変数)
     – いくつのバックエンドにそのバッファが参照さ
       れているか(複数バックエンド間での話)。



2003/06/20            Satoshi Nagayasu
SharedFreeList
• バッファを取得する場合には、freelistの先
  頭(SharedFreeListの次)から取る
     – GetFreeBuffer()
• バッファを開放する場合には、freelistの最
  後尾(SharedFreeListの前)に追加
     – BufferDesc->refcountが0になると、freeListに
       追加される。
     – UnpinBuffer(), AddBufferToFreeList()
2003/06/20               Satoshi Nagayasu
SharedFreeList
• 有効なブロックが読み込まれているバッ
  ファは、ハッシュテーブルに登録される
• どのバックエンドにも参照されていないバッ
  ファは、freelistの最後尾に登録される
• freelistから取り出したものが、以前使われ
  ていたdirtyなバッファの場合は、前のデー
  タをまずディスクにwriteしてから使われる

2003/06/20       Satoshi Nagayasu
AddBufferToFreeList ()

                                                             freeNext                       freeNext

                               freeNext

                              freeNext       freeNext       freeNext       freeNext
                                                                                           freeNext


                                                                                                         SharedFreeList
0              1          2              3              4              5              6              7   8


    freePrev                  freePrev       freePrev       freePrev       freePrev       freePrev


                                 freePrev
               freePrev



                   bf->freePrev = SharedFreeList->FreePrev;
    2003/06/20                                     Satoshi Nagayasu
AddBufferToFreeList ()

                                                             freeNext                       freeNext

                               freeNext

                              freeNext       freeNext       freeNext       freeNext
                                                                                           freeNext


                                                                                                         SharedFreeList
0              1          2              3              4              5              6              7   8


    freePrev                  freePrev       freePrev       freePrev       freePrev       freePrev


                                 freePrev
               freePrev



                   bf->freeNext = Free_List_Descriptor;
    2003/06/20                                     Satoshi Nagayasu
AddBufferToFreeList ()

                                                             freeNext                       freeNext

                               freeNext

                              freeNext       freeNext       freeNext       freeNext
                                                                                           freeNext


                                                                                                         SharedFreeList
0              1          2              3              4              5              6              7   8


    freePrev                  freePrev       freePrev       freePrev       freePrev       freePrev


                                 freePrev
               freePrev



                   BufferDescriptors[bf->freeNext].freePrev = bf->buf_id;
    2003/06/20                                     Satoshi Nagayasu
AddBufferToFreeList ()

                                                             freeNext                       freeNext

                               freeNext

                              freeNext       freeNext       freeNext       freeNext
                                                                                           freeNext


                                                                                                         SharedFreeList
0              1          2              3              4              5              6              7   8


    freePrev                  freePrev       freePrev       freePrev       freePrev       freePrev


                                 freePrev
               freePrev



                   BufferDescriptors[bf->freePrev].freeNext = bf->buf_id;
    2003/06/20                                     Satoshi Nagayasu
bufmgrイメージ
• ブロックが読み込まれてるバッファは
  SharedBufHashに
• 参照されなくなったバッファはSharedFreeList
  に
• 両方に存在することも     shmem

                                                                SharedBufHash
                postgres
    postgres                                   SharedFreeList

                                                          Buffer
               postgres                                    Buffer
                                                            Buffer
2003/06/20                                                    Buffer
                           postgres Nagayasu
                                Satoshi
bufmgr - InitFreeList()
• 最初はSharedFreeListにある




              SharedFreeList                      SharedBufHash



                                   Buffer

2003/06/20                     Satoshi Nagayasu
bufmgr - GetFreeBuffer()
• ディスクからブロックが読み込まれると、
  SharedFreeListの先頭から取り出され、
  SharedBufHashに登録される
  (GetFreeBuffer()&BufTableInsert())。

               SharedFreeList                      SharedBufHash



                                    Buffer

2003/06/20                      Satoshi Nagayasu
bufmgr - UnpinBuffer()
• どこからも参照されなくなる(refcount==0)と、
  SharedFreeListの最後尾に登録される。この
  段階では、SharedBufHashの中でも見つかる
  し、SharedFreeListにも含まれる。

              SharedFreeList               SharedBufHash



                                  Buffer
                                     参照されてない。でもdirty(かもしれない)。
2003/06/20                     Satoshi Nagayasu
bufmgr - PinBuffer()
• 再度参照されると、SharedFreeListから切り
  離される。



             SharedFreeList                      SharedBufHash



                                  Buffer

2003/06/20                    Satoshi Nagayasu
bufmgr - BufTableDelete()
• そのまま参照されずに、再度別ブロックの
  バッファとして取得されると、以前のdirtyな
  データをディスクに反映させて、
  SharedBufHashから一旦削除される(新しい
  ブロックとして再登録)。
             SharedFreeList                      SharedBufHash



                                  Buffer

2003/06/20                    Satoshi Nagayasu

More Related Content

More from Satoshi Nagayasu

映画「マネーボール」に学ぶデータ分析と組織行動論
映画「マネーボール」に学ぶデータ分析と組織行動論映画「マネーボール」に学ぶデータ分析と組織行動論
映画「マネーボール」に学ぶデータ分析と組織行動論
Satoshi Nagayasu
 
統計勉強会 分割表とカイ二乗検定
統計勉強会 分割表とカイ二乗検定統計勉強会 分割表とカイ二乗検定
統計勉強会 分割表とカイ二乗検定
Satoshi Nagayasu
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
Satoshi Nagayasu
 
遊休リソースを用いた 相同性検索処理の並列化とその評価
遊休リソースを用いた相同性検索処理の並列化とその評価遊休リソースを用いた相同性検索処理の並列化とその評価
遊休リソースを用いた 相同性検索処理の並列化とその評価
Satoshi Nagayasu
 

More from Satoshi Nagayasu (20)

データウェアハウスモデリング入門(ダイジェスト版)(事前公開版)
データウェアハウスモデリング入門(ダイジェスト版)(事前公開版) データウェアハウスモデリング入門(ダイジェスト版)(事前公開版)
データウェアハウスモデリング入門(ダイジェスト版)(事前公開版)
 
Oracle対応アプリケーションのDockerize事始め
Oracle対応アプリケーションのDockerize事始めOracle対応アプリケーションのDockerize事始め
Oracle対応アプリケーションのDockerize事始め
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
 
In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性
 
10 Reasons to Start Your Analytics Project with PostgreSQL
10 Reasons to Start Your Analytics Project with PostgreSQL10 Reasons to Start Your Analytics Project with PostgreSQL
10 Reasons to Start Your Analytics Project with PostgreSQL
 
pgDay Asia 2016 & 2017
pgDay Asia 2016 & 2017pgDay Asia 2016 & 2017
pgDay Asia 2016 & 2017
 
A Story Behind the Conference, or How pgDay Asia was born
A Story Behind the Conference, or How pgDay Asia was bornA Story Behind the Conference, or How pgDay Asia was born
A Story Behind the Conference, or How pgDay Asia was born
 
データベースエンジニアがデータヘルスの2年間で見たもの(仮)
データベースエンジニアがデータヘルスの2年間で見たもの(仮)データベースエンジニアがデータヘルスの2年間で見たもの(仮)
データベースエンジニアがデータヘルスの2年間で見たもの(仮)
 
PostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 Taipei
PostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 TaipeiPostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 Taipei
PostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 Taipei
 
[WIP] pgDay Asia 2016
[WIP] pgDay Asia 2016[WIP] pgDay Asia 2016
[WIP] pgDay Asia 2016
 
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 Singapore
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 SingaporePostgreSQL 9.4 and Beyond @ FOSSASIA 2015 Singapore
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 Singapore
 
PostgreSQL 9.4
PostgreSQL 9.4PostgreSQL 9.4
PostgreSQL 9.4
 
PostgreSQL Community in Japan
PostgreSQL Community in JapanPostgreSQL Community in Japan
PostgreSQL Community in Japan
 
海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!
海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!
海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!
 
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
 
映画「マネーボール」に学ぶデータ分析と組織行動論
映画「マネーボール」に学ぶデータ分析と組織行動論映画「マネーボール」に学ぶデータ分析と組織行動論
映画「マネーボール」に学ぶデータ分析と組織行動論
 
統計勉強会 分割表とカイ二乗検定
統計勉強会 分割表とカイ二乗検定統計勉強会 分割表とカイ二乗検定
統計勉強会 分割表とカイ二乗検定
 
PgAccelerator
PgAcceleratorPgAccelerator
PgAccelerator
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 
遊休リソースを用いた 相同性検索処理の並列化とその評価
遊休リソースを用いた相同性検索処理の並列化とその評価遊休リソースを用いた相同性検索処理の並列化とその評価
遊休リソースを用いた 相同性検索処理の並列化とその評価
 

Recently uploaded

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 

Recently uploaded (10)

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 

PostgreSQL Internals - Buffer Management

  • 1. PostgreSQL Internals - Buffer Management - Satoshi Nagayasu snaga@snaga.org
  • 2. bufmgr関連データ • 1つ以上のバックエンドによって参照されて いるバッファ(プール)のハッシュテーブル – SharedBufHash • どこからも参照されていない(されなくなっ た)バッファのリスト(環状リスト) – SharedFreeList • いずれも共有メモリ内の領域 2003/06/20 Satoshi Nagayasu
  • 3. BufferDescriptor • BufferDescriptorメンバ(抜粋) – Buffer freeNext, freePrev – SHMEM_OFFSET data – int buf_id – BufFlags flags – unsigned refcount 2003/06/20 Satoshi Nagayasu
  • 4. 初期化直後のBufferDescriptorリスト(NBuffers=8) freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev InitBufferPool() InitFreeList() NBuffers(GUC)+1のBufferDescriptorを確保する。 最後の1個を空きバッファリストの先頭要素とする。 freeNextを辿ると、「8→1→2→3→4→5→6→7→0→8」 2003/06/20 Satoshi Nagayasu
  • 5. ディスクからバッファへの読込み • バッファに読み込むディスクブロックの指定 – BufferTag • fileNode(テーブルOID)とブロック番号 • バッファプールの中に存在するか? – BufTableLookup() • BufferPoolのHashテーブルを検索 • 存在しなければディスクから読み込み – GetFreeBuffer() & smgrread() 2003/06/20 Satoshi Nagayasu
  • 6. ディスクからバッファへの読込み • ReadBuffer() / ReadBufferInternal() – BufferAlloc() • BufTableLookup() でHashテーブルを検索 • 見つからなければ GetFreeBuffer() でバッファ取得 • Hashテーブルに追加 – Hash 内にあれば BufferDescriptorGetBuffer() – 無ければ smgrread() 2003/06/20 Satoshi Nagayasu
  • 7. GetFreeBuffer() freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev buf = &(BufferDescriptors[SharedFreeList->freeNext]); 2003/06/20 Satoshi Nagayasu
  • 8. GetFreeBuffer() freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev BufferDescriptors[buf->freeNext].freePrev = buf->freePrev; 2003/06/20 Satoshi Nagayasu
  • 9. GetFreeBuffer() freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev BufferDescriptors[buf->freePrev].freeNext = buf->freeNext; 2003/06/20 Satoshi Nagayasu
  • 10. GetFreeBuffer() freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev buf->freeNext = buf->freePrev = INVALID_DESCRIPTOR; 2003/06/20 Satoshi Nagayasu
  • 11. SharedBufHash • ハッシュテーブルの操作(buf_table.c) – BufTableInsert() – BufTableDelete() – BufTableLookup() 2003/06/20 Satoshi Nagayasu
  • 12. PinBuffer()/UnpinBuffer() • PrivateRefCount (ローカル変数) – ひとつのバックエンド内で、そのバッファが何 回参照(Pin)されているか • BufferDesc->refcount (共有メモリ内変数) – いくつのバックエンドにそのバッファが参照さ れているか(複数バックエンド間での話)。 2003/06/20 Satoshi Nagayasu
  • 13. SharedFreeList • バッファを取得する場合には、freelistの先 頭(SharedFreeListの次)から取る – GetFreeBuffer() • バッファを開放する場合には、freelistの最 後尾(SharedFreeListの前)に追加 – BufferDesc->refcountが0になると、freeListに 追加される。 – UnpinBuffer(), AddBufferToFreeList() 2003/06/20 Satoshi Nagayasu
  • 14. SharedFreeList • 有効なブロックが読み込まれているバッ ファは、ハッシュテーブルに登録される • どのバックエンドにも参照されていないバッ ファは、freelistの最後尾に登録される • freelistから取り出したものが、以前使われ ていたdirtyなバッファの場合は、前のデー タをまずディスクにwriteしてから使われる 2003/06/20 Satoshi Nagayasu
  • 15. AddBufferToFreeList () freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev bf->freePrev = SharedFreeList->FreePrev; 2003/06/20 Satoshi Nagayasu
  • 16. AddBufferToFreeList () freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev bf->freeNext = Free_List_Descriptor; 2003/06/20 Satoshi Nagayasu
  • 17. AddBufferToFreeList () freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev BufferDescriptors[bf->freeNext].freePrev = bf->buf_id; 2003/06/20 Satoshi Nagayasu
  • 18. AddBufferToFreeList () freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev BufferDescriptors[bf->freePrev].freeNext = bf->buf_id; 2003/06/20 Satoshi Nagayasu
  • 19. bufmgrイメージ • ブロックが読み込まれてるバッファは SharedBufHashに • 参照されなくなったバッファはSharedFreeList に • 両方に存在することも shmem SharedBufHash postgres postgres SharedFreeList Buffer postgres Buffer Buffer 2003/06/20 Buffer postgres Nagayasu Satoshi
  • 20. bufmgr - InitFreeList() • 最初はSharedFreeListにある SharedFreeList SharedBufHash Buffer 2003/06/20 Satoshi Nagayasu
  • 21. bufmgr - GetFreeBuffer() • ディスクからブロックが読み込まれると、 SharedFreeListの先頭から取り出され、 SharedBufHashに登録される (GetFreeBuffer()&BufTableInsert())。 SharedFreeList SharedBufHash Buffer 2003/06/20 Satoshi Nagayasu
  • 22. bufmgr - UnpinBuffer() • どこからも参照されなくなる(refcount==0)と、 SharedFreeListの最後尾に登録される。この 段階では、SharedBufHashの中でも見つかる し、SharedFreeListにも含まれる。 SharedFreeList SharedBufHash Buffer 参照されてない。でもdirty(かもしれない)。 2003/06/20 Satoshi Nagayasu
  • 23. bufmgr - PinBuffer() • 再度参照されると、SharedFreeListから切り 離される。 SharedFreeList SharedBufHash Buffer 2003/06/20 Satoshi Nagayasu
  • 24. bufmgr - BufTableDelete() • そのまま参照されずに、再度別ブロックの バッファとして取得されると、以前のdirtyな データをディスクに反映させて、 SharedBufHashから一旦削除される(新しい ブロックとして再登録)。 SharedFreeList SharedBufHash Buffer 2003/06/20 Satoshi Nagayasu