I/O多路复用、协程、线程、进程
select注册fd,阻塞,当有fd状态改变时返回,确认对应的fd,做下一步处理。简单来说就是先注册,注册完后休眠并设置一个定时器醒来查看,有事件就通知来取,进行后续动作,没事件就继续睡,再设闹钟。用代码表示就是int flag;while(1){if flag blablabla;else sleep(n)};select的核心思想就是在把阻塞等待的时间让给他人,让其他任务把资源利用起来,让内核负责监听。当然,select的flag是一个i/o集合,可以对不flag实现不同处理,便于编程。
当有多个任务进行时,select睡眠将资源让给了他人,醒来时等CPU的调度。另一种情况,当select处于一个忙轮询时,相当于阻塞,是一个先来先服务的模型。仔细一想,如果先来的后面反而用的时间长,要是能让给后来者先办完就好了。
epoll与select最大的区别就是支持边缘触发,select只是检查是否可用,而epoll_ET一定是要在wait时检测到了0到1的跳变才返回。i/o多路复用,名字有点绕,其实是指多路i/o复用CPU等资源。
说完select的思想,再说说协程。协程就是用户态编写多任务的一种编程方式,将函数定义成协程,即包装成一个个tasks,然后放入队列执行,如果一个task遇到阻塞(协程阻塞),挂起,select/epoll定时监听,执行下一个task,监听到之前阻塞的task已恢复,则加入队列,放到首位,如果当前协程结束或阻塞,则开始下一个任务,如果当前是CPU密集形,迟迟没有完成,则后续任务会饥饿。所以协程是在单线程下的一种任务切换方式,非抢占式调度,调度的实现应该还是经过了内核,是根据多线程/进程/多路复用的思想设计好了一系列的协程上的阻塞和监听的方法,至于说是用户态的多任务,是因为对任务的调度是可控的,用户自己要明确调度的顺序。
多进程,最早的多任务模型,CPU分时复用,一个任务一个进程,一个进程就是一个资源包,尤其是i/o、CPU独占资源,但分配的内存只对自己可见,不便进程间通信。于是有了线程,在一个进程的内存里可以互相交流,像函数对全局变量一样,线程像是一种可以调度的函数,既然要调度,就要保存上下文,需要额外的结构和栈来保存。共享了内存有有了新的问题,保证数据的一致性,于是线程有了锁,信号量等工具。当然,进程间也是可以通过内核来通信的,内存映射,管道,消息队列,信号,socket,文件。与协程不同,进程和线程的调度都由内核调度器的算法控制,用户只能通过信号(进程),锁、信号量(线程)来控制顺序。
I/O多路复用、协程、线程、进程的更多相关文章
- python--再看并行之协程线程进程
1.gevent协程适合I/O密集,不适合CPU密集. 3.gevent协程无法发挥多核优势,事实上,协程只是以单线程的方式在运行. 3.子程序就是协程的一种特例 项目实际应用 from gevent ...
- 11.python之线程,协程,进程,
一,进程与线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...
- Python笔记_第四篇_高阶编程_进程、线程、协程_1.进程
1. 多任务原理: 现代操作系统,像win,max os x,linux,unix等都支持多任务. * 什么叫做多任务? 操作系统可以同时运行多个任务. * 单核CPU实现多任务原理? 操作系统轮流让 ...
- Python IO 多路复用 \协程
IO 多路复用 作用: 检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据) 即(可读/可写) IO请求时 解决并发 : 单线程 def get_data(key): cl ...
- IO多路复用,协程
https://www.cnblogs.com/wangjun187197/p/9642429.html Python之路--协程/IO多路复用 I/O复用模型 此模型用到select和poll函数, ...
- 20170702-变量说明,静态方法,类方法区别,断点调试,fork,yield协程,进程,动态添加属性等。。
概念: 并行:同时运行 并发:看似同时运行 json后任然中文的问题 import json d = {"名字":"初恋这件小事"} new_d1 = jso ...
- Python笔记_第四篇_高阶编程_进程、线程、协程_3.进程vs线程
1.多任务的实现原理: 通常我们会设计Mater-Workder模式,Master负责分配任务,Worker负责执行任务,因此多任务环境下,通常是一个Master,多个Worker 2.多进程: 主进 ...
- 进程&线程&协程
进程 一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...
- python多任务的实现:线程,进程,协程
什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行.还有很多任务悄悄地在后 ...
- Python之线程、进程和协程
python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...
随机推荐
- bzoj5107: [CodePlus2017]找爸爸
Description 小A最近一直在找自己的爸爸,用什么办法呢,就是DNA比对.小A有一套自己的DNA序列比较方法,其最终目标是最 大化两个DNA序列的相似程度,具体步骤如下:1.给出两个DNA序列 ...
- 20164310Exp6 信息搜索和漏洞扫描
实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点(以自己主机为目标) (4)漏洞扫描:会扫,会看报告, ...
- Windows中的备份和还原
1:增量备份 (查看文件属性,只备打了勾的,备完后把勾取消掉,修改后勾都会打上) 2:差异备份(备份有勾的 ,备份完后不会取消勾) 周一:备一 周二:备二 周三:备三 周四:备三,四
- amd显卡更新最新驱动鼠标顿卡的解决方法
测试了下游戏,很稳.方法:在卡顿的状态下打开RADEON设置,依次点击显示器→规格→覆盖,将支持HDCP选为禁用,按提示重启即可.
- Windows下访问控制管理
参考URL: https://blog.csdn.net/u011801161/article/details/45567289 http://blog.nsfocus.net/analysis-wi ...
- Oracle层级询语句connect by 用法详解
如果表中包含层级数据,那么你就可以使用层级查询从句选择行层级顺序. 1.层级查询从句语法 层级查询从句语法: { CONNECT BY [ NOCYCLE ] condition [AND condi ...
- VMware12 安装 Mac OS 10.12 步骤及设置优化教程
最近公司要开发苹果的ARKit应用,但是项目组穷啊,只有美工用着一台苹果本本,所以肯定不能老用他的电脑,效率低还老打扰他.所以我就想着用虚拟机整,毕竟玩了N年的虚拟机了,应该是没啥问题的.所以就开始各 ...
- JavaScript数组方法--includes、indexOf、lastIndexOf
我们继续吧! includes:includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false.还是先看看includes的用法吧 var ar ...
- 关于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解决办法
记录工作中遇到的问题 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh 由于远程机器或者重组 ...
- Tomcat版本对照表
导入程序前环境要先配好,环境要想配的正确,版本信息一定要了解. Tomcat版本 6.0 7.0 8.0 8.5 9.0 JDK ≥5.0 ≥6.0 ≥7.0 ≥7.0 ...