可以在中断服务程序执行malloc吗?
这是微信群里面的一个群友提的问题,原问题如下:
今天遇到一个面试问题 请教各位老哥 中断服务程序能否malloc ?为什么?我回答是 不行 因为中断服务程序应该要尽量简短,且执行完中断服务程序会跳出中断函数,要进行释放。 但是从面试官得反应我应该是回答错了或者没回答到点子上。还望不吝赐教
中断相关的文章
中断是分为上半部和下半部的,不管是上半部还是下半部,我们都需要注意一些事情
---- 中断要尽快执行完
---- 中断函数要可以重入
重入相关文章
你应该关心函数重入的问题
简单说下函数可以重入的这个问题,重入的引入是因为多线程导致的,有内核的系统都是多任务系统,既然是多任务系统,如果一个函数被多个任务调用,就需要保护全局变量,只有局部变量的函数是没有重入的问题的哈。
从内核里面截取的malloc源码
static void *malloc(int size)
{
void *p;
if (size < 0)
return NULL;
if (!malloc_ptr)
malloc_ptr = free_mem_ptr;
malloc_ptr = (malloc_ptr + 3) & ~3; /* Align */
p = (void *)malloc_ptr;
malloc_ptr += size;
if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
return NULL;
malloc_count++;
return p;
}
很明显里面有全局变量,而且这个全局变量没有加锁保护,这种函数如果在中断服务函数里面,如果中断被多次触发,那就比较出现问题了,还有一个情况,如果malloc失败了呢?是不是要退出中断,我们知道中断是不能return的啊。
我的一点自己见解,欢迎大佬们评论说出自己的观点