可重入程序与不可重入程序的区分

        可重入性的英文关键词为Reentrancy,这里首先要区分可抢占这一概念。在计算机里面,程序的运行可以说是一堆机器指令被放入CPU进行顺序执行,但是操作系统为了更好地管理程序,就出现了各式各样的载体概念,比如说进程、线程、任务,究其本质,都是相对于“调度”这个操作,它们只是调度的粒度不一样。如果我们在Linux或者windows下运行某个程序,它会依托于进程或者任务载体,由操作系统的内核对它进行调度执行。可抢占式说明当前你执行的程序(任务)可以被其它程序抢占,意味着暂时失去对CPU资源的拥有。

        一旦涉及到调度,就需要对任务之间进行同步和互斥了,比如常见的触发调度的技术如中断、任务睡眠、内核抢占等。

        我在这里举的例子是可重入型函数,这也是可重入性的基础,其它引申出来的概念或者应用都是建立在它上面的。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数只使用局部变量,即变量保存在CPU寄存器中或栈中。

void strcpy(char *dest, char *src)
{
    while (*dest++ = *src++) {
        (void)0;
    }
    *dest = NUL;
}


        strcpy()是属于可重入型函数,多个任务或者线程调用它之后,并不会带来同步等问题。

        如果说某个函数使用的变量涉及到全局变量或者堆,这样的函数就可能是不可重入型函数了,有可能得解决资源互斥的问题。在嵌入式研发中,可以利用开关中断、任务优先级调整,信号量,自旋锁等多种手段来解决不可重入的问题。举个常见的例子,使用全局变量的函数也并非一定是不可重入的,例如该全局变量已经被赋值且只读性质。

        再举一个实际例子,某个函数的内部并不是所有代码都是不可重入的,如果有相当部分代码并不涉及资源互斥,这时候就可以采用加锁解锁的方式来进行任务之间同步,达到逻辑意义上的可重入。当然,程序的逻辑还得设计人员自己控制,否则容易出现多个任务调用同一段代码,谁也无法获得执行权,造成死锁的情况。

 

总结:可重入性是多任务、多线程开发的一个重要概念,特别在设计之初要予以考虑。另外对于很多系统调用或者说第三方函数库,对于模块是否可重入应该小心求证。   

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值