可重入内核 & 可重入函数

可重入内核在ULK(深入理解linux内核)中的定义是指若干个进程可以同时在内核态下执行,也就是说多个进程可以在内核态下并发执行内核代码。在单处理器上,只能实现
微观上的串行,宏观上的并行,即任意时刻,只有一个进程真正执行,其他进程处于阻塞或者等待状态。这里的可重入,是指可以多个进程进入内核,并不是重复/重新进入内核
对于linux来说,可重入内核代码包含可重入函数和非可重入函数。
可重入函数是指运行时只改变局部数据结构,不改变全局数据结构;
不可重入函数是指运行该函数时也需要改变全局数据结构。
如果有多个进程进入不可重入函数时,需要相应的锁机制(互斥锁,自旋锁)来保证同一时刻只有一个进程改变涉及到的全局数据。



可重入函数的理解其实比较麻烦,可以从以下阐述:
1.可重入是与多线程无关的,一个函数被同一个线程调用2次以上,得到的结果具有可再现性。则这个函数是可重入的。
2.可重入讲究的是结果可再现性,因此,使用全局(静态)变量的函数,再次调用其函数的结果是不可再现的,这就是前面说的为何要求该函数只修改局部变量
故可重入函数,描述的是函数被多次调用但是结果具有可再现性
     可重入函数条件:
1,不在函数内部使用静态或者全局数据
2,不返回静态或者全局数据,所有的数据都由函数调用者提供
3,使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据
4, 如果必须访问全局数据,使用互斥锁(自旋锁)来保护
5,不调用不可重入函数
6,可重入函数必须是线程安全的

补充一点,可重入函数必定是线程安全的,但是线程安全的,不一定是可重入的。不可重入函数,函数调用结果不具有可再现性,可以通过互斥锁等机制,使之能安全的同时被多个线程调用,那么,这个不可重入函数就是转换成了线程安全。


可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。


可重入函数也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括 static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。


你可能感兴趣的:(可重入内核 & 可重入函数)