• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

对内核重入的理解

发布: 2007-7-04 12:06 | 作者: admin | 来源:  网友评论 | 查看: 12次 | 进入软件测试论坛讨论

领测软件测试网
  作者:lucian_yao
  下面是我的理解,不知道对不对。
  首先要界定一个范围(代码段,函数)然后才可以讨论重入。
  比如以函数A,B分别为一个范围。在运行A的时候发生中断,调用B,B运行完了又返回A,这个时候称B进入A.
  如果A=B,那么称A重入A,或者可以说有两个A的实例在运行。
  重入导致的问题主要就是由于这两个A可以会几乎同时访问一些堆中的变量而出现不一致。解决这个问题的办法有几个:
  干脆不允许某个函数(某段代码)重入,也就是如果A运行,当发生中断的时候,调用A,发现已经有A运行了,则返回,不再运行这个新的A.bottom half采用这个办法。
  或者对一些临界区上锁。
  或者干脆关中断。
  内核的重入,首先界定的范围就是整个处于内核级的代码段。
  因此,内核的重入可以说是经常发生的,比如中断发生时。
  内核的重入有两种情况:
  1与进程无关的中断发生时,CPU已经在内核中运行,也就是中断嵌套。一般内核会做一定的保护,比如关中断,锁临界区等。但是这种中断有一个特点,就是先进后出的栈的模式,因此,用一个栈足矣。
  2与进程相关的切换。如果总是在内核返回到用户级代码段时才切换,那么这个意义上的重入就不存在,用一个内核栈就可以了。还有一种可能是在内核中就切换,由于进程执行并不是按照先进先出的模式,因此,每个进程都有一个内核栈。
  还有一个问题,上面与进程无关的中断一般访问与进程无关的数据,所以需要保护的数据比较少。在这种重入中,几个进程的内核实例会访问与进程相关的共有数据,会导致不一致,而这种临界区会比较多,所以上锁可能会比较麻烦,Linux采用的是一种非透明的切换,即当前进程的内核部分必须主动放弃CPU,才可能切换。这样使内核同步比较简单。所以Linux内核的重入是一定条件下的重入,非抢占式的重入。
  现在有人给Linux打了个补丁,使得它成为抢占式的内核(见新闻版)。也许看了这个补丁,会对内核的重入有一个更深入的认识。
  
  
  

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网