当前位置: 首页 >> 开源操作系统 >> Solaris,Linux和FreeBSD内核比较
 

Solaris,Linux和FreeBSD内核比较

作者:      来源:zz     发表时间:2006-07-14     浏览次数:      字号:    

转自:
http://tech.ccidnet.com/art/322/20060321/485291_1.html

1。我个人认为作者MAX对Linux的了解不像他对Solaris那样深入,我不知道也没法知道他的下列关于Linux的内容来自自己的代码阅读分析还是只是来自第三方的文档资料而未经自己实地验证;
  2。我已经尽量符合原意地翻译了,当然中间实在忍不住的地方也插两句自己的话;
  3。无论是只阅读这一篇文章,还是看其他东西,我都觉得,保持自己头脑清醒很重要;
  4。谢谢

  Max Bruning 是一名教师/资讯专家,他的教授内容包括Solaris内部组织,设备驱动,内核和应用的crash分析及调试,网络组织和其他一些特定科目(他的 blog在blogspot,不费点劲可能访问不了,所以也可以看看www.bruningsystems.com)。

  在解释这些子系统在Solaris中是如何实现的时候,他的学生们总会问“Linux里它是怎么工作的?”或者“FreeBSD里是这样,Solaris里呢?”这种经历最终让Max在OpenSolaris网站写了这篇A Comparison of Solaris, Linux, and FreeBSD Kernels。

  文章里讨论了调度,内存管理和文件系统架构--这3个子系统在任何操作系统中都有普遍应用,而且他们是最well-understood 的组件。

  目前很多分析或对比文章所引用的材料及代码都比较老,与现实脱节,Max推荐如下几个多少比较up to date的网站:
Solaris Vs. Linux
Comparing MySQL Performance
Fast Track to Solaris 10 Adoption
Solaris 10 Heads for Linux Territory

  其实抛开3个系统之间的差别,他们也有很多相似之处。除了那些不同的命名习惯,这些OS在实现不同概念的时候采用了非常相似的方法。他们都支持线程的分时调度,支持最近未使用页面替换算法实现请求调页,支持虚拟文件系统层允许不同文件系统架构。这个系统里的一个好概念在另一个系统里也会采用。比如 Linux也接受并实现了 Solaris slab 内存分配算法的概念。FreeBSD 代码里的很多术语在Solaris里也出现了(快去看看代码。。。)。考虑到这3个系统的源代码都能得到了, fxr.watson.org提供了系统源码的交叉阅读浏览,可能会发现很多有趣的地方。

  好了,温情默默的套近乎结束,进入正题。

  调度和调度器
  Solaris的调度单位是kthread_t,FreeBSd是thread,Linux是task_struct。抬高一级,Solaris的进程是proc_t,当然每个进程里的线程就是kthread_t;Linux的进程和线程都由task_struct 表示,单线程的进程在Linux里是一个task_struct。单线程的进程在Solaris里有一个proc_t,一个kthread_t,还有一个klwp_t表示。klwp_t提供了用户和内核模式线程切换的存储区。FreeBSD里的单线程进程有一个proc ,一个thread 和一个ksegrp 。ksegrp 是“内核调度的实体组kernel scheduling entity group”。三个系统的线程表示结构不同,不过都支持调度线程。

和大家熟悉的基本一样,调度是基于优先级的。小小的数学问题是,在Linux和FreeBSD里,数字越小,优先级越高;而SUN的宝贝却喜欢数字越大,优先级越高。参考下表


图片附件: schedule.png (2006-7-1 23:20, 17.07 K)



  三个系统都更推崇interactive 线程/进程(下面会提到interactive怎么回事)。Interactive 线程比compute-bound 线程优先级要高,不过得到的时间片要少一些。Solaris,FreeBSD和Linux都使用每CPU的“运行队列 runqueue”。FreeBSD和Linux有一个active队列和一个expired队列。名字说得很清楚了--系统从active上按照优先级选择线程进行调度。用完自己时间片的线程就从active搬到expired上(或者为了避免“饿死”的其他情况),active空以后,内核交换 active和expired。FreeBSD还多一个idle 队列--其他两个queue都空的时候才轮到这个。Solaris的概念是每CPU“调度队列 dispatch queue”。线程用完时间片后,内核给其一个新优先级然后放回调度队列。所有3个系统的runqueue,对不同优先级的可运行线程都分别有链表。

  FreeBSD四个优先级共享一个链表,Solaris和Linux则每个优先级一个链表Linux和FreeBSD结合运行时间和睡眠时间计算线程的 interactive-ness,Solaris查表。他们都不支持“gang scheduling”(有兴趣查Google即知,并行计算上的调度算法,大白话说就是一组任务一把disptach到各个CPU上。劳伦斯.利弗莫尔那帮造原子弹的家伙最喜欢了,他们有世界上最昂贵的玩具,可以理解)每个OS都调度下一个线程而不是N个线程开始运行。这3个OS都有利用CACHE (warm affinity)和负载均衡的机制。对超线程CPU,FreeBSD能尽量将多个线程保持在一个CPU节点上(当然可能是不同的CPU超线程上)。 Solaris也有类似机制,不过是在用户和应用的控制下,而且并不限于CPU的超线程,他们的术语是processor sets,FreeBSD的叫法是processor groups和其他2个OS最大的不同是,Solaris同时支持多个“scheduling classes”。3个OS都支持POSIX的SCHED_FIFO,SCHED_RR和SCHED_OTHER (或者SCHED_NORMAL)。SCHED_FIFO 和SCHED_RR通常支持实时线程(我不同意。。。但是照翻。。。)。

[1] [2]

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •