\doc\pt-doc.txt

来源:互联网 发布:淘宝双11大数据 编辑:程序博客网 时间:2024/06/10 17:14


    Protothreads是为深度嵌入式系统或传感器网络节点这些内存受限系统设计的一种轻量级、非堆栈的线程模型。Protothreads使用C语言为事件驱动型系统提供线性代码执行(linear code execution)。Protothreads可以被应用在实时操作系统中,也能够单独使用。

    Protothreads在事件驱动系统之上提供了没有线程栈开销的一个阻塞上下文。Protothreads目的是,不使用复杂的状态机和完整的多线程机制来实现连续的控制流。Protothreads在C函数内条件阻塞。

    protothreads相比纯粹的事件驱动系统的优势在于,它提供了连续的代码结构,以允许阻塞函数。在纯粹的事件驱动系统,阻塞必须实现手动地将函数分成两部分,一部分是阻塞调用之前,一部分是阻塞调用之后。这使得它很难使用如if、while 一类的控制结构。

    protothreads相比普通线程的优势是,一个protothreads并不要求独立的栈空间。在内存有限的系统中,分配多个栈的总开销会消耗大量可用内存。相反,每个protothread仅仅要求2~12字节(具体依据实际的系统架构)。

    由于protothreads在阻塞调用中不保存栈的上下文,所以当protothreads阻塞时,局部变量将不被保留下来。这意味着局部变量必须谨慎使用,不得在protothreads中使用局部变量。

    主要特征:
- 没有特定体系代码,protothreads库函数使用纯粹C语言
- 不要使用容易出错的函数(error-prone functions) ,如longjmp()
- 非常小的内存开销,每个protothread仅仅2字节
- 能够与OS一起使用,也能单独使用
- 提供了不使用完整多线程和栈开关的多阻塞等待

    应用实例
- 内存受限系统
- 事件驱动的协议栈
- 深度嵌入式系统
- 传感网络节点

    protothreads 的API由四种基本操作组成:
初始化 PT_INIT()
运行 PT_BEGIN()
条件阻塞 PT_WAIT_UNTIL()
退出 PT_END()
    除了上面这些,还有两个非常有用的:
相反条件阻塞 PT_WAIT_WHILE()
protothread阻塞 PT_WAIT_THREAD()

    一个protothread运行在单一C函数内部,并不横跨(span_over)其它函数。protothread可能调用普通C函数,但不能阻塞在一个调用函数内部。阻塞内嵌套的函数调用,替代为每一个阻塞的函数由生成一个单独的protothread。这种方法的优势是,阻塞是易于发现的:程序员能够明确地知道哪个函数阻塞,哪个函数从未阻塞。

    Protothreads类似于非对称的co-routines。主要的不同是,co-routines为每一个co-routine使用单独的栈,然而protothreads不使用栈。它们最相似的原理是,protothreads是Python generators。这些也是非栈设计,但有不同的用途。Protothreads在一个C函数内部规定阻塞上下文,然后Python generators 从生成函数提供多个出口。

    一个protothread由重复调用的函数来驱动。每一次函数被调用时,protothread将运行直到阻塞或退出。因此,protothread的调度是通过 应用程序使用protothread。

    A local continuation 代表了在程序中特定位置的当前执行状态,但不提供调用记录和局部变量。A local continuation 可以设置一个特定函数来捕获程序状态。local continuation 设定后可以恢复,以复原 local continuation 设定时函数的状态。

    Local continuations 可以以多种方式实现:
-# 使用机器特定的汇编代码
-# 使用标准C架构
-# 使用扩展编译器

    ... ...


    

    

    

0 0