zoukankan      html  css  js  c++  java
  • 可重入程序与不可重入程序的区分

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

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

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

    1     void strcpy(char *dest, char *src)  
    2     {  
    3         while (*dest++ = *src++) {  
    4             (void)0;  
    5         }  
    6         *dest = NUL;  
    7     }  

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

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

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

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

  • 相关阅读:
    ios 数据类型转换 UIImage转换为NSData NSData转换为NSString
    iOS UI 12 block传值
    iOS UI 11 单例
    iOS UI 08 uitableview 自定义cell
    iOS UI 07 uitableviewi3
    iOS UI 07 uitableviewi2
    iOS UI 07 uitableview
    iOS UI 05 传值
    iOS UI 04 轨道和动画
    iOS UI 03 事件和手势
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/4954092.html
Copyright © 2011-2022 走看看