首先看一个问题:
Linux has both find_vma_prev and find_vma routines. find_vma_prev returns both the current and previous VMAs. Therefore, find_vma could be written as a simple layer routine over find_vma_prev that discards the pointer to the previous VMA. Give one reason why Linux goes to the trouble of providing two separate full-blown routines.
那么问题的答案是什么呢?如果按照应用程序的编程观点,能封装的就封装,能重用的尽可能重用,linux内核的设计就是一种糟糕的设计,根本不符合应用程 序的设计原则,其实要明白内核的设计和应用的设计在原则上是根本不同的,比如应用程序能利用丰富的异常处理机制,几乎每个编程语言都有这样的机制,最著名的莫过于try-catch块了,但是到了内核一切都要小心翼翼,为何对内核这样苛刻呢?原因有:1.内核根本就不是让用户用的;2.内核在原则上不能占 用太多的资源;3.内核的开发者默认都是非常有实力的;4.内核的作用是非常不灵活的,它存在的意义就那么几点:内存管理;进程管理;文件管理;...管 理。从这几点原因来看内核根本不能被娇惯,反过来说应用程序却是被内核娇生惯养的,内核要帮忙处理应用程序自己处理不了的错误(谁能帮内核处理呢?难道硬件吗?),应用程序的开发者鱼龙混杂,比如我就是一个菜鸟,另外应用程序的内容十分丰富,逻辑有的十分复杂,各个应用之间的差别非常之大(比如cpu消耗 型和io消耗型,大型人工智能程序和web服务器。内核呢?windows和linux包括unix的机制并没有多大不同,都是向上提供那么几种服务,向 下与硬件接口,只是实现不同罢了)。因此不要用应用程序的原则来要求内核。
既然知道了内核和应用的原则差别,那么开始的问题就比较好回答了,内核在非必要情况下绝对不会提供冗余函数,具体的冗余由用户应用程序来设置和重组,库函数经常这么干。这是为什么呢?用户程序强调维护,因此它过分强调接口,程序员只需要和接口打交道,这样我们编码的人就会更多的关注应用逻辑而不必关注接口 的实现,毕竟应用程序的卖点就是它的应用逻辑;但是内核就不同了,它就是一个二传手,可以说是一个代理,向上为用户展示了一个多道程序设计的机器,内部包含多个虚拟机器,并且管理着这多么台虚拟机,向下与硬件接口,将应用程序的要求转交给硬件,并代理硬件向应用程序传送结果,内核也就是这么多事情。举个例 子,我们都去过饭店,为我们服务的就是服务员,如果说哪家饭店的服务员比顾客多的话,那么多半是对这家饭店的侮辱,顾客应该比服务员多,而服务员的任务就是向上为顾客服务,向下与厨师接口,仅此而已。操作系统内核就是服务员,而应用程序就是顾客,厨师就是硬件,这个例子还算清晰。只要有个冗余,那么就要占 用一定的资源,好的内核根本不会也不允许其本身占用过多的资源,因此只要在内核中出现的函数就是必要的,非必要的冗余函数一定会被砍掉,因此问题中的 find_vma和find_vma_prev绝对是两个必要的函数,其功能是不同的,它们是不冗余的,下面就看一下它们:
struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr)
Linux has both find_vma_prev and find_vma routines. find_vma_prev returns both the current and previous VMAs. Therefore, find_vma could be written as a simple layer routine over find_vma_prev that discards the pointer to the previous VMA. Give one reason why Linux goes to the trouble of providing two separate full-blown routines.
那么问题的答案是什么呢?如果按照应用程序的编程观点,能封装的就封装,能重用的尽可能重用,linux内核的设计就是一种糟糕的设计,根本不符合应用程 序的设计原则,其实要明白内核的设计和应用的设计在原则上是根本不同的,比如应用程序能利用丰富的异常处理机制,几乎每个编程语言都有这样的机制,最著名的莫过于try-catch块了,但是到了内核一切都要小心翼翼,为何对内核这样苛刻呢?原因有:1.内核根本就不是让用户用的;2.内核在原则上不能占 用太多的资源;3.内核的开发者默认都是非常有实力的;4.内核的作用是非常不灵活的,它存在的意义就那么几点:内存管理;进程管理;文件管理;...管 理。从这几点原因来看内核根本不能被娇惯,反过来说应用程序却是被内核娇生惯养的,内核要帮忙处理应用程序自己处理不了的错误(谁能帮内核处理呢?难道硬件吗?),应用程序的开发者鱼龙混杂,比如我就是一个菜鸟,另外应用程序的内容十分丰富,逻辑有的十分复杂,各个应用之间的差别非常之大(比如cpu消耗 型和io消耗型,大型人工智能程序和web服务器。内核呢?windows和linux包括unix的机制并没有多大不同,都是向上提供那么几种服务,向 下与硬件接口,只是实现不同罢了)。因此不要用应用程序的原则来要求内核。
既然知道了内核和应用的原则差别,那么开始的问题就比较好回答了,内核在非必要情况下绝对不会提供冗余函数,具体的冗余由用户应用程序来设置和重组,库函数经常这么干。这是为什么呢?用户程序强调维护,因此它过分强调接口,程序员只需要和接口打交道,这样我们编码的人就会更多的关注应用逻辑而不必关注接口 的实现,毕竟应用程序的卖点就是它的应用逻辑;但是内核就不同了,它就是一个二传手,可以说是一个代理,向上为用户展示了一个多道程序设计的机器,内部包含多个虚拟机器,并且管理着这多么台虚拟机,向下与硬件接口,将应用程序的要求转交给硬件,并代理硬件向应用程序传送结果,内核也就是这么多事情。举个例 子,我们都去过饭店,为我们服务的就是服务员,如果说哪家饭店的服务员比顾客多的话,那么多半是对这家饭店的侮辱,顾客应该比服务员多,而服务员的任务就是向上为顾客服务,向下与厨师接口,仅此而已。操作系统内核就是服务员,而应用程序就是顾客,厨师就是硬件,这个例子还算清晰。只要有个冗余,那么就要占 用一定的资源,好的内核根本不会也不允许其本身占用过多的资源,因此只要在内核中出现的函数就是必要的,非必要的冗余函数一定会被砍掉,因此问题中的 find_vma和find_vma_prev绝对是两个必要的函数,其功能是不同的,它们是不冗余的,下面就看一下它们:
struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr)
{
本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274040