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多路复用、协程、线程、进程的更多相关文章

  1. python--再看并行之协程线程进程

    1.gevent协程适合I/O密集,不适合CPU密集. 3.gevent协程无法发挥多核优势,事实上,协程只是以单线程的方式在运行. 3.子程序就是协程的一种特例 项目实际应用 from gevent ...

  2. 11.python之线程,协程,进程,

    一,进程与线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...

  3. Python笔记_第四篇_高阶编程_进程、线程、协程_1.进程

    1. 多任务原理: 现代操作系统,像win,max os x,linux,unix等都支持多任务. * 什么叫做多任务? 操作系统可以同时运行多个任务. * 单核CPU实现多任务原理? 操作系统轮流让 ...

  4. Python IO 多路复用 \协程

    IO 多路复用 作用:  检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据) 即(可读/可写) IO请求时 解决并发  :  单线程 def get_data(key): cl ...

  5. IO多路复用,协程

    https://www.cnblogs.com/wangjun187197/p/9642429.html Python之路--协程/IO多路复用 I/O复用模型 此模型用到select和poll函数, ...

  6. 20170702-变量说明,静态方法,类方法区别,断点调试,fork,yield协程,进程,动态添加属性等。。

    概念: 并行:同时运行 并发:看似同时运行  json后任然中文的问题 import json d = {"名字":"初恋这件小事"} new_d1 = jso ...

  7. Python笔记_第四篇_高阶编程_进程、线程、协程_3.进程vs线程

    1.多任务的实现原理: 通常我们会设计Mater-Workder模式,Master负责分配任务,Worker负责执行任务,因此多任务环境下,通常是一个Master,多个Worker 2.多进程: 主进 ...

  8. 进程&线程&协程

    进程  一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...

  9. python多任务的实现:线程,进程,协程

    什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行.还有很多任务悄悄地在后 ...

  10. Python之线程、进程和协程

    python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...

随机推荐

  1. python 中增加css样式的三种方式

    增加css样式的三种方式: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  2. 刘志梅 201771010115 《面向对象程序设计(java)》 第十八周学习总结

    实验十八 总复习 实验时间 2018-12-30 1.实验理论知识 (1)第一个关键词:public称为访问修饰符,用于控制程序的其他部分对代码的访问级别. 第二个关键词:class表明java程序中 ...

  3. 转: 解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题

    我发现这个问题上网搜索 ,找到的地址为:http://blog.csdn.net/z69183787/article/details/19911935 .但是他的标题上也有一个"转" ...

  4. 搭建Hadoop

    最近开始学习hadoop现实是完全分布式 安利大佬博客学习 https://blog.csdn.net/downing114/article/details/60956979 在Ubuntu上学习  ...

  5. logstash同步mysql数据失败

      问题描述 前提: 项目采用Elasticsearch提供搜索服务,Mysql提供存储服务,通过Logstash将Mysql中数据同步到Elasticsearch. 问题: 使用logstash-j ...

  6. 通过java程序调用ant build.xml配置文件中指定的target

    一.概述 通过ant实现项目的自动化部署,jar包生成,替换,tomcat关停.启动,查看项目日志: 通过java程序调用已编辑好的ant脚本build.xml配置文件中指定的target: 文中文件 ...

  7. IntelliJ IDEA 关闭多余项目

    在开发中 一个项目中可能会有多个子项目,切换起来比较麻烦,需要将用不到的项目关掉 1.就是关闭一个Project中多个module的一个 2.右击要关闭项目,选中弹出窗口中的 Load/Unload ...

  8. 转载及总结:cron表达式详解,cron表达式写法,cron表达式例子

    cron表达式格式:{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}例  "0 0 12 ? * WED" 在每星期三下午12:00 执行(年份通常 ...

  9. Spring Boot实现文件下载功能

    我们只需要创建一个控制器(Controler)文件,即Controller目录下的File_Download.java,其完整目录如下: @Controller public class File_D ...

  10. void类型及void指针(转载)

    转载 https://www.cnblogs.com/pengyingh/articles/2407267.html 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针” ...