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 ...
随机推荐
- 【Eclipse】_Eclipse自动补全增强方法 & 常用快捷键
一,Eclipse自动补全增强方法 在Eclipse中,从Window -> preferences -> Java -> Editor -> Content assist - ...
- OpenResty的现状、趋势、使用及学习方法
Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中,实现了 OpenResty 这个高性能服务端解决方案. 通过 OpenRest ...
- 去中心化存储项目终极指南 | Filecoin, Storj 和 PPIO 项目异同
Filecoin,Storj 以及 PPIO 这三个存储公链的设计思路是不一样的,没有优劣之分,写这篇文章也并不是为了争论各项目的好坏对错.去中心化存储是一个长期商业赛道,不同团队在同一个赛道上往不同 ...
- linux下怎么清理缓存
free -m 命令可以查看内存使用情况 sysctl 命令可以临时改变某个系统参数 如:sysctl -w net.ipv4.ip_forward=1 是将forware参数临时改为1 当 ser ...
- C&C++类型定义typedef
1.声明 1.1结构声明: struct { int n; double x,y; }; 1.2带结构标志的声明 struct point{ double x,y; }; 1.3定义结构类型 1.3. ...
- 基于墨刀实现的购物app
在观察研究购物app后 仔细分析总结了几个基础功能,实现如下的界面: 主界面:购物app的推荐界面,提供各式的样品,将整个app的多种功能进行展示. 推荐分类:根据用户浏览的宝贝,对用户进行合理推荐. ...
- AD域控Dsquery查询命令实列
注:请以管理员的身份运行cmd程序,要不然某些命令不生效 AD域控Dsquery查询命令实列 查询技术支持二部的所有用户 dsquery user OU=技术支持二部,OU=技术部, ...
- 图片转成base64位 页面中图片展示
<img src="data:image/gif;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABG ...
- 关于matlab2018a版本错误使用 svmclassify 分类器
当我们照常使用分类器函数svmclassify时,2018版的matlab会报出以下错误: 解决办法: 1,下载libsvm(一般下载最新版本就ok了)包,并将其添加至matlab的toolbox文件 ...
- thinkphp中插入ueditor编辑器的代码
1.需要在header中加入以下js内容:<script type="text/javascript" src="{$smarty.const.__ROOT__}/ ...