本文主要是介绍管程 子例程 协程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考:
http://zh.wikipedia.org/wiki/%E7%AE%A1%E7%A8%8B
http://baike.baidu.com/view/1359532.htm
http://zh.wikipedia.org/wiki/%E5%8D%8F%E7%A8%8B
1 管程
统中的各种硬件资源和软件资源,均可用数据结构抽象地描述其资源特性,即用少量信息和对资源所执行的操作来表征该资源,而忽略了它们的内部结构和实现细节。利用共享数据结构抽象地表示系统中的共享资源,而把对该共享数据结构实施的操作定义为一组过程。代表共享资源的数据结构,以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成了一个操作系统的资源管理模块,我们称之为管程。
Hansan为管程所下的定义:“一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据”。
有上述定义可知,管程由四部分组成:
- 1.管程内部的共享变量;
- 2.管程内部的条件变量;
- 3.管程内部并行执行的进程;
- 4.对局部于管程内部的共享数据设置初始值的语句。
一个管程包含:
- 多个彼此可以交互并共用资源的线程
- 多个与资源使用有关的变量
- 一个互斥锁
- 一个用来避免竞态条件的不变量
一个管程的程序在运行一个线程前会先取得互斥锁,直到完成线程或是线程等待某个条件被满足才会放弃互斥锁。若每个执行中的线程在放弃互斥锁之前都能保证不变量成立,则所有线程皆不会导致竞态条件成立。
在管程的简单实现中,编译器为每个管程对象自动加入一把私有的互斥锁。该互斥锁初始状态为解锁,在管程的每个公共子程序的入口给该互斥锁加锁,在管程的每个公共子程序的处口给该互斥锁解锁。
2 子例程
过程有两种,一种叫子例程 (Subroutine),我们通常叫做 Sub;另外一种叫函数,通常叫 Function
两者区别在于,Sub 只执行操作,没有返回值;Function 不但执行操作,并且有返回值
3 协程
3.1 概念
子例程的起始处是惟一的入口点,一旦退出即完成了子程序的执行,子程序的一个实例只会返回一次。
协程可以通过yield来调用其它协程。通过yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称、平等的。
协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。子例程的生命期遵循后进先出(最后一个被调用的子例程最先返回);相反,协程的生命期完全由他们的使用的需要决定。
3.2 例子
这里是一个简单的例子证明协程的实用性。假设你有一个生产者-消费者的关系,这里一个协程生产产品并将它们加入队列,另一个协程从队列中取出产品并使用它。为了提高效率,你想一次增加或删除多个产品。代码可能是这样的:
var q := new queue
生产者协程
loopwhile q is not fullcreate some new itemsadd the items to qyield to consume
消费者协程
loopwhile q is not emptyremove some items from quse the itemsyield to produce
每个协程在用yield命令向另一个协程交出控制时都尽可能做了更多的工作。放弃控制使得另一个例程从这个例程停止的地方开始,但因为现在队列被修改了所以他可以做更多事情。
尽管这个例子常用来介绍多线程,实际没有必要用多线程实现这种动态:yield语句可以通过由一个协程向另一个协程直接分支的方式实现。
这篇关于管程 子例程 协程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!