在sql server的世界中,sql server在windows之上有一套自己的任務排程和資源分配系統,這使得sql server作為windows的乙個程序,卻可以處理大量的併發,這些任務排程和資源分配非常像乙個作業系統,因此sql server在windows之上,有一層被稱為sql os的系統。
類似windows程序之間的任務排程,sql server os也有一套自己的排程方案,在早期的sql server曾經使用windows自帶的程序排程系統,但由於sql server是乙個處理高併發的程序,因此windows排程造成的執行緒切換(context switch)會帶來很多的資源浪費,並且windows排程是搶占式排程,這對於sql server來說非常不利,因此sql server os通過非搶占式排程演算法來排程程序,除非執行緒自己釋放資源,sql server不會強制剝奪資源(當然了,一些極端情況比如死鎖,或是檢查scheduler時發現不利問題,會記錄到日誌,但依然不會搶占資源),這也使得開發人員對t-sql語句需要小心,當然了這是題外話了。
在了解了sql server基本的排程演算法後,再讓我們通過乙個圖來了解一下簡單的sql server中線程的幾種狀態(這類執行緒對windows來說是執行緒,對sql server來說是程序,這也是為什麼查詢這些執行緒的時候用的是sysprocess微笑),如圖1所示。
111圖1.sql server os的簡單演算法
如果你了解作業系統的排程演算法的話,你會發現這裡和作業系統的形式一樣,當執行緒得到等待的資源並獲得cpu時,就會是執行狀態,而當獲得資源沒有cpu時,就會是runnable狀態,或是當執行緒所需的資源沒有到位時,就會是阻塞狀態。
因此,多個cpu可以有多個執行緒在running狀態。
另外在sql server中,每建立乙個新錶時,都會為表分配儲存頁面,相應的,sql server也需要修改gam,sgam和fps頁。對於修改這些頁來說,sql server需要在修改的時候加上乙個輕量級的鎖,這也就是所謂的閂鎖(latch)。當多個執行緒同時需要修改gam,sgam,fps頁時,閂鎖會造成阻塞。對於使用者資料庫來說,不可能一直存在ddl操作,但對於tempdb來說,會經常進行建表和刪表,因此對於gam,sgam以及fps頁都會經常修改,如果tempdb只有乙個檔案而cpu存在多核的時候,多個同時執行的任務有可能爭搶gam,sgam,fps頁的修改權,因此造成阻塞,這對效能是非常不利的,而按照cpu個數將tempdb的檔案分為多份,則會存在多個gam,sgam,fps頁。多個running的執行緒會按照每個檔案的大小平均分布到不同的檔案中,因此解決了爭用問題。
另外,值得注意的是,對於tempdb的最佳做法是一開始就為每乙個檔案分配足夠大的值。並且每個檔案大小相等,這就避免了某個檔案增長導致的檔案大小不一,而sql server對於檔案的使用比率是按照檔案大小,如果檔案大小不一樣,就會造成熱點檔案,從而有可能造成閂鎖爭用。
分類: sql server
為什麼CPU需要時鐘才能工作
cpu裡可以粗略的認為是很多很多很多小電容。充滿電了算1,沒充電算0。每次計算就是這些小電容翻來覆去的充電放電。很多小電容組成乙個個基本的模組,比如輸入0011輸出0100 但從輸入0011到實際輸出0100是有乙個延遲的。因為前面說了,電容要充電放電,這個需要時間。這些小模組各種連線,組成複雜的功...
為什麼cpu佔用率非常高
乙個簡單的點燈任何ledtask,看起來cpu佔用率不高,但在這個任務起來後,整個系統的cpu佔用率會變得很高。經查,原因是這段code char cmd 64 sprintf cmd,opt ipnc gpiotst d setmode out pin system cmd sprintf cmd...
FPGA為什麼比CPU和GPU快
2018 03 05 11 28 cpu和gpu都屬於馮 諾依曼結構,指令解碼執行,共享記憶體。fpga之所以比cpu gpu更快,本質上是因為其無指令,無共享記憶體的體系結構所決定的。馮氏結構中,由於執行單元可能執行任意指令,就需要有指令儲存器 解碼器 各種指令的運算器 分支跳轉處理邏輯。而fpg...