IO复用的相关知识

  • 单进程:易陷入阻塞,导致请求被大量的丢弃或者陷入等待;

  • 多进程:每一个进程响应一个用户请求.但是每个进程的地址空间是相互独立的,进程间的数据大多数是重复的,内存利用效率低;

  • 对于进程来说,每一个进程在等待IO的时刻,都需要为进程维护一个数据结构,用于区别不同的进程IO状况,早期是通过select的方式来管理这些数据结构的,select最多支持1024个进程管理;

  • 线程:thread:

    • Light Weight Process:Linux支持不同的线程库;
    • 每个线程响应一个用户请求:
      • 线程依然需要进行切换,切换相对于进程属于轻量级;
      • 同一个进程的线程可以为共享线程的诸多资源,例如打开的文件;
      • 对于内存的需求较之进程较小;
  • CPU等待的方式包括:

    • 忙等:也就是需要间隔一段时间来查询线程的状态,这称为忙等,忙等需要借助于spin lock自旋锁来实现;
    • 如果一个进程内部存在多个线程,在调度线程的过程中,容易出现线程抖动;
  • 多进程多线程模型:

    • 用于降低单个进程管理多个线程可能出现的线程抖动的问题;
    • 可以通过CPU绑定技术,来实现绑定进程在某个CPU上面,来降低进程切换的开销;
  • 多线程,多请求:

    • 也就是通过一个线程响应多个请求的方式,对于这种方式在响应请求的过程中,线程需要IO时,是不能够陷入阻塞的,因为一个线程阻塞,意味着多个线程都需要陷入阻塞,内核需要通过多路IO的机制来通过某些线程请求的数据已经就绪;
  • IO动作的执行:

    • 进程是无法直接操作IO设备的,必须通过系统调用来请求kernel来协助完成IO动作;
  • 内核会为每个IO设备维护一个buffer, 对于输入而言,wait数据输入至buffer需要时间,而从buffer copy数据到进程地址空间也是需要时间的;
    这里写图片描述

  • IO等待的五种模型:

  • block IO:表示阻塞式IO,也就是陷入阻塞,进行等待;
    这里写图片描述

  • nonblocking IO:表示非阻塞IO;

  • 在第一个阶段,内核在准备数据的过程中,通过询问机制来判断数据是否准备完成,这个阶段是非阻塞的,但是在第二个节点仍然是阻塞的;
    这里写图片描述

  • IO multiplexing:表示IO复用技术,当一个进程需要处理多个IO的时候,就需要进行复用;

  • 这个过程分为两步,第一次系统调用用于请求数据,直到数据复制到内存缓冲区,第二次还需要发起系统调用来同步数据, 这一段依然是阻塞的;
    这里写图片描述

  • signal driven IO:依靠信号驱动的IO模型;

  • 第一个阶段用于进行数据的准备工作,这个工作准备完成后,内核通过通知机制通知进程,IO已经就绪,第一个阶段不进行阻塞,但是在第二个界限进行阻塞;这种机制,是通过函数的回调机制实现的;

  • 关于上述通知的两种机制:

    • 水平触发:也就是再通知一次之后,过一段时间,依然会进行通知;
    • 边沿出发:仅仅通知一次,之后不在进行通知;
      这里写图片描述
  • asynchronous IO:表示异步IO,不会导致请求进程阻塞;

  • 表示IO的两段都是不进行阻塞的,所以必须通过信号机制来通知;
    这里写图片描述

  • 这几种技术的组合方式:
    这里写图片描述

  • 对于同步阻塞IO使用的技术是read/write系统调用;

  • 对于异步阻塞IO使用的技术是IO multiplexing技术;

  • 对于同步非阻塞IO使用的是read/write并且返回O_NOBLOCK;

  • 对于异步非阻塞IO使用的技术是AIO,也就是异步IO技术;\

  • 对于上面几种技术的一个对比
    这里写图片描述

    • 如果工作在同步阻塞模型下,那么从磁盘到内核空间,以及从内核空间到进程都是需要进行等待的,这种模型是不能够同时响应多个请求的;
    • 如果工作在异步阻塞模型下:磁盘到内核空间阻塞,内核空间到进程是非阻塞的,可以响应多个用户的请求;
    • IO复用模型下:同样的两段都是阻塞的,使用一个进程响应多个用户的请求,性能会十分差,可以使用多进程响应多个用户请求;
  • select(1024),poll()这两个函数是用于实现多路复用技术的,用于监控一段针对于不同IO请求的文件,select默认最迟最多1024个文件;

  • 基于事件驱动的IO模型,可以使用一个线程,响应多个用户的请求,事件驱动的实现需要使用epoll来实现,freeBSD使用的是kqueue来实现的;

  • 还有一种机制是内核共享自己的缓冲区,这个成为内存映射;

  • 异步IO表示的含义就是,数据准备需要准备到进程或者线程的缓冲区,在进行通知;

  • nginx支持AIO mmap event-driven,多用于反向代理;

  • Web集群的设计:

  • 前端首先应该实现动态内容和静态内容分离,动态内容交给HTTPD服务器,静态内容交给Nginx服务器,前端使用独立的nginx服务器实现动静分离,如果动态内容的速度比较慢,对于较少修改的动态内容,应该使用缓存服务器,用于缓存动态内容;

  • Mysql服务器首先应该实现读写分离,并且应该为Mysql提供缓存服务器,例如memcached,或者redis,并且可以为多个缓存服务器提供读的负载均衡器;

  • 动态的内容,首先需要进行编译,应该为PHP提供Xcache模块,用于进行缓存,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值