windows session機制深入解析(下)
我們在深入一點。在下圖中展示了session0的基本組成,其中有個名為Bob的用戶登入。正如你所看到的,Winsta0包含用戶控制臺中的所有進程還有任何被標記為可交互(Interactive)的任何服務。本例中,Winsta0包括winlogon.exe,explorer.exe和其他需要與用戶交互的服務。名為service-0x0-3e7$的Windows station 擁有在Local system帳號下且不與用戶交互的所有服務。本例中service.exe正是這樣的服務。,正如你所看到的連接線,將來自各個不同虛擬session的進程載入到單個windows station。SQL進程被載入到其自身的windows station并且使用自己的證書認證,所以它不屬于其他兩個windows station。
因此,我們可以將上圖總結如下:
- 整個圖展示的是session0.
- 在Bob帳號下的所有進程都載入到Winsta0。
- 在local system帳號下可交互進程載入到winsta0。
- 在local system帳號下不可交互進程載入到Service-0x0-3e7% windows station 。
- 在私有證書下啟動的進程載入到其自己的windows station(像SQL)。
一個單獨的桌面堆分配給一個單獨的桌面對象。這個堆包含各種人機交互對象,包括窗口,目錄和鉤子。當應用程序需要引用一個人機交互對象時,它將會去調用user32.dll去分配該對象,并且分配的每一個交互對象都會占用一部分桌面堆。如果桌面堆趨于耗盡,你將會看到不正常顯示或其他不正常現象。并且,如果session視圖存儲區耗盡,session將不能在創建更多的桌面堆。當然兩者中的任何一個出現都是不好的。這就是或許為什么當你還有很多內存剩余的時候仍然會接到“內存耗盡錯誤”的原因。
當這種情況發生時,你可能會收到“初始化錯誤”伴隨著視窗不正常顯示。一個典型的錯誤是 0xc0000142,意思是 STATUS_DLL_INIT_FAILED。你可以從癥狀中得知引發問題的原因是由于單個桌面堆還是整個會話引起的。如果桌面堆耗盡,你僅僅會看到與該窗口堆相關的進程出現問題。如果是session視圖存儲區耗盡,你會看到整個session出現問題。
win32k.sys有一個固定的48M的存儲空間分配給桌面堆。在終端服務中,這個空間是被每個session所共享,結果是僅僅留出20MB給桌面堆。所以,在終端服務器上比在個人電腦上更容易出現桌面堆耗盡的情況。但在vista和windows server2008中由于桌面堆是動態分配的,所以48M的限制不復存在。
注冊表項 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems 用來設定這個存儲區的大小,它的值形如“%SystemRoot%system32csrss.exe ObjectDirectory=Windows SharedSection=1024,3072,512 Windows … ”
需要關注的是"SharedSection=1024,3072,512". 這三個值決定了將有多少KB的空間分配給桌面堆的各個部分。第一個值指示所有桌面共享堆的大小,用來存儲全局句柄表和共享系統設置。默認值是1024KB,一般情況下不需要修改這個值。第二個值指示分配個每個在可交互windows station中桌面堆的大小,用來存儲諸如鉤子,菜單,字符串和窗口之類的對象,默認值是3072KB。登錄的用戶越多,創建的桌面就越多。結果是,所有桌面堆大小的總和增加以反映創建的桌面數增加。然而,每個桌面僅僅擁有3072KB的可交互桌面堆大小。第三個值指示分配個每個在不可交互windows station中桌面堆的大小,默認值是512KB,如果沒有設定,將于第二個值相同。
在用戶帳號下的每個服務進程都會由SCM(Service Control Manager )在不可交互window station下分配一個桌面。因此,每個這樣的服務都會消耗一部分向SharedSection中第三個值設定的桌面堆的大小。在可交互和不可交互wndow station下的桌面堆的總大小必須在48M以內。所以,減小在sheareSection中第二或第三個值的大小會增加可以被創建的總桌面數的大小,相應的也會減少在各自桌面內科創建的鉤子,菜單,字符串和窗口的數量。反之亦然。同樣,增加SharedSection第三個值的大小會減少用戶帳號下可運行的服務數量
參考文章:
posted on 2009-07-18 12:59 pear_li 閱讀(3050) 評論(2) 編輯 收藏 引用 所屬分類: windows kernel 、Translate