深圳企业医疗网站建设,如何做网站编辑,网站建设优化服务特色,网站框架一般用什么做Windows API Windows API 是用户模式下的编程接口#xff0c;在64位Windows 出来之前#xff0c;32位Windows上的Windows API 叫做Win32 API#xff0c;主要是与原来的16位Windows上的 API区分。
Windows API 包括上千个函数#xff0c;主要分为以下几部分#xff1a; 基…Windows API Windows API 是用户模式下的编程接口在64位Windows 出来之前32位Windows上的Windows API 叫做Win32 API主要是与原来的16位Windows上的 API区分。
Windows API 包括上千个函数主要分为以下几部分 基础服务组件服务用户接口服务图形和多媒体服务消息和协作网络WEB服务
具体的书可以参考《Windows Via C》。 .NET
.NET Framework包括一个叫做FCLFramework Class Library的类库和一个提供托管代码运行环境的CLRCommon Language Runtime组成。 CLR支持JIT即时编译类型验证垃圾回收代码访问安全等功能。 所有的.NET组件都是在非托管的Windows API层之上的用户模式的Windows DLL没有任何.NET代码支行在内核模式。 具体的书可以参考《CLR Via C#》。 服务函数Routines 本地系统服务或者叫做系统调用用户模式下可调用的服务比如NtCreateUserProcess用来创建一个进程。内核支撑函数或者叫做routines内核模式下可调用的子程序比如ExAllocatePoolWithTag驱动用来从堆内存池中申请内存。Windows服务由Windows服务控制管理器启动的进程。DLL一组可以被动态链接并加载的程序例如Msvcrt.dll, Kernel32.dll。优点是多个程序调用一个DLLWindows只需要一份DLL的内存。.NET也可以编译DLL但不会导出任何函数CLR将编译后的元数据解析成可访问的相应的类型和成员。 进程线程作业 程序和进程很像但本质上是不同的。一个程序是一串静态的指令而进程只是一组资源的容器用于执行程序的实例。 进程包括 一个虚拟地址空间也就是进程可用的虚拟内存地址。一个可执行程序定义了初始化代码和数据并映射到进程的虚拟地址空间中。一些系统资源的句柄例如 信号量通信端口文件这些资源可以被进程内所有线程共用。一个叫做访问令牌的安全上下文用来识别用户安全组权限用户账号控制UAC的虚拟化状态session以及用户账号相关的状态。一个唯一的进程ID。至少一个执行的线程虽然也可以没有任何线程但没有意义。 每个进程有一个指针指向其余进程或创建这个进程的进程如果父进程不存在了这个指针也不会更新。也就是说可能会指向一个不存在的父进程。 这倒也无所谓因为没啥依赖的数据可以用系统自带的任务管理器查看进程信息 也可以用第三方的进程浏览器来查看此工具相当强大下载地址 http://download.sysinternals.com/files/ProcessExplorer.zip 可以查看的内容包括 进程安全令牌。高亮进程和线程的变化。列出服务宿主中的服务。作业中的进程。.NET程序的宿主的细节比如AppDomain加载的DLL性能。进程和线程的启动时间。完整的内存映射列表。挂起线程或进程。杀死一个线程。检测占用CPU时间较多的进程。进程树。打开进程的句柄。进程中加载的DLL。进程中的活跃线程。用户模式和内核模式的线程栈。CPU使用率。峰值内存量。 线程是进程中可被Windows调度的执行实体没有线程程序就不会运行。线程包括以下一些基本的组件 一些代表CPU状态的内容。两个栈分别用在内核模式和用户模式下。一个叫做TLSthread-local storage 的私有存储区各子系统运行时库和DLL都会用到。一个唯一的线程ID不会与进程ID相同。线程有时也有自己的安全上下文或令牌常用在多线程服务端程序模拟客户端安全上下文的时候。 可变的寄存器栈私有存储区都叫做线程的上下文。因为这些信息在不同的机器架构下是不同的。可以用GetThreadContext()函数访问。 虽然线程有自己的执行上下文但进程中的所有线程都共享进程的虚拟地址空间除了属于进程的资源。意味着所有线程都可以的读-写进程的虚拟地址空间。 线程不可能引用其他进程的地址空间但是如果其他进程将其私有地址空间标记为共享内存段在Windows API中叫做文件映射对象或者进程有权限打开其他进程的的跨进程内存例如用ReadProcessMemory 和WriteProcessMemory函数。 除了私有地址空间和线程进程里还有安全上下文和一些内核对象的句柄比如共享内存段同步对象如互斥量事件信号量。 进程的安全上下文文件存储在叫做“访问令牌”access token的对象里访问信息包括安全识别信息和凭证。默认情况下线程没有访问令牌但是线程可以有线程可以模拟其他进程的安全上下文包括远程系统的进程。 VAD虚拟地址描述符是内存管理器用来维护虚拟地址空间的数据结构。 如下图所示 Windows 提供了一个进程模型的扩展叫做作业Jobjob的主要功能是将一组进程作为一个单元进行管理。 job对象允许对进程的某些特定属性进行控制也记录了一些基本的信息包括已经终止了的进程。job对象填补了进程结构化的空缺。 Fibers有的翻译成纤程个人觉得这么翻译容易混淆概念与UMS 因为在线程间的切换换需要引入内核调度所以这是很费资源的操作。尤其是在两个频繁转换的线程中切换。Windows提供了两个机制用来减少资源的消耗分别是 FibersUMS用户模式线程调度 Fibers允许程序自己调度自己的线程而不用依赖于线程的优先级机制。 Fibers也叫做轻量级线程它们在用户模式中的Kernel32.dll中实现所以他们对于内核是不可见的。 要使用Fibers首先调用 ConvertThreadToFiber() 函数将线程转换成Fiber。然后这个Fiber可以用CreateFiber() 创建新的Fiber每个Fiber可以有自己的一组Fiber。 不像线程Fiber不会自动执行直到手动调用SwitchToFiber()才开始执行。 UMS线程是64位Windows专属的与Fiber的优点相同但没什么缺点。 UMS线程有自己的内核线程状态且内核可见允许多个UMS线程阻塞系统调用共享和竞争资源。 然而两个以上的UMS线程只需要在用户模式下可以不用内核调度就定期转换执行上下文。 虚拟内存 Windows实现了一个基于线性地址的虚拟内存系统为每个进程提供一个幻觉让其觉得自己有很大的可用内存空间。 虚拟内存提供了一个对于物理内存的逻辑视图但可能与物理内存的布局不一致。运行时内存管理器在硬件翻译映射的帮助下将虚拟地址映射到物理地址。 为了保护数据操作系统保证每个进程不会越界访问到其他进程的数据下图表示3块连续的虚拟内存页映射到不连续的3块物理内存页。 因为大多数系统都的物理内存都小于进程使用的虚拟内存内存管理器会将数据存储到硬盘上。 当线程访问分布到硬盘上的虚拟地址时虚拟内存管理器再将其加载回内存。 虚拟内存空间的大小在不同平台上也不一样在32位x86系统上最大4GB默认下系统用2G用户模式用2G。 也可以通过配置BIOS让用户模式用3GB系统用1GB。 如果3GB还不够用Windows提供了一个叫做AWEAddress Windows Extension的机制允许32位应用程序申请最大64GB的物理内存映射到2GB的虚拟内存空间中。 虽然用AWE将管理内存映射的负担压在了码农身上但是它提供了更多福利。 64位Windows提供了更大的地址空间IA64位可以用7152GBX64可以用8192GB。 64位地址空间大于170亿GB但是硬盘限制了。