操作系统,是IT人的任督二脉(之一)。打通这跟筋,便可功力精进,横扫天下。为什么这么说?为什么操作系统如此重要?原因如下:
1)只要你搞软件,就离不开OS。即便你是玩Cisco的,也还要面对IOS吧。
2)大规模架构设计和系统集成,需要对底层OS的能力和容量非常熟悉,才能驾轻就熟。
3)诊断纠错需要熟悉操作系统。
4)性能优化需要熟悉操作系统。
5)搞计算机和网络安全更需要懂操作系统。
5)软件开发需要懂操作系统,如果对OS和API平台不熟悉,那就是两眼一摸黑,出了问题立刻抓瞎。
 
操作系统,百度百科上是这么解释的:操作系统是控制其他程序和后台服务运行(控制程序),管理系统软硬件资源(管理资源)并为用户提供操作界面(提供界面)的系统软件的集合。这句话写得太好了,把OS的三个职能清晰的展现给我们了:控制程序、管理资源、提供界面(用户图形界面和编程API/SDK)。百度上操作系统这个词条写得非常不错,大家感兴趣可以去看看。我认为,修炼操作系统,应该从两个角度入手,分别是静态的和动态的。静态的,是指熟悉操作系统的基本概念,以及结构和各个模块之间的关系;动态的,是指搞清楚程序在操作系统中运行的过程和方式。
 
从静态的角度看操作系统
image
操作系统一般分为内核模式和用户模式。以Windows为例,内核模式中主要包括一些对硬件的管理模块和对程序的控制模块。比如我们熟悉的内存管理器、设备驱动程序管理器、文件系统、安全子系统、注册表等等。一些比较重要的概念和模块是:
1)进程的地址空间。这是包括Windows在内的现代操作系统最核心的概念之一,MSDN上的定义是:所有32位应用程序都有4GB的进程地址空间(32 位地址最多可以映射 4 GB 的内存)。对于Windows操作系统,应用程序可以访问2GB的进程地址空间,称为用户模式虚拟地址空间。应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间。其余2GB为操作系统保留(也称为内核模式地址空间)。这个的很多人不求甚解,往往搞不清楚用户模式虚拟地址空间、物理内存、虚拟内存、内存映射、页面文件等等之间的关系。应用程序对内从的申请和使用过程,也需要理解的非常的透彻,这一部分,在我下面提到的推荐书籍Windows核心编程中,有非常透彻的讲解。
2)进程和线程。这些都是操作系统教材上老生常谈的概念了,进程就不多说了,线程很重要,尤其是操作系统对多线程的实现和处理方式,这是学习服务器端编程或者其他比较深入工作所必须掌握的知识。侯捷曾经翻译过一本《Win32 多线程程序设计》,这本书非常的好,是从另一个侧面学习操作系统的优秀教材。
3)驱动程序。你可能不知道,80%以上的Windows蓝屏死机,是由在Windows系统内核中运行的第三方驱动程序造成的。驱动程序不仅仅包硬件驱动,一些防病毒软件、防火墙,甚至***软件的,都会在Windows中安装驱动。理解操作系统是如何处理对硬件的访问,驱动程序的类型,驱动程序的安装和加载过程,这些都很重要。你可以不会写驱动程序,但是有这些基本的概念。
4)安全子系统。一提到安全,很多人第一个想到的是***。其实,Windows的安全子系统是非常复杂的,远远不是那些仅仅会使用***工具的伪***所能够掌握的。安全是一个非常奥妙的话题,可以一直很深入钻下去。在自称***之前,请至少先看完《Writing Security Code》。
5)文件系统。随着大规模网络存储技术的普及,需要系统管理员对操作系统的磁盘管理,IO管理,各类文件系统的支持有非常深入的理解。以NTFS为例,其实这个文件系统远远比你想象的复杂,类似于hardlink、数据流、日志等等高级功能,都有值得深入研究的地方。
6)注册表。这个概念每个人都知道,但是我们还需要更深入的理解注册表,知道它的格式、Windows记录内容的习惯、注册表文件的安全和备份、注册表的离线修改和维护,等等。
动口不如动手,我们可以用Sysinternal工具箱中的一些工具,对我刚才说的这些概念,进行一些深入和感性的认识。回家作业:请下载Sysinternals工具箱,并把如下的7个工具逐一操练,搞清楚通过这些工具得到的信息有什么用,在诊断排错的时候,如何选用这些工具。
1)Process Explorer;2)Process Monitor;3)pagedfrg;4)ntfsinfo;5)VMMMap;6)WinObj;7)Diskmon
 
以下部分尚未完成,把半成品和提纲先行贴出。最近工作非常的忙,只能见缝插针,慢慢地更新了。
在用户模式下,是大量的上层应用程序控制和管理的组件。比如我们熟悉的用户界面、后台服务等等。 也有一些非常重要,但是我们并不太熟悉的模块,比如会话管理器、Win32子系统等等。大量的应用程序和后台服务都是工作在用户模式下,我们也需要对用户模式的各个模块和特点有所掌握。
1)服务
2)会话管理器
3)Win32子系统
从动态的角度看操作系统
操作系统的启动和关机
工具LoadOrd
程序的执行和API的调用
消息队列、多线程等基本概念
作为一个编程平台
COM,组件
.net虚拟机环境
WinDBG是微软著名的调试器。用好这个工具需要相当深厚的功力,不过我们可以拿牛刀来杀鸡,用这个利器,来帮助我们更好地理解Windows和Windows上程序的执行方式。
回家作业:下载WinDBG,初步掌握一些程序外围跟踪和调试的方法。也许你不会成为内核调试高手,也没办法看到Windows源代码,但是可以通过WinDBG,打开一条直通Windwos和应用程序执行本质的桥梁。
一些学习和认识误区
盲从技巧,忽视本质。
假设在先,不求甚解。
深入细节,抓住大局。
操作系统的发展趋势
Google的Chrom OS也许是未来的一个发展趋势(个人看法,与公司无关),它很可能成为操作系统的一个新兴市场和蓝海。如果要做一下未来展望,我们应该首先从操作系统的三个核心功能出发:控制程序、管理资源、提供界面。
1)在控制应用程序方面,
2)对于资源的管理,动态IT的概念。单机操作系统的发展已经日趋成熟和完善,从单机操作系统对单机硬件资源的管理,到针对计算资源池的动态管理和规划。云计算的本质。从消费级别来看,操作系统的应用越发从PC计算到扩展到各类消费类电子产品,类似手机、游戏机、数码影音设备等等。
3)提供界面,用户界面走向自然化,向NUI过渡;编程界面更加灵活,跨平台
再更进一步的扩展思路,
 
推荐读物
1、Andrew S. Tanenbaum的Modern Operating Systems》(现代操作系统)是我非常推荐的一本“教科书”。豆瓣上的评论是这样的,大家可以参考参考。
2、Windows Internals,这是你能买到的有关Windows操作系统最全面也是最深入的书籍之一。这本书是比较难懂的,很多人买来,一般看到第三章就看不下去了。不过其实把头两章读懂,已经收获颇多了。另外Mark大牛的Sysinternal工具箱,也应该是必备的。
3、说道了解程序在OS中的执行过程,我觉得Jeff Ricard大牛的那本经典之作Windows核心编程是不能不看的。虽然是Win32时代的老书了,但是只要Windows存在一天,只要还有Win32 SDK写的应用程序,那本书就不过时。有人评论说:“从内容来说,确实是一本独一无而的书。虽然总是从API引出,但却相当深入的介绍了Windows的一些设计方面的东西和运行机制。诸如进程、线程、内存管理等,对一个想深入了解Windows的人来说是大有裨益的”。
4、2007年的时候,我曾在TechNet上邀请微软内部的专家开办了一个有关Windows的系列讲座,名称是《深入研究Windows内部原理系列网络广播》,也算是Windows Internals一书的真人中文有声版本,一并推荐给大家。