Linux内核是可重入的,这意味着几个进程可能同时在内核模式下执行。(当然单处理器系统,在某一时间只会有一个进程执行,但许多会阻塞在内核模式)这些进程会分时共享CPU、I/O设备等系统资源,给用户的感觉就像是在同时运行。

提供可重入代码的方法:

编写的函数都只会影响到局部变量,而不能改变全局的数据结构。这样的函数称为可重入函数。但由于有些需要访问I/O设备等共享资源,所以内核还要有不可重入函数。可重入内核不仅仅局限于这样的可重入函数,相反,可重入内核可以包含非重入函数Linux使用锁机制,来保证在某一时间内只有一个进程可执行该不可重入代码,也就是分时共享的办法,来实现可重入的内核。

在中断处理例程中,不应该有不可重入代码,因为不可重入代码会导致处理流程等待,进而导致中断不能得到及时的处理,甚至很容易导致系统死锁而代码得不到进一步的执行。中断处理例程除了可以被更高优先级的中断暂时中止,它应该能被顺序地执行完。

异常处理例程、中断处理例程,以及这些例程的嵌套,当它们中止其他内核控制进程时,是不会改变进程执行上下文的,也就是只有当进程处于用户态时,才会保存被中止进程的状态。

如果一个硬件中断发生,可重入内核挂起当前正在执行的进程,即使这个进程处于内核态。这种能力是非常重要的,因为这能提高发出中断的设备控制器的吞吐量。一旦设备已发出一个中断,它就一直等待直到CPU响应。如果内核快速响应,设备控制器在CPU处理中断时就能执行其他任务。

实现可重入内核的一个关键技术就是同步技术。如果内核控制链路,因对一内核数据结构访问而被阻塞,则是不允许其他内核控制路径对同样的数据结构进行操作,否则,两个控制路径会破坏该存储的信息,导致内核控制链路路径执行不确定。

Linux 可重入内核的更多相关文章

  1. linux可重入、异步信号安全和线程安全

    一 可重入函数 当一个被捕获的信号被一个进程处理时,进程执行的普通的指令序列会被一个信号处理器暂时地中断.它首先执行该信号处理程序中的指令.如果从信号处理程序返回(例如没有调用exit或longjmp ...

  2. Linux可重入函数和线程安全的区别与联系(转)

    *****可重入函数 函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入. 当程序运行到某一个函数的时候,可能因为硬件中断或者异常而使得在用户正在执行的代码暂时终端转而 ...

  3. linux: 可重入函数与不可重入函数

    1. 可重入函数与线程安全 摘自 多线程和多进程的区别(小结) http://blog.csdn.net/hairetz/article/details/4281931 要确保函数线程安全,主要需要考 ...

  4. [Linux]不可重入函数

    一.概述 怎么会有可重入和不可重入. 在多任务系统下,中断可能在任务执行的任何时间发生:如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是 ...

  5. (转载)可重入函数(reentrant function)

    (转载)http://blog.163.com/xu_jin_rong/blog/static/1491966220086775017178 由于cublog系统的缘故,将前段时间写的一篇blog文章 ...

  6. 可重入锁 & 自旋锁 & Java里的AtomicReference和CAS操作 & Linux mutex不可重入

    之前还是写过蛮多的关于锁的文章的: http://www.cnblogs.com/charlesblc/p/5994162.html <[转载]Java中的锁机制 synchronized &a ...

  7. 三十三、Linux 进程与信号——中断系统调用和函数可重入性

    33.1 中断系统调用 进程调用 “慢” 系统调用时,如果发生了信号,内核会重启系统调用. 慢系统调用 可能会永久阻塞的系统调用 从终端设备.管道或网络设备上的文件读取 向上述文件写入 某些设备上的文 ...

  8. linux系统编程之信号(四):alarm和可重入函数

    一,alarm() 在将可重入函数之前我们先来了解下alarm()函数使用: #include <unistd.h> unsigned int alarm(unsigned int sec ...

  9. 【Linux】可重入函数和线程安全的区别与联系【转】

    转自:http://blog.csdn.net/scenlyf/article/details/52074444 版权声明:本文为博主原创文章,未经博主允许不得转载. *****可重入函数 函数被不同 ...

随机推荐

  1. java反射 顺序输出类中的方法

    java反射可以获取一个类中的所有方法,但是这些方法的输出顺序,并非代码的编写顺序. 我们可以通过自定义一个注解来实现顺序输出类中的方法. 首先,先写一个类,定义增删改查4个方法 public cla ...

  2. thinkphp中的钩子_什么是钩子?

    讲到插件,不得不讲钩子.首先,我们之前说明了插件是一个扩展的功能实现. 既然是扩展的,那么就要很灵活.可复用,并不是像我们之前开发项目,一个功能实现了,就写死在代码里了. 项目其他地方要用了,怎么办, ...

  3. 白话讲session

    什么是session Session一般译作会话,牛津词典对其的解释是进行某活动连续的一段时间.从不同的层面看待session,它有着类似但不全然相同的含义.比如,在web应用的用户看来,他打开浏览器 ...

  4. 对类对象使用new时地址分配的情况

    我们知道,string类内部的构造函数是采用new来分配地址的.当创建对象时,会调用string的构造函数,从而实质上也使用了new.那么问题来了,如果我用new再创建一个string类型的指针呢?下 ...

  5. java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制

    ClassLoader的工作机制 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有Bootstrap ClassLoader. ...

  6. 初步了解asp.net运行机制

    客户通过客户端浏览器输入url地址请求资源,服务器接收到客户端请求,首先为http请求分配应用程序池,然后在应用程序池中创建请求需要的管道,这个管道对http请求的各个步骤进行了分配. 当用户第一次请 ...

  7. MYSQL和JAVA(课堂笔记)

    MYSQL 数据库管理工具 JAVA  编程语言 数据库驱动(JAVA和MYSQL对接方式) 到官网上下载驱动 加载驱动 import java.sql.Connection;import java. ...

  8. 天气正好,hello world!

    两个多月,稀里糊涂的回来了,内心很迷茫,回来一周了,明知道还需要有一大堆东西需要去学,但是却找不到之前学习的状态,在寝室,在实验室,看着自己一向不喜欢的电视剧,无目的的逛着淘宝,刷着头条和知乎,就这么 ...

  9. SQL Server AG集群启动不起来的临时自救大招

    SQL Server AG集群启动不起来的临时自救大招 背景 前晚一朋友遇到AG集群发生来回切换不稳定的情况,情急之下,朋友在命令行使用命令重启WSFC集群 结果重启WSFC集群之后,非但没有好转,导 ...

  10. Codility---MaxProfit

    Task description A zero-indexed array A consisting of N integers is given. It contains daily prices ...