操作系统学习建议

2012-02-25 10:36:49 yaoxinchao 阅读数 18399
学习应用软件的朋友,我也劝你们看看操作系统,内核等这些系统底层的东西。看过了以后,你会觉得看应用级编程会更流畅,学起来也会更简单。我就是这样学的,学MFC,后来开始学INTEL CPU的应用级编程,现在我决定开始从系统级学起。
     
     本人学习计算机技术至今,对于如何学习操作系统原理有一点自己的看法,现在写出来,希望对大家能有所帮助! 
         操作系统怎么学,首先要想操作系统是怎么来的,在没有操作系统的年代里,人们是怎么编程的。这是首要的问题。不知道有没有人看过INTEL官方的CPU文档,总是分为应用级编程、系统级编程、指令集这三块。其中系统级编程这一块最复杂,我不说内容,就单从文件的大小来看,IA-64编程手册的应用级编程卷是2MB,系统卷却有6MB。就连IA-32编程手册上的系统卷部分也远比应用卷的要多。当然这些内容我还没有看,不过从目录当中,觉得有很多相似的地方,比如CPU内存寻址、虚拟存储器管理、中断与保护等等,可以从INTEL的CPU文档上看出,各种CPU或机器虽然各有各的不同,各有各的特点,但是目前的CPU要解决的核心问题就是那么几块,要解决的就是象如何寻址内存,如何管理虚拟存储,如何实现中断,如何保护资源等等。

         各位编程的同仁想必都很清楚,计算机的操作系统就是在为应用级编程提供服务,提供什么服务,就是提供象诸如如何内存寻址,如何管理虚拟存储器、如何进行中断,如何管理磁盘,如何。。。。等等。操作系统为我们做掉了系统级编程中最繁重的一块,所以我们在用应用级编程比如用C++编程的时候才会那么舒服,用int分配一个变量这内存地址就来了,某个函数要调用另一个函数执行的时候这执行行程就能跳到那个函数,内存不够了,没有关系,操作系统自动启动虚拟存储器(只不过慢了些),所以应用级编程是最舒服的,操作系统级编程比较难,而直接做单片机可能就是最难的了。因为即使就是操作系统级编程,可能很多有关CPU底层的东西也已经做掉了,你要做的可能就是要了解的你的操作系统做掉了哪些功能,如何调用。而单片机就没有那么好玩了,单片机我没有做过,我想可能就是直接对着一个CPU用汇编来编程,而且很可能是在没有操作系统的情况下,这样一来,操作系统要承担的诸如内存管理,中断,过程跳转等这些复杂繁重的工作就得程序员自己来承担,那程序员的负担就比目前应用级编程大得多了。

         我猜想,可能在没有操作系统的时候,每个计算机程序员的日子可不会象现在的那么好过,因为做每个程序,都需要你自己去分配管理内存,你不但要考虑如何高效的管理内存,还要知道如何进行过程跳转等等这一大堆的的细活,而这些细活在不同的CPU上的实现方式也是不同的,直到把这些问题都解决了以后,你才开始真正考虑你的应用方面的程序逻辑如何去编的问题。当然了,虽然有关CPU底层的系统级实现细节不一样,但是大至CPU系统级这一部分要解决哪几块问题这是一样的,所以在INTEL的官方文档上,无论是IA-32还是IA-64这两个编程手册的系统卷上,都是那么几块内容。

         既然系统级要解决的几个任务都是相同的,每个程序员在编程的时候都要考虑这几方面的内容,那么可能就会想,为什么不把这些程序要解决的相同的任务给提取出来呢,这就形成了操作系统,操作系统的内核的任务,就是专门负责解决早期计算机程序员每次编程都必须要解决的几项系统级任务,这样一来,留给应用级的担子就非常的轻了,忘记在哪里看过,好像以前的数据库系统是属于应用软件的,可能同样是因为每个应用软件连同操作系统都需要一个数据库,所以就把数据库系统给单独提了出来做为系统软件了。有一点不明白为什么目前的操作系统要用文件系统,直接用数据库系统不更好些吗,既对用户服务,又为系统服务!

         我觉得,如果大家有要学操作系统原理的,根本就不必要去看所谓什么操作系统原理这一类的书,连外文的书籍也没有必要去看,因为目前国际CPU制造商提供的CPU文档的系统级编程卷才是真正的,原汁原味最好的教材,你要编写的操作系统从大部分任务就是解决系统卷里的任务的。有一次在QQ上和一个做单片机的家伙聊天,那人比我小一点,我当时说目前操作系统底层好难,他就说这有什么难的,他马上就能做一个操作系统,就连编译器也能做,我当时被吓了一大跳,小小年纪就这么厉害,现在我懂了,做单片机的,大概都会做操作系统,因为单片机的每次编程就是和系统底层打交道的,所以做单片机程序的自然对一个操作系统内核会比较了解了。

         在此建议和我一样的对操作系统原理感兴趣,对系统底层的感兴趣的人,直接去看INTEL的官方材料吧,操作系统原理有哪几条,要解决哪些任务,通过查看不同CPU的系统卷编程手册,找出其中相同的任务和逻辑去自己总结操作系统是如何做,无疑这种方法学到会是最多的了,而且理解起来可能会比一般的学习方法来得更深刻。

         学习应用软件的朋友,我也劝你们看看操作系统,内核等这些系统底层的东西。看过了以后,你会觉得看应用级编程会更流畅,学起来也会更简单。我就是这样学的,学MFC,后来开始学INTEL CPU的应用级编程,现在我决定开始从系统级学起。目前我也会上MSDN英文网站看看有关MFC的东西,但我看MFC倒不是主要因为去编写MFC应用程序,而是想看看微软是用系统为所有的应用级编程提供服务的,这整个一套结构是如何构造出来的,ORACLE数据库是我继INTEL文档的下一波目标,我也是想看看,一个数据库体系结构是什么样的,可不可以嵌到操作系统里去。

         就写到这里,希望有志同道合的朋友和我一起前行,最后祝大家编程愉快,工作愉快。呵呵!
2007-02-20 19:22:00 huangwei1024 阅读数 1579

要想学深入学习操作系统,推荐从这本书开始: Operatiing Systmes, Design and Implementation (by Tanenbaum, Woodhull),里面有个用于教学的操作系统Minix。Linux的某些方面,现在还可以找到Minix的影子。

现在书最新版是第三版。国内ms只有影印版的。Minix 3.0,也已经有点难度了, X Window System都有了。http://www.minix3.org/

要是觉得还是太复杂,还有个更简单的GeekOS,http://geekos.sourceforge.net/

OS的设计是受限于硬件的,尤其是CPU。当代OS的不同进程之间的内存保护,虚拟地址,都要通过硬件。所以对一个CPU的深刻了解,必不可少。对于Intel的CPU,应该读下面三本:

1. Intel Architecture Software Developer's Manual, Volume 1: Basic Architecture http://www.intel.com/design/PentiumII/manuals/243190.htm

2. Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference Manual http://www.intel.com/design/PentiumII/manuals/243191.htm

3. Intel Architecture Software Developer’s Manual Volume 3: System Programming http://www.intel.com/design/PentiumII/manuals/243192.htm

尤其是第三本,编OS必看,虚拟内存,内存保护的东西全在里面。

操作系统里面代码最多的,实际是IO部分,理论不多,可事关重要。Mindshare出了一系列书,写的非常深入详细。http://www.mindshare.com/

学汇编开始直接学CISC的指令集太费劲了,推荐先从RISC汇编开始,西方大学计算机专业走的也是这条路。可以看的一本书是Introduction to RISC Assembly Language Programming,by John Waldron。里面用的处理器MIPS,可以下载个SPIM Simulator,在PC上跑。http://www.cs.wisc.edu/~larus/spim.html

Knuth老先生在The Art of Computer Programming一书里的例子,都是汇编,现在用的虚拟机是访RISC设计的,叫做MMIX,Knuth写了本书,叫做MMIXware, A RISC Computer for the Third Millennium, 呵呵,口气好大啊。

讲计算机架构的两本计算机学科经典书,是Patterson和Hennessy合写的两本:Computer Organization and Design: The Hardware/Software Interface 3rd edition,以及Computer Architecture, Fourth Edition: A Quantitative Approach

学汇编要注意一点,每个汇编器,其语法都不一样。在Windows下面写汇编,微软的Macro Assembler不是很合适,里面的Macro太多,都赶上高级语言了。有个开源的Netwide Assembler, http://sourceforge.net/projects/nasm, 倒是挺不错,推荐使用。

关于学习操作系统内核,如果不是非抱着Linux的话,BSD是个挺好的选择。代码的结构可能还清晰些。FreeBSD基本非常满意,有两点不足,MySQL是针对Linux优化的,在FreeBSD下性能不够好,但是根据Yahoo的人说(Yahoo用FreeBSD),FreeBSD最新版下用MySQL threading library重新编译性能可以接受了。Java也不尽如意,Sun 现在提供Java 5的binary给FreeBSD。但我在FreeBSD如果启动Tomcat开的内存太大,启动会失败。

想看看FreeBSD的源码,可以看看这里:http://www.leidinger.net/FreeBSD/src_docs/,里面列的都是内核各个部分的Code Reference Manual。里面那个讲kernel的文件有23M,共2205页,可见钻研这些是件极为费时费力的事情。

http://www.chinaunix.net/也有很多BSD的资料。

现在主流操作系统,就两大家了,一边是微软的以NT为内核的Win2k/XP/2003/Vista,另一边是以UNIX为根基的Linux/BSD/Solaris等等.

Tanenbaum说过这么一句话,操作系统是什么呢,就是操作系统定义的API。

学习Windows下的API,容易许多,资料全,另外Jeffrey Richter的Programming Application for MS Windows那本书写的太好了,Process, Job, Thread, Fiber, Critical Section, Event, Waitable Timer, Semaphore, Mutex,Virtual Memory, IO,写的非常详尽清楚。要是Linux/BSD下面也有这么一本书,该有多好啊。Linux, BSD里面的线程,家家各有不同,把人搞得糊里糊涂。

如果从研究操作系统是怎么实现的,那么正好反过来,Linxu/BSD/Solaris简单明了多了.除了代码公开,他们内部结构没有Windows那么复杂。Windows的源码,要是成为微软的MVP,也是可以看到的。Windows 2000的大部分源码,还泄露出来了,在网上流传了一阵子。

个人觉得搞应用的去学习编译器回报可能更大,首先就是对语言了解很深入,写码,读码容易。如果会了编译器前台技术,可以自己写个分析代码的程序啊,那么读别人的码不久容易很多。现在虽然有现成的源码分析器,但是想想你有个数据库,一种是只能使用别人写好的界面,一种是可以用SQL自由查找,哪个好?如果学会了编译器后台技术,恭喜你,写任何一行代码都知道在计算机里怎么执行的,这是一种多么自由自在的境界啊。 

另外再推荐一本Sixth Edition UNIX Operating System:http://www.lemis.com/grog/Documentation/Lions/

2015-10-25 22:23:37 sxhelijian 阅读数 3525

【学生留言】
  老师,您好!大二的时候买了您出版的逆袭大学这本书,觉得很受用。我现在呢,已经是一名大三的女生。我的代码能力还勉强可以,数据结构书上的代码基本都实现了,也参加了ACM大赛。我想考研,可是现在正在学习的操作系统这门课,让我真的是找不到头绪,都是枯燥的原理,文字。看了跟没看差不多,也不知道学来怎么用。根本找不到学习这门课的方法,令人苦恼,这是一门考研必考科,学得一头雾水,确实让我很着急,特别希望老师您能给我一点学习这门功课的建议。由衷的谢谢您,老师!

【回复】
  这门课我没有教过,不知能否说好。觉得枯燥,还是没有将知识与实际的产品对照起来,在你脑中产生不了相关原理的应用场景。建议在学习时,着意将要解决的问题先搞清楚。比如内存管理的一些策略算法,知道内存管理时面临的问题,某算法是从哪个角度考虑的,相关的策略是为什么来的,这样就能将本来生动的东西生动起来了。
  搜索了一下有关操作系统的书,还真没有找到通俗一些的读物。还请熟悉操作系统著作的同行看到此文给些建议。像学习计算机组成,看《大话处理器:处理器基础知识读本》就非常好。现在你可以做的是,到图书馆借两三本看着还顺眼的操作系统书,一本书看不明白,另外一本书可能换种写法,就让你明白了。不拘泥于一本教材,也是一种途径。
  相同的思路,可以从网络上收集一些视频资源看一看,与你们老师的讲法不一样一些,你的感觉可能也就不一样了。可能会给你带来新的启发。总之,多种信息资源互补起作用吧。我知道的资源是网易上的一组专业课程,那里有哈工大的操作系统课程。
  学操作系统还有人建议是看Linux源码,这也是使学习生动起来的途径。这种方法显然需要更多的投入,直接看代码的难度,不比看文字容易。作为可长远追求,短期慎选吧。
  操作系统中到处都是宝,这与考研与否无关,是计算机类专业学生重要的专业基础。

2016-06-16 19:55:47 qq_23100787 阅读数 6248
介绍了一些操作系统学习的经典书籍,包括理论上的、具体操作系统的。 
Abraham Silberschatz的两本书:
1. 实用操作系统概念(影印版) 
2. 操作系统概念(第六版 影印版)
 
这个作者绝对是顶尖级的,来自贝尔实验室,是目前世界上操作系统方面的领军人物。这两本书第二本和第一本很多地方相似,区别在于第二本理论偏重一些,第一本实例讨论的更多一些。这两本书别看很厚,但是写的非常流畅,属于比较易读的一类。

3. 现代操作系统(英文版•第2版) 
Andrew S. Tanenbuam(坦尼伯姆, AST)是第4本书的升级版,里面添加了一些新的操作系统方面的讨论,原理部分比第四本稍有增强。个人认为,是除了前面两本之外的最好的书。

4. 操作系统: 设计及实现(第二版)(英文影印版) 
这个比较有名了,主要是分析minix源代码的书,顺带着讲了下原理,应该说是偏于实践的,可能当年的linus的教材就是这本,影响较大,可以帮助你了解一个文件系统或系统调用之类是如何实现的。当然,和目前的操作系统来讲,稍简单了一些。想做linux kernel hacker的同学此书可以一读。

5. 操作系统:现代观点(第二版 实验更新版)(英文版) 
Operating Systems: A design-Oriented Approach 这两本一般,但是还是比国内抄袭的教材强很多,可以作为补充阅读的书籍。

6. LINUX内核源代码情景分析(上册) LINUX内核源代码情景分析(下册) 
Understanding Linux Kernel
Linux internal
这三本是最nb的linux内核分析书籍,后两本讲2.2内核,第一本讲2.4。

7. 4.4BSD操作系统设计与实现(英文影印版) 
不说少了,原来berkeley那帮写bsd的其中几个人写的,经典就是它了。

8. UNIX操作系统设计(英文版) 
:古老的unix设计方面的书籍,应该说这本书在unix世界里面的影
响是十分巨大的,很多后来的unix分枝,思想都是缘于此书。里面主要讲解unix各个部分
实现时所用的算法,其中一些目前还在使用中。想了解一下unix实现但又没什么时间扣
minix或linux内核的朋友可以看看,在这本书上花费几十个小时,绝对超值:)

9.Linux内核完全注释 
这一本书我觉得也很棒。它以Linux 0.11内核源码为基础进行详细的分析,解释细致到位。虽然不是“经典”,但仍推荐!凭借简洁明了的源码分析,你可以管窥Linux操作系统的奥秘。
可惜现在还没有印刷版。相关网址:http://www.oldlinux.org 

 


*****************************
转:一名教师的建议:
想学操作系统的同学,推荐以下教材供选择:
概念和理论:《现代操作系统》、《操作系统概念》
基于Unix:《Unix操作系统设计》
基于Linux:《深入理解Linux内核》
基于Windows:《深入解析Windows操作系统》
操作系统设计:《操作系统设计与实现》
源代码分析:《Linux内核源代码情景分析》
 
*********************************
以下纯属个人观点:教材对于本科教学是非常非常重要的。这一点,也许没有多少学生当时能够明白,但是授课教师应该明白。但是授课教师可能顶不住系里领导的压力,最终强制同学们买些烂书。记得当时我们用到自己学校院里老师参与出的书,垃圾程度就不多说了。
浪费了我们的金钱可以不提;但浪费了我们的青春!
浪费了我们的时间,更误导了我们的智慧!!
强烈质疑 严蔚敏的《数据结构》 汤子瀛的《操作系统》 王珊的《数据库》——这些都是国内流行的经典计算机教材,他们又能使学生学到多少呢?多有艰深晦涩甚至不通顺的理论,没有娓娓善诱的指导,这些课程,对学生来说,传授了知识,兴趣,还是创造力?更有其他烂书...有多少学生 就是被烂教材打击了学习的信心,丧失了学习的兴趣...
2016-03-02 10:36:55 erlian1992 阅读数 7681

       本人学习计算机技术至今,对于如何学习操作系统原理有一点自己的看法,现在写出来,希望对大家能有所助!


       操作系统怎么学,首先要想操作系统是怎么来的,在没有操作系统的年代里,人们是怎么编程的。这是首要的问

题。不知道有没有人看过INTEL官方的CPU文档,总是分为应用级编程、系统级编程、指令集这三块。其中系统级编

程这一块最复杂,我不说内容,就单从文件的大小来看,IA-64编程手册的应用级编程卷是2MB,系统卷却有6MB。就

连IA-32编程手册上的系统卷部分也远比应用卷的要多。当然这些内容我还没有看,不过从目录当中,觉得有很多相似

的地方,比如CPU内存寻址、虚拟存储器管理、中断与保护等等,可以从INTEL的CPU文档上看出,各种CPU或机器

虽然各有各的不同,各有各的特点,但是目前的CPU要解决的核心问题就是那么几块,要解决的就是象如何寻址内

存,如何管理虚拟存储,如何实现中断,如何保护资源等等。


       各位编程的同仁想必都很清楚,计算机的操作系统就是在为应用级编程提供服务,提供什么服务,就是提供象诸

如如何内存寻址,如何管理虚拟存储器、如何进行中断,如何管理磁盘,如何。。。。等等。操作系统为我们做掉了

系统级编程中最繁重的一块,所以我们在用应用级编程比如用C++编程的时候才会那么舒服,用int分配一个变量这内

存地址就来了,某个函数要调用另一个函数执行的时候这执行行程就能跳到那个函数,内存不够了,没有关系,操作

系统自动启动虚拟存储器(只不过慢了些),所以应用级编程是最舒服的,操作系统级编程比较难,而直接做单片机

可能就是最难的了。因为即使就是操作系统级编程,可能很多有关CPU底层的东西也已经做掉了,你要做的可能就是

要了解的你的操作系统做掉了哪些功能,如何调用。而单片机就没有那么好玩了,单片机我没有做过,我想可能就是

直接对着一个CPU用汇编来编程,而且很可能是在没有操作系统的情况下,这样一来,操作系统要承担的诸如内存管

理,中断,过程跳转等这些复杂繁重的工作就得程序员自己来承担,那程序员的负担就比目前应用级编程大得多了。



        我猜想,可能在没有操作系统的时候,每个计算机程序员的日子可不会象现在的那么好过,因为做每个程序,都

需要你自己去分配管理内存,你不但要考虑如何高效的管理内存,还要知道如何进行过程跳转等等这一大堆的的细

活,而这些细活在不同的CPU上的实现方式也是不同的,直到把这些问题都解决了以后,你才开始真正考虑你的应用

方面的程序逻辑如何去编的问题。当然了,虽然有关CPU底层的系统级实现细节不一样,但是大至CPU系统级这一部

分要解决哪几块问题这是一样的,所以在INTEL的官方文档上,无论是IA-32还是IA-64这两个编程手册的系统卷上,都

是那么几块内容。



        既然系统级要解决的几个任务都是相同的,每个程序员在编程的时候都要考虑这几方面的内容,那么可能就会

想,为什么不把这些程序要解决的相同的任务给提取出来呢,这就形成了操作系统,操作系统的内核的任务,就是专

门负责解决早期计算机程序员每次编程都必须要解决的几项系统级任务,这样一来,留给应用级的担子就非常的轻

了,忘记在哪里看过,好像以前的数据库系统是属于应用软件的,可能同样是因为每个应用软件连同操作系统都需要

一个数据库,所以就把数据库系统给单独提了出来做为系统软件了。有一点不明白为什么目前的操作系统要用文件系

统,直接用数据库系统不更好些吗,既对用户服务,又为系统服务!



        我觉得,如果大家有要学操作系统原理的,根本就不必要去看所谓什么操作系统原理这一类的书,连外文的书籍

也没有必要去看,因为目前国际CPU制造商提供的CPU文档的系统级编程卷才是真正的,原汁原味最好的教材,你要

编写的操作系统从大部分任务就是解决系统卷里的任务的。有一次在QQ上和一个做单片机的家伙聊天,那人比我小

一点,我当时说目前操作系统底层好难,他就说这有什么难的,他马上就能做一个操作系统,就连编译器也能做,我

当时被吓了一大跳,小小年纪就这么厉害,现在我懂了,做单片机的,大概都会做操作系统,因为单片机的每次编程

就是和系统底层打交道的,所以做单片机程序的自然对一个操作系统内核会比较了解了。



        在此建议和我一样的对操作系统原理感兴趣,对系统底层的感兴趣的人,直接去看INTEL的官方材料吧,操作系

统原理有哪几条,要解决哪些任务,通过查看不同CPU的系统卷编程手册,找出其中相同的任务和逻辑去自己总结操

作系统是如何做,无疑这种方法学到会是最多的了,而且理解起来可能会比一般的学习方法来得更深刻。



        学习应用软件的朋友,我也劝你们看看操作系统,内核等这些系统底层的东西。看过了以后,你会觉得看应用级

编程会更流畅,学起来也会更简单。我就是这样学的,学MFC,后来开始学INTEL CPU的应用级编程,现在我决定开

始从系统级学起。目前我也会上MSDN英文网站看看有关MFC的东西,但我看MFC倒不是主要因为去编写MFC应用

程序,而是想看看微软是用系统为所有的应用级编程提供服务的,这整个一套结构是如何构造出来的,ORACLE数据

库是我继INTEL文档的下一波目标,我也是想看看,一个数据库体系结构是什么样的,可不可以嵌到操作系统里去。



        就写到这里,希望有志同道合的朋友和我一起前行,最后祝大家编程愉快,工作愉快。呵呵!