PostgreSQL spin 與 lwlock

jesselyu發表於2015-04-20

在PostgreSQL 中,記憶體鎖大致可以分為spin lock, lwlock以及Lock。

1.spin lock

    就是自旋鎖,實現的成本最低,一般使用TAS(test and set)來實現,而TAS操作,通常由硬體來實現記憶體操作。沒有佇列的概念。

因此速度是最快的。通常只有exlusive一種模式,要麼得到,要麼不斷spin-》sleep-》spin。詳細內容見可我另外一篇文章“TAS 指令與PostgreSQL spin lock“。

PG中,s_lock.h中定義的tas指令操作:

image

從上面的asm 嵌入指令中,可以看出彙編指令的操作也就是簡單的比較與置位。實現簡單快速。


2.lwlock

    也就是PG中所講的輕量級鎖(Light-weight lock)。這個鎖一般由spin lock來保護。lwlock比spin lock多一種共享模式。

原始碼中定義:

image

其中 slock_t 型別的mutex就是用來保護LWLOCK的,另外多了shared模式。因此,從實現上比spin重了點。但是跟lock比,還是比較輕量級的,這也是為什麼有了Light-Weight Lock的名稱的原因。

PG中預設預先定義了許多LWLOCK,通常是跟共享記憶體的操作相關的。比較著名的如:

BufFreelistLock:用來保護buffer pool的freelist

WALInsertLock,WALWriteLock:用來保護WAL
      ControlFileLock:保護控制檔案的寫
      CheckpointLock:保護檢查點


3.lock

是PG中重量級鎖,是low-level鎖,與表和事務相關。為application級別鎖。這就是通常我們講的表鎖,行鎖等。定義如下:

NoLock                        0        /* NoLock is not a lock mode, but a flag value meaning "don't get a lock"  */
AccessShareLock                 1        /* SELECT */
RowShareLock                    2        /* SELECT FOR UPDATE/FOR SHARE */
RowExclusiveLock               3        /* INSERT, UPDATE, DELETE */
ShareUpdateExclusiveLock    4        /* VACUUM (non-FULL),ANALYZE, CREATE * INDEX CONCURRENTLY */
ShareLock                          5        /* CREATE INDEX (WITHOUT CONCURRENTLY) */
ShareRowExclusiveLock        6        /* like EXCLUSIVE MODE, but allows ROW * SHARE */
ExclusiveLock                     7        /* blocks ROW SHARE/SELECT...FOR * UPDATE */
AccessExclusiveLock            8        /* ALTER TABLE, DROP TABLE, VACUUM * FULL, and unqualified LOCK TABLE */

lock的獲取與釋放,都有佇列來維護。原始碼定義如下:

image


LOCKTAG,與PG中的資料庫,relation等強相關。與資料庫中表存在一一對映關係。 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30088583/viewspace-1587930/,如需轉載,請註明出處,否則將追究法律責任。

相關文章