操作系统第二课(二)—数据结构基础

人类的繁衍是永恒的话题,“我从哪里来,要到哪里去”,没有人能回答这个问题。如果把人类的衍生过程画出一颗树,这是一颗找不到根而叶子无尽长下去的树。计算机,或叫者电脑,虽然远比不上人的大脑,但现实世界的种种,都可以在计算机世界中找到影子,或者,现实世界中任何事或者物,要用程序来描述,就必须把其抽象成计算机世界中一种数据的表达形式。比如,现实中的很多数据关系都可以用数据结构中的树来表示,只是,为了简化问题的处理,常常把现实中一颗枝繁叶茂的树修剪成一颗可掌控的二叉树。

  比如,操作系统中,进程这一核心对象用进程控制块(PCB)这样的数据结构来描述。而进程的诞生完全就是人出生过程的翻版。除了1号进程init,每个进程都有生养他的父亲(与人类稍有不同,没有母亲),也有兄弟和儿孙。这样,我们用一颗树就足以把生生死死动态变化着的进程描述出来。除此之外,也可以用数组描述系统中的多个PCB的组织。而根据进程的状态不同,可以把其PCB组织成不同的链表。可以看出,一个数据结构几乎动用了几乎所有的数据组织方式。其中,在数组之外的其他数据结构,都以涉及到指针和链表,这就使得程序的复杂度陡增。

  如何降低对各种数据结构操作的复杂度,隐藏指针的出现,在我的博文Linux内核代码-链表衍生中,说明了双向链表双是演化各种数据结构的基石。通过前趋(prev)和后继(next)两个指针域,就可以从两个方向遍历双链表,这使得遍历链表的代价减少。如果打乱前驱、后继的依赖关系,就可以构成"二叉树";如果再让首节点的前趋指向链表尾节点、尾节点的后继指向首节点,就构成了循环链表;如果设计更多的指针域,就可以构成各种复杂的树状数据结构。
   
如果减少一个指针域,就退化成单链表,如果只能对链表的首尾进行插入或删除操作,就演变为队结构,如果只能对链表的头进行插入或删除操作,就退化为栈结构
  
操作系统的第二讲中,对操作系统的历史从宏观上做了一定介绍后,把学生从历史拉入到现实,给出Linux内核实现中一些最基本的东西,于是,把“Linux内核代码-链表实现 进行了详细讲解。 而对“Linux内核代码(三-链表应用”的内容,要求学生自己去阅读。

  课后,收到王伟学生发来的邮件

  “陈老师:

       您好,这是我用修改后的list.h写的一个关于约瑟夫问题的程序。在gcc 4.3.3中编译调试通过。

       在写这个程序的时候,首先看了下http://lxr.linux.no/linux+v2.6.27.9/include/linux/list.hlist.h的实现。然后从网上下了个修改后list.h(附件中),接着开始下手写程序,结果出现了很多问题。比如list_for_each_entry()+list_del()这两个函数吧,我在销毁链表的时候,使用了这两个函数,结果发现程序出错。然后在网上查找了下,看到了您写的linux内核代码赏析与应用中关于链表API的应用,才发现问题出现在哪。在我的程序中改成了list_for_each_entry_safe()list_del()来解决此问题。然后在IBM社区看到一篇关于list.h应用的很好的文章(深入分析linux内核链表),http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html虽然其只是讲了这些应用接口的应用,而没有很仔细地去分析其源代码,但其确实不失为一篇很值得推荐的文章。接着,带着这些基础,我又去读了list.h的源代码,感觉对其又有了更进一步的了解。

        花了一个晚上的时间去分析其源代码,却还是感觉只学了些很皮毛的东西。虽然基本上能读懂其意思,但是还是挺感慨这些编写内核的牛人的,要是换了我去写这些东西,先不论bug和效率,光是代码的美感就要差上很多。非常感谢陈老师推荐了这么好的东西,希望以后还能多推荐一些诸如这样的好东西。(呵呵,好像有点贪心了^_^

    本是要把程序贴出来的,但是,为了发挥大家的主动性和积极性,还是希望自己动手写出代码来。

约瑟夫环问题描述:

游戏规则:已知n个人(以编号123...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值