MOOC《Linux内核分析》——学习总结

来源:互联网 发布:淘宝用支付宝登录不了 编辑:程序博客网 时间:2024/05/16 16:57

许松原创,转载请注明出处。
Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000

为期8周的Linux分析课程结束了,此间写了几篇博文来记录学习过程。之前我一直作为读者来读各位大神的文章,但真自己写的时候又完全是另外一个样子了。作为一个之前几乎从不写技术文的菜鸟之作,大家可以很明显的看到这八篇文章都是一个路子:死板有余而灵性不足,试图面面俱到但火候欠缺。希望诸位在读本人文章的时候对本人拙劣的写作能力能够多加海涵,有意见还请不要保留(希望能在这篇文章的回复里面看到有用的建议)。(>_<)

下面是这八篇博文的链接以及简单介绍:

  1. 反汇编一个简单的C程序:通过对一段简单的C语言代码进行反汇编得到其对应的汇编代码并分析之,以了解C代码的执行过程。

  2. 进程切换初观:基于一个简单的时间片轮转多道内核代码,对Linux的进程切换过程进行简单的了解。

  3. start_kernel();Idle进程与Init进程:通过对start_kernel()函数的分析,来理解Linux中的0号进程、1号进程以及Idel进程是怎么来的。当时写这篇文章的时候完全抓不住重点……比我写的好大有人在,承蒙诸位评审抬一手给了5分评价,谬赞了。

  4. 使用库函数API与C代码嵌入汇编完成同一个系统调用:通过两种方式来调用同一个系统调用,初步理解系统调用的工作过程。

  5. 分析system_call中断处理过程:在第四篇的基础之上分析system_call的处理过程。

  6. 创建一个新进程的过程:通过fork系统调用创建一个新的进程并跟踪分析Linux内核创建一个新进程的过程。

  7. exec*系函数对应的系统调用处理过程:通过使用exec*函数在主程序中启动一个新的程序,跟踪此过程以理解exec*系列函数的执行过程,理解Linux内核是如何启动并让新程序运行起来的。

  8. 进程切换的过程:分析schedule()函数的执行过程,理解Linux是如何进行进程调度以及切换的。

八篇博文列出来之后这么一看,原来觉得还算有点内容的东西实际上如此单薄……但既然是总结,那就必须得在这些看起来单薄的内容上压榨出来点什么:将每篇文章再总结一次无疑是无聊和无意义的,那就换个角度来提两个问题吧:

  • 实际工程中为什么会有Memory Pool 和 Thread Pool?
  • 为什么大家都喜欢epoll?

其实两个问题的答案都一样:因为比较快。但是如果问的更加深入一点——为什么这样做会比较快?——怎么回答?

对于第一个问题,在学习完这八周的课程之后应该很好回答了:资源的创建需要时间,而且每次创建资源使用的系统调用会使得程序进行用户态-内核态的切换,这同样也是很花费时间的。于是很自然的,一次性通过少数几次的系统调用来分配一定量的资源,等到需要的时候直接在用户态申请就可以了。这样可以避免程序频繁进行系统调用带来状态切换的开销,从而提高程序的运行效率。如果继续扯“预先分配的资源不足的话怎么办”还能扯到算法分析中的摊还分析——呃,离题太远,就当我是在吹牛好了。

对于第二个问题,很遗憾我不能在这篇文章中给出具体的回答了。原因很简单,没有分析就没有发言权,我所知的一点皮毛在相关源码剖析面前一文不值(大家可以看一下知乎上类似问题以及回答)。

自己提了一个自己回答不上来的问题,这不打脸么?我个人以为学东西就是一个自虐的过程,所以这当然是在打自己的脸——然而自己打总比别人打来得好,至少下手能轻一点。这里提这个问题的主要目的在于说明这门课究竟为我带来了什么,仅仅在于那几篇文章里面的结论么?当然不。

侯捷先生有言:“源码面前,了无秘密”。回过头看这门课的内容,它真正做到了授之以渔:如何根据自身需要去着手分析Linux内核。感谢这门课程和孟老师给了我面对Linux内核的信心,它之于我不再是遥不可及不可撼动,那本《深入理解Linux内核》也不再那么令人惊悚了,甚至有时候自我感觉良好还能对着自己那本积了灰尘的《Windows内核原理与实现》起点非分之想——当然,贪多不化,量力而行,小子这点自知之明还是有的。另外,谢谢自己选课时的偏执,没有在最后关头弃了这为我打开了另外一扇门的课程。遗憾的话——或许是我眼界不够,认识不足——唯一的遗憾是这门课程少了一点实际应用,配个小项目之类的供有兴趣的筒子们继续深化就更好了。

PS:文章貌似没有严格按照要求来写——有感而发,著而成章;理科生文笔,咄。

0 0
原创粉丝点击