linux 设备驱动程序开发 第3版_Chapter2_Cconcurrency in th...

对并发的处理是内核编程和普通应用程序之间的一个很大的不一样。大多数的应用程序,除了多线程 的应用程序外,基本上都是从头至尾顺序的执行,没必要担忧其余事情的发生致使应用程序的运行环境 发生变化。内核代码的运行环境不像应用程序那么简单,即便是最简单的内核模块在编写时也要考虑 【同一时刻,可能会有许多事情正在发生】。编程

内核编程的并发主要有如下几个缘由引发,首先,Linux系统是运行在多个进程,同一时刻可能会有不止一个进程在调用你的驱动程序。其次,大部分的设备均可以使处理器中断;而中断处理程序是 异步的,它有可能在驱动程序处理其余任务时被调用。另外,若干种的软件抽象(例如内核时间)也 是异步运行的。还有,Linux能够运行在对称多处理器系统上,这样你的驱动程序可能会在多个CPU 上并发执行。最后,2.6版本的内核代码是可抢占的,这意味着即便是单处理器系统也会像多处理器 那样会有不少的并发问题。 因此,Linux的内核代码,包括驱动程序,都必须是可重入的------它必须保证可以同时正确运行在 多个上下文中。为了正确保证多个线程分开执行,数据结构必须很是当心的设计,并且,访问共享数 据的代码必须避免破卡共享数据。要写出处理并发而且避免竞态(【不一样的执行顺序致使不一样的,非 预期结果的发生】)的代码是要花一些心思的。在编写内核代码时必需要有恰当的并发处理。由于这 个缘由,本书中的全部驱动程序的例子都考虑了并发,这些会在后续章节中进行介绍。第五章还会专 门讨论并发的问题以及内核中用于并发处理的原语。数据结构

编写驱动程序时每每会犯下面的错误,认为只要代码中的某一段没有进入睡眠状态或者阻塞状态, 那就不会有并发的问题。在2.6版本的内核中,不能保证某一段代码能独占处理器。若是在编写代码 时没有考虑并发,将有可能会致使灾难性的后果而且很是难以调试。多线程

相关文章
相关标签/搜索