统计

  • 随笔 - 50
  • 文章 - 42
  • 评论 - 147
  • 引用 - 0

留言簿(6)

随笔分类

文章分类

Link

搜索

  •  

积分与排名

  • 积分 - 154405
  • 排名 - 161

最新评论

阅读排行榜

评论排行榜

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。

因此,我们可以将上图总结如下:

  1. 整个图展示的是session0.
  2. 在Bob帐号下的所有进程都载入到Winsta0。
  3. 在local system帐号下可交互进程载入到winsta0。
  4. 在local system帐号下不可交互进程载入到Service-0x0-3e7% windows station 。
  5. 在私有证书下启动的进程载入到其自己的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 阅读(2788) 评论(2)  编辑 收藏 引用 所属分类: windows kernelTranslate

评论

# re: windows session机制深入解析(下) 2009-07-18 15:44 罗莱家纺

谢谢如此准确的翻译
  回复  更多评论    

# re: windows session机制深入解析(下) 2009-07-20 20:06 戴尔电脑

看看有帮助!
  回复  更多评论    

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理