通过Linux理解操作系统(一):概述

来源:互联网 发布:linux下使用anaconda 编辑:程序博客网 时间:2024/04/28 03:30

通过Linux理解操作系统(一):概述

用了那么多年电脑,操作系统从WinXPVista, 再到Win7, 然后是现在用的Ubuntu,这么长的时间里,一直没有搞明白这操作系统是个什么东西,为什么这么神奇,只要点一点,按一按,那些一块一块的硬件就可以完成我们的工作。直到学了操作系统这门课程,才开始有点朦朦胧胧的理解,最近又看了一些linux系统设计的资料,觉得有些领悟,所以写出来跟大家分享一下。

先声明,本人不是linux技术极客,所以本文不会讲一些很酷的linux使用技术,也不会讲一些很深入的linux内核分析,这些都有相应的书籍和资料可以学习,比如鸟哥的linux私房菜和Linux内核源码剖析,我只是希望通过linux这样一个开源的操作系统实例来帮助像我一样的菜鸟们理解操作系统这个东西,更多地是从系统本身的设计,数据结构,算法,代码来讲,如何实现了I/O,进程管理,内存管理这些东西,有讲错的地方请指正或者补充。(还有请轻喷~)

1、操作系统究竟是个神马东西

操作系统 (英语:Operating System,简称OS)是管理计算机 硬件与软件资源的计算机程序 ,同时也是计算机系统的内核与基石。 操作系统需要处理如管理与配置内存 、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。 操作系统也提供一个让用户与系统交互的操作界面。(摘自维基百科)

以上定义言简意赅,但是看起来还是云里雾里,好像知道了是这么个东西,其实心里疑问多多。其实说白了,抛开所有面纱,所有特殊地位,它就是一个计算机程序,它一样是通过源代码编译出来的,一样是由程序设计语言,数据结构,算法支撑起来的,它的目的就是管理计算机的硬件资源(硬盘,屏幕,键盘,鼠标,打印机,网卡等等)和软件资源(系统上运行的程序,像浏览器,播放器,文本编辑器,游戏等等),而这个目的的目的最终还是为用户服务,用户通过它,就只要点一点,按一按,高级一点的就输入一些命令,写写脚本什么的就能够完成那么多复杂的任务(你能想象自己去控制那么多硬件计算吗,想想电路实验的时候各种插线拔线吧~)。意识到这一点,我们才能抛开对它的恐惧,来好好的研究一下它。

2Linux的历史发展

linux的历史已经要被讲烂了,几乎所有的资料里都会花很大的篇幅来讲linux的发展,但是为了后面的理解需要,这里还是要简单提一提,详细的可以参阅:鸟哥的linux私房菜这个站点:http://linux.vbird.org/linux_basic/0110whatislinux.php

提到Linux,就不得不提到Unix,因为linux就是由unix发展而来的。unix最早诞生与20世纪四五十年代,是贝尔实验室的Ken Thompson在一台叫PDP-7的机器上写出来的,这个东西出来以后他的同事都被这个系统的能力感到惊讶,因为在此之前操作计算机是很痛苦的,(这里涉及到计算机的历史,就不展开了)。很多人开始加入到Unix的开发中,而由于这个系统一开始是用汇编写的,这意味着要把它用在其他机器上,就必须在新的机器上重新编写整个系统。怎么办呢?学过编译原理的同学就知道应该使用一种高级语言来编写这个程序,然后在不同的机器上通过编译器将其编译成能在该机器上运行的机器代码就行了。Thompson于是自己设计了一种语言叫做B,然后用这种语言重写了Unix,但是由于这个语言设计的缺陷最终不是很成功,这时候大名鼎鼎的Dennis Ritchie出现了,根据B,他又设计出了大家都相当熟悉的C语言,而且还为C写了一个很棒的编译器,然后他们两个就用了CUnix给重写了一遍,而C语言也成为了一种影响深远的程序设计语言(这两位大哥真心牛叉~)。

Unix出来之后,受到了很多关注,很多的大公司,科研机构都找贝尔实验室拿源码,当时贝尔实验室的老板AT&T公司由于对这个东西不是很重视 所以都给了(因为人家当时有的是钱~,推荐看看《浪潮之巅》就知道了,作者:吴军),这些机构拿到了源码之后,又进行了很多的研究和开发,于是产生了很多不同版本的Unix,其中一个就是伯克利大学,他们的版本就是很多人知道的BSD了 (Berkeley Software Distribution),它的特殊之处在于它第一个将网络引入到操作系统中,使得网络协议(TCP/IP)的支持成为了Unix的一个标准,为之后因特网的发展中,基于Unix的服务器统治整个市场打下了基础。

由于很多厂商,机构都发布了自己的Unix版本,这就带来了一个兼容的问题,不同的Unix版本提供不同的功能,甚至同个功能又有不同的系统调用接口,这意味着开发者必须针对每一个版本编写自己的程序,这又是一件很痛苦的事情。为了解决这个问题,IEEE标准委员会展开了一个项目叫做POSIX(前三个字母表示Potable Operating System),主要根据当时最流行的两个Unix版本,一个是BSD,一个是AT&T原生的Unix (System V), 这个标准定义了所有Unix系统必须提供的一套库函数,开发者只要通过这些库函数就可以满足他们开发利用Unix系统的需要。当然,标准制定的过程肯定有很多冲突,这个过程也是挺有趣的,有兴趣的话可以自己再去了解一下。

讲了那么多Unix,终于要讲到Linux了。因为当时所有的Unix系统都十分庞大和复杂,很难用于学校教学目的,有位大学教授就根据Unix,又写了一个相似的简化了的系统,叫做Minix,它的内核只有1600多行C代码和800多行的汇编,这个东西出来之后同样受到了很多人的欢迎,不仅仅是学习,而且还移植了许多Unix的程序过来。随着它的发展,有人就希望原作者能够给这个系统内核增加更多的功能,但是作者为了保证这个系统的规模足够小,能够被学生在短时间理解,所有没有同意添加功能。于是一位芬兰的大学生Linus Torvalds又根据Minix重写了一个系统叫做Linux,支持了很多扩展功能如网络通信,其最为特殊的一点,也是它能取得现在这样的成功的一点是在与它的商业模式,它是一个开源的自由软件,意味着任何人都能够对它的代码进行研究,修改,由此创造了很大的活力,对这个有兴趣的可以查阅一些开源软件,开源协议方面的资料。

。。。本来说简单提一提的,想不到说了这么多,接下来还是正式进入Linux系统的所谓概述吧。

3Linux系统概述

首先通过一个简单的例子来引出一些概念,思考一下,当我们在shell终端里输入:ls,这个时候系统发生了什么?

我们知道ls是一个系统命令,可以列出一个目录里的文件列表,那么系统命令是什么,它是如何实现的?

熟悉linux的都知道,其实它是一个编译好的程序,就放在/usr文件目录里,这些程序叫做Core Utility Program, 那么这些程序又是如何来完成其相应的功能的呢?这里就涉及到了一些概念,如库函数,系统调用,内核模式,用户模式等。了解C语言的肯定对c库函数不陌生,我们的程序里经常都会有的scanfprintffopenfwritemalloc这些就是,通过使用这些函数我们可以进行I/O操作和内存管理等,这些库函数也就是前面讲linux历史时提到的POSIX的成果,但是这些函数又是如何完成其功能的呢?

没错,是通过系统调用,系统调用是操作系统内核的一种方式,具体是怎么实现的我也不知道,但是我们只要知道,我们的库函数内部是通过系统调用让系统的内核去控制内存,进程,还有I/O设备的管理就行,但是库函数又不完全等价于系统调用,因为有些库函数并没有进行系统调用,比如数学函数abssincos或是字符函数isnumisdigttolower这些,而前面提到的几个函数则有进行系统调用,它们之间的区别大概就在于有没有操作到内存,I/O,或是进程。而关于内核模式和用户模式,又有相关的进程的内核空间跟用户空间的概念,这些之后会再提到,我们现在只要知道,所有进行系统调用的操作都要切换到内核模式下完成,普通的操作则是在用户模式下运行即可。为什么要这样呢?简单地讲就是为了安全,这样做的话可以保证系统内核进行的所有操作都是系统本身定义的,而用户定义的操作都是在内核以外运行,这样即使用户的操作出了问题(恶意的或者无意的),那么系统的内核也不会受到很大的影响。

为了清晰地展示一下这些概念还有Linux内核的结构,还是上个图吧~

从上图我们可以看到那一大块的就是我们的操作系统,它位于计算机硬件的上层,支持了程序和硬件设备的交互,而整个操作系统内核又可以大致分成三个模块,分别为I/O,内存管理和进程管理。

Linux通过一个虚拟文件系统将所有的I/O设备都抽象成文件,即所有的I/O设备的输入输出都可通过文件的read/write操作完成,而不需要考虑它实际上是在操作硬盘,屏幕,键盘还是网卡,而内存模块负责虚拟地址空间到物理地址空间的映射,内存分页管理和缓存等,进程管理模块负责进程线程的创建和终止,进程调度和进程间通信。这三个模块之间相互依赖,支撑起了操作系统的所有功能,在后续的文章里会分别进行深入的介绍。(这样讲可能笼统了一点,再举个例子吧)比如当我们的程序要读取一个磁盘上的文件时,就需要访问到文件系统,而为了减少磁盘读取延迟,提高效率,一次读取就会读取一个block的数据然后保存在内存里,而在程序等待磁盘读取的过程中,为了提高CPU的利用率,系统又会调度其他进程在这个过程中运行,这就是它们之间一个简单的依赖关系,当然它们还有其他许多的依赖。

好了,作为第一篇博客写得实在有点长了,下次再继续吧~

 

http://www.cnblogs.com/benjamin-t/archive/2013/05/05/3060959.html

原创粉丝点击