Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2034904
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类: LINUX

2006-07-13 22:47:01

内核的执行体,可以理解为内核执行的一个任务,这个任务可以为IRQ,SoftIRQ,进程等,他在内核中有一个执行路径,也就是这个执行体的生存期。
用户空间和内核空间:一般的应用程序都是以进程的形式运行在用户空间的,当然他的权限也是及其有限的,如果他想执行一些“越权”操作,那么他只能以系统调用的形式向操作系统内核发出请求,有操作系统代理其完成特定的功能,并返回请求结果。当进行系统调用时虽然进程进入内核空间,进程进入内核态,但是他仍然属于一个执行体,只不是所处的位置发生了变化,状态发生了改变。呵呵,小样,穿上马甲我们应该照样认得他!
内核线程:Linux的内核线程实际上是一个和内核共享数据空间的进程,他除了具有一般进程所有特性外,还享有直接访问内核数据和内核导出的函数的能力,可以说你可以在内核线程里面为所欲为!
澄清了以上概念,我们分析一下内核执行体的类别:
内核执行体按照运行的上下文(context)的不同可以分为三种:
  1. 硬中断(IRQ):当硬件向CPU发出中断请求时,操作系统将调用事先注册好的中断服务程序(ISR),这个中断服务程序将运行于中断上下文(Interrupt contex)。比如说时钟中断!
  2. 软中断(SoftIRQ):由硬件引发的中断称为硬中断,顾名思义软中断就是由软件引发的中断了。既然有了硬中断,那么为什么还要引入软中断呢?这个问题和既然有了CPU内部的缓存为什么还要配置内存的道理是一样的。因为有些东西的开销是相当大的,如果多几个不同级别的缓冲,势必会提高效率。软中断就可以理解为硬中断的“缓冲”。比如说网络数据包因为其处理过程比较耗时,为了提高数据包的接收效率,接收分为硬中断和软中断两部分。硬中断部分把从网卡接收来的数据包放到一个特定的队列上,然后尝试触发软中断,在软中断的处理过程中完成数据包的接收。软中断迷人的一点还在于他工作在中断打开的条件下,所以即使已经进入软中断的处理过程,内核还是能够响应网卡的硬中断的,也许软中断的优势就在于此吧!广义的软中断又可以分为三类:狭义的软中断,内核定时器和小任务(Tasklet)。他们和硬中断一样运行于中断上下文,不过是相应的硬中断仍然是打开的。
  3. 进程:这类程序大家再熟悉不过了,只需要指出他们是运行于进程上下文(Process contex)。
内核执行体的优先级:
  1. 硬中断(IRQ)
  2. 高优先级软中断(HI_SOFTIRQ)
  3. 网络发送软中断(NET_TX_SOFTIRQ)
  4. 网络接受软中断(NET_RX_SOFTIRQ)
  5. SCSI软中断(SCSI_SOFTIRQ)
  6. 小任务软中断(TASKLET_SOFTIRQ)
  7. 进程(Process)
编程时的注意事项:
我们可以将中断处理函数类比于用户空间程序的信号处理函数,所以应用于程序设计时的和信号处理函数避免竞争的一些基本原则对于内核中的硬中断和软中断与一般进程的关系同样适用。需要特别指出的是软中断处理程序运行时硬中断仍然打开,所以在一些必要的情况下,我们也许需要关闭硬中断。另外,内核线程可以主动调用schedule将CPU让给其它执行体执行,而自己进入睡眠状态;但是,处于中断上下文的内核执行体因为处于原子上下文(沿袭LDD的说法),而不能睡眠。同样当执行体拥有自旋锁时也是不可调度的,我们的内核开发者已经为我们想得足够周到,自旋锁加锁的时候就已经关闭了内核抢占。
参考资料:

阅读(1579) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~