如果你走入我们的内核之旅网站http://www.kerneltravel.net/ ,静下心阅读并动手实践,或许,流逝的时间,让你手捧沉甸甸的果实。 欢迎在讨论区http://www.lupaworld.com/bbs/forum-255-1.html提问。
如果你希望加入Linux内核学习圈,请到http://blog.chinaunix.net/group/group_1475.html
释义Linux内核(2)-Linux与其他类Unix内核的比较(1)
上一篇 /
下一篇 2007-07-08 23:12:14
/ 个人分类:释义Linux内核
查看( 5010 ) /
评论( 10 )
市场上各种类Unix系统在很多重要的方面有所不同,其中有些已经有很长历史,并且显得有点过时。所有商业版本都是SVR4 或 4.4BSD的变体,所有版本都趋向于遵循通用标准,诸如IEEE的POSIX (Portable Operating Systems based on Unix)和 X/Open的CAE (Common Applications Environment)。
QUOTE:
别小看这些标准,去了解一下吧
现有标准仅仅指定了应用程序编程接口(API)——也就是说,指定了用户程序应当运行的一个已定义好的环境。因此,这些标准并没有对一个内核内部设计施加任何限制(注2)。
QUOTE:
操作系统的标准和API,有时候容易混淆在一起,但其实很不一样,读者说说有什么不一样
为了定义一个通用用户界面,类Unix内核通常共享基本的设计思想和特征。在这一点考虑上,Linux和其他的类Unix操作系统是一样的。因此,阅读本书和研读Linux内核也有助于你理解其他Unix变体。
Linux内核2.4版的目标是保持与IEEE POSIX标准兼容。当然,这意味着在Linux系统下,花很少的力气,甚至不用对源码打补丁,就可以编译和运行目前的大多数Unix程序。此外,Linux包括了现代Unix操作系统的全部特点,诸如虚存,虚拟文件系统,轻量级进程,可靠的信号,SVR4 进程间通信,支持对称多处理器(Symmetric Multiprocessor,SMP)系统等。
QUOTE:
liuns的聪明就在于遵循了POSIX标准,使得Unix下的多年积累的程序变得醇香。Linux是新技术吗?适当的拿来主义加上一定的创新,就是一件新衣裳了
单独来说,Linux内核并不是十分创新的。当Linus Torvalds写第一个内核的时候,他参考了Unix内幕方面一些经典的书,比如Maurice Bach的《The Design of the Unix Operating System》(Prentice Hall, 1986)。实际上,Linux仍然对Bach的书(即System V4)中所描述的Unix基准有些偏爱。但是,Linux没有拘泥于任何一个特定的变体,相反,它尝试采纳了几种不同Unix内核中最好的特征和设计选择。
Linux到底与一些著名的商用Unix内核是如何竞争的,下面给予描述:
单块内核(Monolithic kernel)。
它是一个庞大、复杂的自己做(do-it-yourself)程序,构成几个逻辑上独立的成分。在这一点上,它是相当传统的,大多数商用Unix变体也是单块结构。(一个显著的例外是卡耐基-梅隆大学的Mach 3.0,它遵循微内核(microkernel)的方法。)
QUOTE:
关于Linux内核结构的疑问,在我们99年分析内核就进行了分析。原来,Linux采用了一种原始的结构方式,所谓的单块结构,就是我们所说的模块结构。整个内核就是一个大的模块,各个子系统就是一个个小模块,模块之间可以直接互相调用(如此简单的东西,曾困惑了我好长时间)
编译和静态连接的传统Unix内核。
大部分现代操作系统内核可以动态地装载和卸载部分内核代码(如设备驱动程序就是典型),通常把这种结构叫做模块(module)。Linux对模块的支持是很好的,因为它能动态地按需装载或卸载模块。在主要商用Unix变体中,只有SVR4.2和Solaris内核有类似特点。
QUOTE:
这一特点简直是太好了。内核就像一个大的圆球。对它的修改,如果,每修改一下,就编译一次,多麻烦。现在好了,你写一个驱动程序,你只需要把它编译成模块,然后插入到内核就好了
内核线程。
一些现代Unix内核,如Solaris 2.x和SVR4.2/MP,被组织成一组内核线程(kernel thread)。内核线程是一个能被独立调度的可执行上下文;也许它与用户程序相关,也许仅仅执行一些内核函数。线程之间的上下文切换比普通进程之间的上下文切换花费的代价要少得多,因为前者通常在同一个地址空间执行。Linux内核线程以一种十分受限的方式来周期性地执行几个内核函数;因为Linux内核线程不能执行用户程序,因此,它们并不代表基本的可执行上下文的抽象(这就是下面要讨论的议题)。
QUOTE:
solaris内核中,主体就是内核线程。所谓内核线程,其实就是运行在内核态能独立运行的函数。你自己也可以写内核线程了,所调用的函数都是内核函数,其运行在内核态,想想,效率有多高
多线程应用程序支持
大多数现代操作系统在某种程度上都支持多线程应用程序,也就是说,这些用户程序是根据很多相对独立的执行流来设计的,而这些执行流之间用共享应用程序的大部分数据结构。一个多线程用户程序由很多轻量级进程(lighweight process,LWP)组成,这些进程可能对共同的地址空间、共同的物理内存页、共同的打开文件等等进行操作。Linux定义了自己的轻量级进程版本,这与SVR4、Solaris等其他系统上所使用的类型有所不同。当LWP的所有商用Unix变体都基于内核线程时,Linux却把轻量级线程当作基本的可执行上下文,通过非标准的系统调用clone( )来处理它们。
QUOTE:
LWP是solaris中的概念。其实在Linux内核中,不太区分线程和进程
非抢占式(nohpreemptive)内核。
Linux2.4不能随意地交错执行处于特权模式下的执行流(注3 )。内核中的若干代码段假定它们能够运行和修改一些数据结构,无须担心被中断,也无须担心让另一个线程改变这些数据结构。通常,完全抢占式(preemptive)内核总是与专用实时操作系统有关。当前,在传统通用Unix系统中,仅仅Solaris 2.x和Mach3.0是完全的抢占式内核。SVR4.2/MP引入一些固定抢占点(fixed preemption points)作为一种获得有限抢占能力的方法。
QUOTE:
Linux2.4已经是抢占式的了。抢占就会产生打架。所以,2.4要简单些了
多处理器支持
几种Unix内核变体都利用了多处理器系统。Linux 2.4支持对称多处理器(SMP): 系统不仅可以使用多处理器,而且任何一个处理器可以处理任何一个任务,任务之间没有任何区别。尽管通过一个单独的“大内核锁”使得内核中的少数代码依然串行执行,但公平地说,Linux2.4接近优化使用SMP。
QUOTE:
Linux内核源代码中,有大量的代码是处理SMP的。如果你的系统不需要处理SMP,那代码要简化不少
文件系统。
Linux标准文件系统呈现出多种风格。如果你没有特殊需要,就可以使用普通的Ext2文件系统。如果你想避免系统崩溃后冗长的文件系统检查,就可以切换到Ext3。如果你不得不处理很多小文件, ReiserFS文件系统可能就是最好的选择。 除了Ext3 和ReiserFS,还可以在Linux中使用另外几个日志文件系统,即使它们没有包含在香草Linux树中;这些文件系统包括IBM AIX的日志文件系统(Journaling File System,JFS)和SGI公司Irix系统上的XFS文件系统。有了强大的面向对象虚拟文件系统技术(出自于Solaris和SVR4),把外部文件系统移植到Linux就变得相对容易。
QUOTE:
Linux的文件系统完全继承了Unix的技术风格,精简而又别具一个。Unix在二十多年前所设计的文件系统,不管是安全还是支持网络方面,依然独领风骚。
流(STREAMS)。
尽管在现在大部分的Unix内核内包含了SRV4引入的I/O流子系统,并且已变成编写设备驱动程序、终端驱动程序及网络协议的首选接口,但是Linux并没有与此类似的子系统。
注2:实际上,一些非Unix操作系统(如Windows NT)也是POSIX兼容的。
注3:这种限制已经从Linux2.5开发版中删除。
[
本帖最后由 陈莉君 于 2007-7-9 11:11 编辑 ]
论坛模式
推荐
收藏
分享给好友
管理
TAG:
-
eccony发布于2007-07-09 03:24:28
-
大家非常感谢,陈老师说干就干,抽出宝贵时间给大家无偿讲解linux内核!!!
-
陈莉君
发布于2007-07-09 03:25:25
-
大家参与进来呀。一个人在路上,少了交流的快乐了
-
黄富强
发布于2007-07-09 05:57:48
-
随着基于LINUX内核的操作系统的不断涌现,操作系统的构建标准和应用环境标准显得相当重要,自由也要有规范,否则,发展会出现倒退现象,处理不好会影响它的发展。
-
黄富强
发布于2007-07-09 06:00:19
-
POSIX有待厂商的真心支持,POSIX的标准规范能力有待提升。
利益与标准要融合,从战略的角度讲,二者是共生体。
市场准入机制,国家标准。
[ 本帖最后由 黄富强 于 2007-7-9 18:13 编辑 ]
-
黄富强
发布于2007-07-09 09:53:20
-
To Linux, a thread is just a special kind of process.
-
yyfiby发布于2007-07-09 11:07:16
-
太好了~~~
找到组织了~~~~
-
fluke
发布于2007-07-09 13:47:39
-
操作系统标准,是对系统调用的定义--就是对用硬件实现功能的封装,而api是对系统调用的封装,这样对吗?
clone()貌似也是用的do_fork,不过比fork()用的时候,多了一些参数,定义共享空间。这样就不要复制页面内容了。
-
陈莉君
发布于2007-07-09 22:27:28
-
Linux的应用编程接口(API)遵循了在Unix世界中最流行的应用编程接口标准——POSIX标准。POSIX标准是针对API而不是针对系统调用的。判断一个系统是否与POSIX兼容要看它是否提供了一组合适的应用编程接口,而不管对应的函数是如何实现的。事实上,一些非Unix系统被认为是与POSIX兼容的,是因为它们在用户态的库函数中提供了传统Unix能提供的所有服务。
应用编程接口(API)其实是一个函数定义, 比如常见的read()、malloc()、free()、abs()函数等,这些函数说明了如何获得一个给定的服务;而系统调用是通过软中断向内核发出一个明确的请求。
API有可能和系统调用的调用形式一致,比如read()函数就和read()系统调用的调用形式一致。但是,情况并不总是这样,这表现在两个方面,一种是几个不同的API其内部实现可能调用了同一个系统调用,例如,Linux的libc库实现了内存分配和释放的函数malloc( )、calloc( )和free( ),这几个函数的实现都调用了brk( )系统调用;另一方面,一个API的实现调用了好几个系统调用。更有些API甚至不需要任何系统调用,因为它们不需要内核提供的服务,如计算整数绝对值的abs()函数。
从编程者的观点看,API和系统调用之间没有什么差别,二者关注的都是函数名、参数类型及返回代码的含义。然而,从设计者的观点看,这是有差别的,因为系统调用的实现是在内核完成的,而用户态的函数是在函数库中实现的。
-
黄富强
发布于2007-07-10 03:15:00
-
Compliance with the latest POSIX standard is the highest goal to achieve source code compatibility with other platforms. This does not mean that extensions beyond the POSIX specification are not added.
-
fluke
发布于2007-07-10 04:37:50
-
陈老师的解释已经很明白了

谢谢!