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. 负载均衡中的session保持

    什么叫负载均衡中的session保持 当我们需要做负载均衡时,服务端肯定有多台服务器,用户每次请求进来,会根据负载均衡算法被分配到某一台机器上,假设用户需要进行一段连续操作时,在第一台机器登陆后,下一 ...

  2. 使用docker加载已有镜像安装Hyperledger Fabric v1.1.0

    背景 每次在新的服务器上安装Hyperledger Fabric网络时,通过fabric官方提供的脚本安装时,需要从网络上down下近10G的fabric相关镜像,这个过程是漫长及痛苦的,有时因网络问 ...

  3. 总结:Java 集合进阶精讲2-ArrayList

    知识点:Java 集合框架图 总结:Java 集合进阶精讲1 总结:Java 集合进阶精讲2-ArrayList 初探: ArrayList底层结构是数组,是List接口的 可变数组的实现,所以会占用 ...

  4. 欢迎来到GitHub世界

    什么是GitHub GitHub(Pronunciation:/githʌb/)  这是一个为开发者提供Git仓库的托管服务,这是一个让开发者们共享代码的完美场所.GitHub公司总部位于美国旧金山, ...

  5. CSS animation-delay:规定动画何时开始

    在CSS中animation-delay的属性为规定动画何时开始.主机吧本文详细介绍下animation-delay的定义和用法.animation-delay的语法.animation-delay的 ...

  6. Linq to SQL -- Join

    Join操作 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectM ...

  7. Python 内置函数math,random

    内置函数的一些操作 - math(数学模块) - random(随机模块) - 使用内置函数时注意需要导入 math - (ceil)向上取整,返回取整数 # 向上取整,返回向上取整的数 import ...

  8. majingwei 利用xml导出word文件---换行

    xml不能识别<br>,需要将换行标记转换成<w:br/>

  9. Python 有道翻译 爬虫 有道翻译API 突破有道翻译反爬虫机制

    py2.7 #coding: utf-8 import time import random import hashlib import requests while(1): url = 'http: ...

  10. java 英文单词拼写纠正框架(Word Checker)

    Word Checker 本项目用于单词拼写检查. 项目简介 word checker 用于单词拼写检查. Github 地址 特性说明 支持 i18n 错误提示支持 i18N 支持英文的单词纠错 可 ...