管程 子例程 协程

2023-12-10 20:59
文章标签 例程 管程 协程

本文主要是介绍管程 子例程 协程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:

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语句可以通过由一个协程向另一个协程直接分支的方式实现。

这篇关于管程 子例程 协程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478356

相关文章

使用协程实现高并发的I/O处理

文章目录 1. 协程简介1.1 什么是协程?1.2 协程的特点1.3 Python 中的协程 2. 协程的基本概念2.1 事件循环2.2 协程函数2.3 Future 对象 3. 使用协程实现高并发的 I/O 处理3.1 网络请求3.2 文件读写 4. 实际应用场景4.1 网络爬虫4.2 文件处理 5. 性能分析5.1 上下文切换开销5.2 I/O 等待时间 6. 最佳实践6.1 使用 as

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

Java的ArrayDeque使用例程

题目要求为: 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接

gcc make cmake例程

main.cpp文件: #include <iostream>#include "utils.h"int main(void) {int a = 1;int b = 2;int c = AddFunc(a, b);std::cout<< c <<std::endl;return 0;} utils.h文件: #pragma onceint AddFunc(int a, int b);

Unity实现自己的协程系统

概述:自定义Unity协程调度器(不依赖Mono)           实现了一个协程调度器,允许在程序中以非阻塞的方式调度协程。协程可以在满足特定条件后暂停和恢复,如等待特定的帧数、时间、或等待其他协程执行完毕。它的设计思想与Unity的协程机制类似,但它不依赖Unity的YieldInstruction,因此适用于非Unity环境。 协程可以在以下情况下暂停: "yield null ;

【PSINS】SINS与航位推算的EKF例程讲解|三维轨迹

文章目录 SINS与航位推算例程构造滤波前滤波主体滤波后处理 运行结果源代码 SINS与航位推算 SINS是捷联惯导,略。 航位推算: 本文讲解的程序是PSINS工具箱(相关文章:PSINS初学指导,https://blog.csdn.net/callmeup/article/details/136459824)的一个函数,在此基础上进行优化。如果要运行,需要先安装工具箱

进程+线程+协程

进程+线程+协程 1 进程1.1 无进程1.2 多进程1.3 p1.join()1.4 权重1.5 全局变量list 1 进程 1.1 无进程 不使用进程,task_01和task_02先后执行 import osimport timefrom multiprocessing import Processdef task_01():print("*"*8+' tas

3-KYLIN订单例程

转:http://blog.itpub.net/30089851/viewspace-2122586/ 一.Hive订单数据仓库构建 1. 创建事实表并插入数据 DROP TABLE IF EXISTS default.fact_order ; create table default.fact_order (   time_key string,   product_key stri

swoole coroutine协程消息队列

首先测试一个消息队列的例子: use Swoole\Coroutine as co;$channel = new co\Channel(100);co::create(function() use($channel){for($i = 0; $i < 20; $i++) {co::sleep(1.0);$channel->push(['key'=>$i,'value'=>rand(111111,

Lua调用C#协程

核心就是先require("xlua.util") 然后就可以通过cs_generator函数将方法传入 例如:mono:StartCoroutine(util.cs_generator(fun)) print("*********Lua调用C# 协程相关知识点***********")--xlua提供的一个工具表--一定是要通过require调用之后 才能用util = requir