读书频道 > 网站 > 网页设计 > Windows内核原理与实现
1.1.2 为应用程序提供执行环境
13-05-18    奋斗的小年轻
收藏    我要投稿   

本文所属图书 > Windows内核原理与实现

本书从操作系统原理的角度,详细解析了Windows如何实现现代操作系统的各个关键部件,包括进程、线程、物理内存和虚拟内存的管理,Windows中的同步和并发性支持,以及Windows的I/O模型。在介绍这些关键部件时,本...立即去当当网订购

操作系统之所以要管理各种硬件资源,是为了更好地为上层应用程序提供服务。应用程序并不直接与机器的各种硬件设备及资源打交道,而是运行在一个抽象层上,即操作系统提供的功能语义层。操作系统提供什么样的语义层,将决定应用程序应该怎么来构建它们的功能逻辑。尽管不同的操作系统提供的这一功能语义层的接口可能不一致,甚至相距甚远,但现代操作系统的语义层在概念上仍然比较一致,下面我们从应用程序的构建需求来介绍一些核心概念。

首先,对应用程序的任务作最基本的抽象,这就是进程和线程的概念。尽管不同的操作系统对于进程和线程的定义不尽相同,但是每个任务都应该有它自己的执行环境,即该任务的控制流以及函数调用的层次递进痕迹(假设CPU 的指令体系中支持函数调用的语义)。比如,在UNIX 中,一个进程代表了一个应用任务,它记录了该任务的执行状态;在Windows 中,一个线程代表了一个任务,其中也记录了该任务的执行状态。现代操作系统都支持多个任务并发执行,任务的数量可以远远大于CPU 或核的数量,所以,每个任务实际上只是分到了一部分CPU 执行时间,多个任务可以共享一个 CPU 。因此,在这种多任务操作系统模型下,操作系统除了为每个任务(进程或线程)维护好其状态以外,还必须有恰当的算法来决定什么时候让哪个任务执行,什么时候暂停一个任务。正如本章前面所提到的,这便是任务调度,或者称为进程调度或线程调度(取决于操作系统是以进程还是线程的方式来管理任务)。简单地轮流执行每个任务,这种调度算法往往难以满足实际应用程序的各种需求。通常操作系统会采用基于优先级的抢占式调度算法,甚至根据任务的各种特性进行优先级的动态微调,这使得任务调度算法趋向于复杂化。Windows的线程调度方案属于这一类型。

其次,在支持多任务的基础上,如果这些任务是相互独立的,则操作系统总是可以采用适当的方式让它们获得执行机会,但在实践中,应用程序为了实现各种功能逻辑,不同任务之间往往有一些逻辑上的关联性。比如,任务之间必须强加某种时序关系,才能保证每个任务的状态是有效的;当多个任务竞争某些稀有资源(注意,系统的硬件资源,像打印机和显示器等,是共享的)时,系统必须确保这些任务有序执行。所以,凡是存在共享资源的地方,操作系统都必须提供恰当的方法来同步应用程序对它的访问。现代操作系统通常会提供多种同步机制,例如互斥体(mutex)、信号量(semaphore)、临界区(critical section )等。应用程序可以有选择地使用这些同步机制,以确保多个任务有序地共享资源。
 
除了任务和同步的概念,每个应用程序还必须有它自己相对独立的执行空间。在现代操作系统中,进程也代表了一个应用程序和它的执行空间。不同进程的空间是相互隔离的,这是现代操作系统的基本需求。操作系统必须在处理器的硬件特性基础之上,实现一套行之有效的空间隔离方案。每个进程有它自己的内存空间,并且无法直接访问其他进程的内存空间。进程之间如果要共享数据,则必须通过操作系统提供的机制来进行。Intel x86 体系结构上的操作系统基本上都利用硬件的虚拟内存映射机制来隔离每个进程的内存空间。所以,操作系统的职责是为每个进程维护好从虚拟地址到物理地址的映射关系,并且管理好物理内存的分配和回收。另一方面,除了进程的空间隔离性,操作系统还必须提供相应的机制让不同的进程可以相互通信,毕竟,很多软件需要进程之间的协作来完成一些上层功能。同步机制和跨进程地共享内存是典型的进程间通信(IPC ,Inter-Process Communication )手段。

前面提到,现代操作系统往往以统一的框架来管理 I/O 设备,这也隐含了操作系统向应用程序暴露的I/O 接口是统一的这样一层意思。应用程序通过此接口来访问系统的外部设备,而操作系统不仅要管理好应用程序访问外设的各种请求,包括它们的时序,还必须将应用程序的请求发送到对应的设备驱动程序中,最终由设备驱动程序来处理这些请求,而处理的结果也必须以某种方式回送给应用程序。操作系统通常以句柄(handle )来代表一个可访问的抽象设备,抽象设备可能与物理设备连接,也可能并不存在对应的物理设备或资源。操作系统还提供在一个句柄上读(read )、写(write)数据,以及发送控制命令的能力。所以,应用程序与系统设备打交道的方式非常简洁明了:打开设备获得句柄、向设备发送命令、读或写设备,以及关闭设备。操作系统的任务是管理这些设备和驱动程序,以及传递或解释应用程序的命令。

一类特殊的设备是磁盘,磁盘具有随机读写的能力,尽管其随机读写的性能比顺序读写要差很多。通常,磁盘的驱动程序负责操纵磁盘控制器,以便从磁盘中读取数据或者向磁盘上写入数据,但磁盘上的数据如何有效地组织起来以便不同的应用程序可以共享同一个磁盘,这一任务是由文件系统(file system )来完成的。在绝大多数操作系统中,文件系统是不可缺少的,它通过一个树状名字空间来管理磁盘上的存储空间,允许应用程序通过名称来访问磁盘上的数据。这种结构奠定了现代计算机的信息存储系统的基础。

所以,应用程序实际上工作在操作系统提供的抽象层上,它无须管理系统的硬件设备和资源,但必须使用操作系统提供的机制或语义来实现其自身的功能逻辑。这也暗示着,操作系统在某种程度上决定了上层应用程序应该如何使用它所提供的服务才是最有效和方便的,同时,应用程序也有足够的灵活性来完成其自身的上层功能。这就形成了在同一个操作系统上存在大量风格迥异的应用程序的局面,并且,由于不同操作系统提供的抽象层在概念上有一定的互通性,所以,很多应用软件能够便捷地从一个操作系统平台移植到另一个上。

我们通常所指的操作系统的范畴包括上面提到的资源管理功能,以及为应用程序提供的各种抽象概念和抽象接口的具体实现。但是,在应用程序和操作系统核心模块之间,往往还存在很多预封装好的模块,以便于应用开发人员可以复用这些模块,从而高效地开发应用软件,缩短应用软件的开发周期。这些模块既可能是操作系统厂商提供的,也可能是独立软件厂商提供的。它们既可能构成一个通用的中间件(middleware),也可能只是随编译器而提供的一个库模块(静态的或动态的)。例如,Windows 操作系统的发行版本包含大量这样的中间模块(例如COM/COM+、Winsock2、.NET 等),它们也成为了 Windows的一部分,但是,在本书中,我们将把焦点集中在Windows 操作系统的核心功能和模块上,只在必要的地方提及这些中间模块。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站