协同设计

【转】异步、并发、协程原理

拈花ヽ惹草 提交于 2019-12-01 17:05:47
Linux 操作系统在设计上将虚拟空间划分为用户空间和内核空间,两者做了隔离是相互独立的,用户空间给应用程序使用,内核空间给内核使用。 一、异步 应用程序和内核 内核具有最高权限,可以访问受保护的内存空间,可以访问底层的硬件设备。而这些是应用程序所不具备的,但应用程序可以通过调用内核提供的接口来间接访问或操作。所谓的常见的 IO 模型就是基于应用程序和内核之间的交互所提出来的。以一次网络 IO 请求过程中的 read 操作为例,请求数据会先拷贝到系统内核的缓冲区(内核空间),再从操作系统的内核缓冲区拷贝到应用程序的地址空间(用户空间)。而从内核空间将数据拷贝到用户空间过程中,就会经历两个阶段: 等待数据准备 拷贝数据 也正因为有了这两个阶段,才提出了各种网络 I/O 模型。 Unix/Linux的体系架构 同步和异步 同步(Synchronised)和异步(Asynchronized)的概念描述的是应用程序与内核的交互方式,同步是指应用程序发起 I/O 请求后需要等待或者轮询内核 I/O 操作完成后才能继续执行;而异步是指应用程序发起 I/O 请求后仍继续执行,当内核 I/O 操作完成后会通知应用程序,或者调用应用程序注册的回调函数。 阻塞和非阻塞 阻塞和非阻塞的概念描述的是应用程序调用内核 IO 操作的方式,阻塞是指 I/O 操作需要彻底完成后才返回到用户空间;而非阻塞是指 I

Lua中的协同程序 coroutine

丶灬走出姿态 提交于 2019-11-26 13:45:52
  Lua中的协程和多线程很相似,每一个协程有自己的堆栈,自己的局部变量,可以通过yield-resume实现在协程间的切换。不同之处是: Lua协程是非抢占式的多线程 ,必须手动在不同的协程间切换,且同一时刻只能有一个协程在运行。并且Lua中的协程无法在外部将其停止,而且有可能导致程序阻塞。 协同程序(Coroutine):   三个状态: suspended (挂起,协同刚创建完成时或者yield之后)、 running (运行)、 dead (函数走完后的状态,这时候不能再重新resume)。   coroutine.create(arg):根据一个函数创建一个协同程序,参数为一个函数   coroutine.resume(co):使协同从挂起变为运行(1)激活coroutine,也就是让协程函数开始运行;(2)唤醒yield,使挂起的协同接着上次的地方继续运行。该函数可以传入参数   coroutine.status(co):查看协同状态   coroutine.yield():使正在运行的协同挂起,可以传入参数   resume函数的两种用途虽然都是使协同挂起,但还是有些许差异的,看下面这个例子: coroutineFunc = function (a, b) for i = 1, 10 do print(i, a, b) coroutine.yield() end