博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO 理论 SOCK理论
阅读量:5104 次
发布时间:2019-06-13

本文共 3148 字,大约阅读时间需要 10 分钟。

IO密集型程序   在程序执行过程中存在大量IO操作,而CPU操作较少,消耗CPU较少,运行效率较低 CPU(计算)密集型程序   在程序执行中,CPU运算较多,IO操作相对较少(消耗CPU大,运行速度快) IO分类: 阻塞IO             阻塞情况: 是IO的默认形态,是效率较低的一种IO情形           1  因为某种条件没有达成造成的阻塞               accept input recv           2 处理 IO端数据传输时间较长形成的阻塞               网络传输过程,文件读写过程      非阻塞IO : 通过IO事件的属性,使其变成非阻塞状态,(让一些条件阻塞函数不再阻塞)         非阻塞IO往往和循环判断一起使用         s.setblocking(False)           将套接字设置为非阻塞状态(默认为阻塞状态)         超时检测: 将原本阻塞函数,设置一个最长阻塞时间,如果条件时间内达成则正常运行,如果仍然阻塞则被视为超时,继续向下运行或产生异常         s.settimeout(sec)  设置套接字超时时间             IO多路复用 :同时监控多个IO事件,当哪个IO事件准备就绪,就执行哪个IO事件,以此形成可以同时操作多个IO的并发行为,避免一个IO阻塞,造成所有IO都无法执行         IO准备就绪:是一种IO必然发生的临界状态         IO多路复用的编程实现:             1 将IO设置成为关注IO             2 将关注IO提交给内核监视             3 处理内核给我们反馈的准备就绪的IO         具体:select --> windows linux unix            poll  -->linux unix            epoll  -->linux unix     select 模块:         import select           rs,ws,xs = select(rlist,wlist,xlist[,timeout])           功能: 监控IO事件,阻塞等待IO事件发生         参数:           rlist :列表, 存放我们监控等待处理的IO事件           wlist :列表,存放我们要主动操作的IO事件           xlist :列表: 我们要关注出错处理的IO事件           timeout: 超时时间         返回值 :           rs 列表 rlist中准备就绪的IO           ws 列表 wlist中准备就绪的IO           xs 列表 xlist中准备就绪的IO         注意:           1 wlist中如果有IO事件则select立即返回到ws           2 在处理IO过程中不要处理一个客户端长期占有服务端,使服务端无法运行到select 的情况           3 IO多路复用占用计算机资源少,IO效率高     POLL       1 创建POLL对象         p= select.poll()       2 添加注册事件         p.register(s,事件) 关注S的所有IO事件         
事件常量 意义
POLLIN 有数据读取
POLLPRT 有数据紧急读取
POLLOUT 准备输出:输出不会阻塞
POLLERR 某些错误情况出现
POLLHUP 挂起
POLLNVAL 无效请求:描述无法打开
      3 阻塞等待IO发生          events = poll.poll()          功能 :阻塞等待IO发生          返回值 :events是一个列表,列表中的每个元素都是一个元组,代表一个发生的IO事件             例子 -->  (s.fileno()  ,  event)                  ( 就绪文件描述符, 对应的IO事件)             使用 :需要通过文件描述符(fileno)找到对应的IO对象,然后来操作这个IO对象       4 处理具体的IO   epoll方法     使用方法 : 基本与poll方法相同       * 将生产对象 poll() 改为 epoll()       * 将所有poll对象事件改为epoll对象事件     区别:         epoll 的效率要比 poll 和select 高       epoll 的触发方式更多         EPOLLET : 边缘触发     优点:            没有 fd 数量限制,取决于系统内存的大小,一般来说 1GB 就可以有 10W个       内核和用户控件使用同一块内存,mmap技术,没有用户态和内核态之间的拷贝,提高效率       无需遍历所有,仅仅只需要遍历已经就绪的 fd 即可          工作原理:
       1 在调用 epoll_create 之后,内核就已经创建了一个 eventpoll 红黑树结构体,一个 list 双向链表,在内核态准备接受存储需要监控的 fd。
       2 在调用 epoll_ctr 之后,直接向内核态的 eventpoll 进行 add/mod/del 对应的 fd,对于新添加进来的 fd,
          重复的 fd 可以通过 eventpoll 红黑树识别出来,而不需要再次从用户态拷贝到内核态这个过程
       3 同时 epoll 还维护了一个双向的 list 链表, 在epoll_ctr执行的时候,除了会向eventpoll 红黑树添加修改外,
        还会在内核中断函数处理程序中注册一个回调函数,告诉内核,当这个 fd 就绪之后,将他放到 list 里面去。
       4 在 epoll_wait 调用的时候,就是观察这个双向 list 是否有数据,有就直接处理即可
 

 
本地套接字   linux 文件     b (块设备文件)  c(字符设备文件)  d(目录)     - (普通文件)  l(链接)      s(套接字)     p(管道)   作用 :用于本地不同的程序间进行通信   创建流程 :     1 创建本地套接字       sockfd = socket(socket.AF_UNIX,socket.SOCK_STREAM)     2 绑定本地套接字文件       * 选定文件位置和名称       * sockfd.bind(path)     3 监听 listen()     4 消息收发 recv() send()      os.path.exists(path)       功能 : 检测一个文件是否存在       参数 :文件路径       返回 : 存在返回 True 否则返回False     删除文件:       os.remove(path) os.unlink(path)         功能 :删除一个文件         参数 :目标文件

 

转载于:https://www.cnblogs.com/Skyda/p/9606547.html

你可能感兴趣的文章
个人信息校验
查看>>
javascript笔记(二)
查看>>
Java基础之基础语法
查看>>
A* 算法理解与实现
查看>>
关于凑数问题的dfs
查看>>
CSS浮动(float、clear)通俗讲解
查看>>
自定义异常以及异常的处理
查看>>
SQLite与MySQL、SQLServer等异构数据库之间的数据同步
查看>>
07.31《jQuery》——3.4克隆节点
查看>>
sqlplus常用设置
查看>>
ZOJ 1492 Maximum Clique 搜索最大团
查看>>
兔子与兔子(字符串Hash)
查看>>
C#将数据导出到Excel汇总
查看>>
WCF契约Contract
查看>>
C++ Web Service SDK
查看>>
记一次 oracle 12.2 RAC : Transaction recovery: lock conflict caught and ignored
查看>>
JSON数据格式转换
查看>>
混合开发基础介绍
查看>>
springcloud gateway(hystrix filter)
查看>>
贪心算法
查看>>