日期:2014-05-17 浏览次数:20864 次
转载请标明是引用于 http://blog.csdn.net/chenyujing1234
欢迎大家拍砖!
参考: http://blog.csdn.net/zacklin/article/details/7579217
以前我一直不理解Windows Session(会话)倒底是一个什么概念,总是感觉这个概念很虚,现在理解了一点。写下来做一个备忘。简单的说,用户登陆到windows系统之后,不管该用户是本地登陆的,还是远程登陆,系统都会为这个用户分配一个新的会话ID(SID)。也就是说会话与用户的登录是相关连的,没有用户登录就不存在会话。因此,会话的含义是指用户登录之后的一种运行的环境。我们先看看书上是怎么说的!
会话管理器(\Windows\System32\Smss.exe)是系统中第一个创建的用户态模式进程,负责完成执行体和内核的初始化工作的内核模式系统线程在最后阶段创建了实际的Smss进程(这段摘自: 《深入解析Windows操作系统(第4版)》80页)。
在启动Windows的过程中,会话管理器负责许多重要的步骤,比如打开额外的页面文件、执行延迟的文件改名和删除操作、创建系统环境变量。它也将子系统进程(通常只有
Csrss.exe)和winlogon.exe进程启动起来,winlogon进程依次会创建其他的系统进程。
在注册表的HKLM\SYSTEM\CurrentControlSet\Control\Session Manager 下面,你可以放到放多配置信息,它们驱动了Smss的初始化步骤。
Smss中的主线程在执行了这些初始化步骤后,一直在Csrss和Winlogon的进程句柄上等待。如果这两个进程中的任何一个非正常终止了,则Smss让系统崩溃掉(崩溃代码是STATUS_SYSTEM_PROCESS_TERMINATED或0xC000021A),因为Windows要依赖于这两个进程的存在才能运行得下去。
同时,Smss等待加载子系统的请求、调试事件,以及创建新的终端服务器会话(terminal server sessions)的请求。
终端服务会话(Terminal Services session)的创建是由Smss来完成的。当Smss接到一个创建会话的请求时,它
首先调用NtSetSystemInformation,请求建立内核模式的会话数据结构。这又依次调用内部的内存管理器函数MmSessionCreate,该函数建立起会话虚拟地址空间,该地址空间中包含会话中的换页内存池,以及由Win32子系统的内核模式部分(win32k.sys)和其他的会话空间设备驱动程序所分配的、属于每个会话的数据结构。
然后,Smss为该会话创建Winlogon和Csrss的实例。
Windows系统是支持多会话的,因此会话空间(session space)包含了一些针对每个会话的全局信息。所以会话空间是用来管理会话的。那么会话具体包含些什么呢?
会话(session)是由进程和其他的系统对象(比如窗口站、桌面和窗口)构成的,它们代表了一个用户的工作站登录会话。会话具体是由如下几个部分组成的:
1. 每个会话包含一个单独的win32k.sys
2. 专门的换页池区域
3. 私有windows子系统和登陆进程的拷贝
4. 系统空间中被映射的空间,被称为会话空间的区域
(参考: 《深入解析Windows操作系统(第4版)》 414页)
现在我把会话同进程做一个比较,发现他们之间有一些相似之处:
1. 都提供一个执行的环境
2. 都有一个私有空间
进程是为了内部的执行的线程提供一个空间和环境,而会话则是为内部所有的进程提供一个执行的空间和环境。(这是我总结的,感觉总结的很好,便于大家理解会话的概念)