协同例程是为开发伪并行的单处理机系统模型而发明的,使人们能够使用高级语言编写伪并行操作系统。有了协同例程之后,就没有互斥和同步问题。基本的问题是调度和控制转移。

协同例程是一个能够按照伪并行方式独立地执行的程序单位。协同例程像一个由主程序激活的过程,但和过程不同,协同例程能够在任何一处,控制转移到另一个协同例程,而且当控制转移返回到原协同例程时,在其执行被挂起的地方恢复先前的执行。

概述

协同例程是为开发伪并行的单处理机系统模型而发明的,使人们能够使用高级语言编写伪并行操作系统。有了协同例程之后,就没有互斥和同步问题。基本的问题是调度和控制转移。

协同例程是一个能够按照伪并行方式独立地执行的程序单位。协同例程像一个由主程序激活的过程,但和过程不同,协同例程能够在任何一处,控制转移到另一个协同例程,而且当控制转移返回到原协同例程时,在其执行被挂起的地方恢复先前的执行。

协同例程都是平等的,它们当中不区分父协同例程或者子协同例程。协同例程是串行地执行的,因为在任何时刻,只能够有一个协同例程在活跃,而且只有在它把控制转移给另一个协同例程时,才停止活跃。

这说明了每个协同例程必须有其自己的局部运行环境,同时在协同例程不活跃时,仍然留在内存储。运行环境一般必须包括在该协同例程内所作的全部活跃调用,加上一个指明该协同例程中要恢复执行的位置指针,以及一个指向协同例程创建者环境的指针。1

Modula—2的协同例程

在Modula—2中,协同例程被称为进程,即使它们不是真正并行执行。Modula—2的进程是标准库SYSTEM的一部分。这些设施包括:过程NEWPROCESS用来创建一个新的协同例程,而且分配用来保留其局部环境的内存储。过程TRANSFER用来从一个进程控制转向另一个进程。

在Modula—2中,NEWPROCESS创建一个协同例程,但不开始其执行。NEWPROCESS指派一个过程和这个环境的工作空间给一个进程变量。它被说明为:

PROCEDURE NEWPROCESS(P:PROC;A:ADDRESS;

n:CARDINAL; VAR p1:PROCESS);

其中P是任一个无参数过程(TYPE PROC=PROCEDURE),A是工作空间的起始地址,n是这个工作空间的长度,p1是要创建的进程变量。

如何分配工作空间是同应用和具体的实现有关。典型的方法是对每个协同例程分配全局的ARRAY{1..m}OF WORD变量,而且使用函数ADR和SIZE传递开始地址以及长度给NEW—PROCESS。数组空间的大小,是同实现和涉及的协同例程有关的。1

本词条内容贡献者为:

王慧维 - 副研究员 - 西南大学

协同例程

图文简介

协同例程是为开发伪并行的单处理机系统模型而发明的,使人们能够使用高级语言编写伪并行操作系统。有了协同例程之后,就没有互斥和同步问题。基本的问题是调度和控制转移。协同例程是一个能够按照伪并行方式独立地执行的程序单位。协同例程像一个由主程序激活的过程,但和过程不同,协同例程能够在任何一处,控制转移到另一个协同例程,而且当控制转移返回到原协同例程时,在其执行被挂起的地方恢复先前的执行。