亚达斯密在其经济学巨著《国富论》中提出了“看不见的那只手”的概念,意指市场机制对经济发展的作用,作为普通的个人来说我们在平时的生活中可能很难感受到市场机制所发挥的作用,但这只看不见的手却无时无刻不在发挥着它的作用。
而对于程序员来说,在程序的运行环境中也会有一只看不见的手,这只看不见的手无时无刻不在影响着程序的运行,但你可能对此却浑然不知,对于程序员来说这只看不见的手就是操作系统,这只看不见的手就是本书的主题。
作为程序员我们要知道,操作系统从本质上讲也是一个普通的程序,和我们平时所编写的程序没有什么本质的不同,操作系统这个程序的特殊之处仅仅体现在其用途上。
操作系统的作用不是用来播放音乐、网上聊天、看电影、浏览网页、玩游戏的,这些都由特定的应用程序来完成,比如音乐播放器程序、视频播放器程序、微信、浏览器等,这些程序都有特定的用途并为计算机用户带来丰富多彩的体验,那么操作系统是一个什么样的程序呢?
操作系统其实是控制这些程序运行的一个程序,因此从这个角度看,操作系统的作用有点类似于政府,政府自身不去生产商品,运输货物,修盖建筑,政府的作用仅仅在于提供一个良好的社会生产环境,协调好各种资源的分配,对不法分子实施惩戒等等,政府对人的影响其实也是无时无刻不存在的,只不过我们平时可能感觉不是那么明显。操作系统也是这样,操作系统为程序员编写的程序提供了一个良好的运行环境,使得多种多样的程序在系统资源有限的情况下(CPU数量有限,内存容量有限)也可以畅通无阻的运行下去,同时操作系统对于“不法分子”也会予以惩戒,当我们的程序存在严重bug时,操作系统会毫不留情的将程序运行终止掉,防止其影响其它程序的正常运行。
一般情况下作为程序员我们无需去关注操作系统,既然操作系统在背后默默无闻工作的很好,那么我们为什么要费心去理解操作系统,去关心这只看不见的手呢?
每一个严肃的程序员都应该清楚的知道他的程序是如何同操作系统交互的。
如果程序员不能很好的理解操作系统,那么对于自己写的程序会始终存在所谓 “神秘的未知的恐惧”。当写完一段程序后,只能在心里默默祈祷千万不要有问题,千万不要有问题,但实际情况往往事与愿违。这时bug的修复来说对你来说非常困难,为什么,因为你根本就不知道到底是哪里出了问题,你不知道为什么会出现这样的问题,你连对手是谁都不清楚,更何况去打败它,这是其一。
其二,如果程序员不能很好的理解操作系统,那么一个大型的软件项目对于你来说很可能就是一个看得见摸不着的怪物。你根本就不清楚这个软件到底是如何运行起来的,在这样的软件项目中工作简直就是噩梦一般,你只能祈祷自己工作的模块不要有问题,遇到问题后只能不断的去问别人;为这个软件开发新功能对你来说更是一个极大的挑战,就好比让医生去为病人做手术,但是这个医生并不知道病人到底得了什么病。相信会有很多程序员有类似的体验。
工作多年后我逐渐观察到一种现象,这种现象在我们认为的编程高手中非常常见,那就是那些编程高手总是能解决各种在我们看起来都极难解决的问题。我把这些编程高手所拥有的这种能力称之为“独立探索”的能力。作为程序员,尤其是想成为高手的程序员,我们应该拥有所谓独立探索的能力,什么叫独立探索呢?即,虽然我暂时不熟悉一个复杂的软件、暂时不知道bug是怎么来的,但是基于自己所拥有的知识体系,可以依靠自己力量来弄清楚这一切。拥有独立探索能力是编程高手的标志,那些编程高手可以依靠自己的力量来解决在我们看来及其难以解决的问题,弄清楚在我们看来理不清头绪的复杂的软件代码。拥有独立探索能力的编程高手不会对任何程序产生畏惧心理,不会对任何bug产生畏惧心理,这些对于他/她来说反而是一个有趣的挑战,因为这是丰富自己知识体系的一个很好的机会,但这样的“机会”对于没有独立探索能力的程序员来说简直就是噩梦。
那么如何才能成为拥有独立探索能力的程序员呢?
我们知道,任何程序,无论这个程序有多么复杂,最终都是由操作系统来管理运行的,作为程序员所能利用的所有能力(进程、线程、锁、进程通信、网络、I/O等)都是操作系统赋予的。如果你理解了操作系统,理解了操作系统到底是如何运行你写的程序的,那么恭喜你,你将拥有了这种独立探索的能力,也就是“元能力”,这是其它能力的源泉。
而这也正是本书的重点所在,甚至,你可以理解为本书只解决一个问题,那就是,站在程序员的角度为大家彻底讲清楚“你写的程序到底是如何被操作系统运行的”,赋予大家独立探索的能力。
本书的书名《操作系统:以程序员的角度》致敬经典的《深入理解计算机系统》(即Computer System:A Programmer’s Perspective),希望大家通过该书的学习能将操作系统纳入自己的武器库,这将是一件威力及其强大的武器,从此你不再惧怕任何看似未知的困难,因为拥有独立探索能力的程序员最终都可以依靠自己的力量战胜它,进而成为大家眼中的编程高手。
1,什么程序?
2,进程?程序?傻傻分不清
3,程序员应如何理解内存:上篇
4,程序员应如何理解内存:中篇
5,程序员应如何理解内存:下篇
6,程序员应如何理解CPU:上篇
7,程序员应如何理解CPU:下篇
8,操作系统是如何看待进程的
9,系统调用是如何实现的
10,程序员应如何理解系统调用:上篇
11,程序员应如何理解系统调用:下篇
12,以发展的眼光来看待操作系统
13,操作系统是如何获取键盘按键的
14,程序员应如何理解中断
持续更新中。。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。