I/O模型

来源:互联网 发布:centos 6.8 docker 编辑:程序博客网 时间:2024/05/21 23:12

1.进程(process):是一个执行中的程序,是具有独立功能的程序关于某个数据集合的一次运行活动,是操作系统把它的工作利用进程划分为一个个功能单元,这个程序在运行过程中拥有独立的内存单元,独立的空间地址,一个进程崩溃后,不会对其他进程造成影响

线程(thread):是进程的一个实体,是对进程的更小划分,是一个进程中的不同执行路径,不能独立执行,基本上不拥有系统资源,,与同属一个进程的其他线程共享进程所拥有的全部资源,没有独立的地址空间。一个线程可以销毁和创建另一个线程,同一进程中多个线程可以并发执行。一个线程死掉整个进程也会死掉



2.apache的三种多路处理模块(MPM):prefork    worker   event

prefork:多进程单线程,自我调节能力强,如果将MaxClients设置为一个足够大的数值以处理潜在的请求高峰期,又不能太大使得所需内存超过物理内存

worker:多进程多线程,每个进程可以拥有的线程数量是固定的,服务器根据负载来增减进程数量

event:多进程多线程,http的keep-alive能减少tcp连接数量和网络负载,但是keep-alive需要和服务进程或线程绑定,这样一个繁忙的服务器会耗光所有线程。event就可以解决这个问题,处理更高的负载



3.文件描述符(fd):当程序打开一个文件或创建一个新文件时,内核向进程返回一个文件描述符


4.socket:用于描述IP地质和端口,实现不同虚拟机或不同计算机之间的通信。每个服务都会打开一个socket,并绑定到一个端口上,不同的端口对应不同的服务



5.IO复用:通过对IO描述符的复用来减少进程的创建,使服务端只有一个进程


6.IO多路复用(IO multiplexing) :内核一旦发现进程指定的一个或多个IO描述符准备就绪,它就通知该程序进行读写操作

IO multiplexing之select

select的文件描述符分3类:writefds、readfds、exceptfds

调用后select函数会阻塞,直到有描述符就绪或超时,函数返回,seelect函数返回后,可以通过遍历文件描述符集(fdset),找到就绪的描述符

但是但个进程能够监视的文件描述符的数量存在最大限制

 

IO multiplexing之poll

与select类似,本质上没有太大差别,对多个文件描述符进行轮询,根据描述符是否准备就绪进行处理,只是poll没有最大文件描述符数量限制

但是一个有很多文件描述符的数组被整体复制于用户和内核的地址空间之间,不论这些描述符是否准备就绪,地址空间都会随着文件描述符数量的增加而增大

poll函数中有pollfd结构体,每一个pollfd结构体会被指定监视一个文件描述符,在结构体的evets域是监视该文件描述符的事件掩码,revents域是文件描述符的操作结果事件掩码。

events域中请求的任何事件都能在revents域中返回

 

IO multiplexing之epoll

epoll是select和poll的增强版,使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样当包含很多文件描述符的数组在用户和内核之间复制时,只需要复制一次

epoll的操作需要3个接口

(1)-size:告诉内核监听数目有多大,只是对内核初始分配内部数据结构的一个建议

(2).-op:op操作   EPOLL_CTL_EDL删除 EPOLL_CTL_ADD添加  EPOLL_CTL_MOD修改对fd的监听事件

 -fd:需要监听的文件描述符

 -epoll_event:告诉内核需要监听什么事

 -epfd:epoll_create( )的返回值

(3).-epoll_wait:等待epfd上的io事件,最多返回maxevents个事件

 -maxevents:告诉内核这个events有多大,不能大于size

 -events:从内核得到的事件的集合

 -timeout:超时时间

 

epoll对文件描述符的操作有两种模式:LT和ET

LT模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理,下次调用epoll_wait时,会再次响应应用程序并通知此事件

ET模式::当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理,下次调用epoll_wait时,不会再次响应应用程序并通知此事件

 


7.同步IO与异步IO:

针对应用程序与内核的交互而言

同步:发出一个调用时,没有得到结果之前,该调用不返回,那么调用返回,就得到返回值

异步:调用发出之后,就直接返回,没有返回结果,即调用者不会立即得到结果

同步异步主要看消息通知机制


8.阻塞与非阻塞:

阻塞:发出一个调用后,在调用结果返回之前,当前线程被挂起,在函数得到结果之后才会返回

非阻塞:发出一个调用后,在调用结果不能立即返回之前,函数不会阻塞当前线程而是立即返回

阻塞与非阻塞主要看程序在等待调用结果时的状态


9.四种形式可以两两组合

以到银行办理业务为例

同步阻塞:效率最低,专心排队,什么也不做

异步阻塞:去银行办理业务前领了一张小纸条,这是异步,但是前面还是有人,还需等待不能离开银行去做其他事,这是阻塞

同步非阻塞:一边打电话一边关注是否轮到自己

异步非阻塞:效率最高,在等待过程中需要外出抽烟,就告诉大堂经理如果叫到号就通知我


10.apache与nginx的比较:

nginx:轻量级,占用内存更少

      nginx处理请求是异步非阻塞的

      高并发下能保持低资源低消耗高性能

apache:rewrite更强大

       少bug

       稳定

根本理由是:apache采用select模式,nginx采用epoll模式

举例:你的朋友来到你的大学找你

select版的宿管大妈会带你挨个房间找,直到找到

epoll版的宿管大妈会记下每个同学的房间号,只需要告诉你房间号就可不会亲自带你满大楼跑

在高并发的服务器中,IO轮询非常耗时,轮询的fd越多越耗时


11.OSI模型:7层

物理层--->数据链路层--->网络层--->运输层--->会话层--->表示层--->应用层

物理层:透明地传送比特流

链路层:将网络层传下来的IP数据报封装成帧,在两个相邻节点间的链路上透明地传送帧中的数据

网络层:负责为分组交换网上的不同主机提供通信服务,把运输层中产生的报文段或i数据报封装成分组或包

网络层使用IP协议,分组也叫IP数据报或简称数据报

运输层:负责向两个主机中进程之间的通信提供服务,有复用和分用的功能

运输层使用TCP传输控制协议和UDP用户数据报协议

TCP:面向连接,数据传输的的单位是报文段,能够提供可靠的交付

UDP:无连接,数据传输的单位是用户数据报,不保证提供可靠交付,只提供“尽最大努力交付”

应用层:直接为用户的应用进程提供服务

应用层使用超文本传输协议HTTP  简单邮件传送协议SMTP  文件传送协议FTP 等等

 

12.地址解析协议ARP

知道IP地址要找出相应的物理地址,需要使用ARP协议

网络层使用IP地址,而在链路层上传送数据帧时需要使用网络的硬件地址,但是二者格式不同不存在简单的映射关系

功能:OSI模型共7层,IP地址在第3层,MAC地址在第2层,当在发送IP数据包时,需要封装第3层、第2层的报头,但由于发送时只知道目的IP,不知道MAC,此时就需要用到ARP协议,使网络层IP数据报的报头中的IP地址信息解析出目标硬件地址MAC地址,以保证通信顺利进行         


13.TCP的三次握手与四次挥手

3次握手建立连接:(1)客户端发送连接请求报文

                                  (2)服务器端接受连接后回复ACK报文,并为这次连接分配资源

                                  (3)客户端收到ACK报文后也向服务器端发送ACK报文,并分配资源

4次挥手断开连接:假设客户端发起(1)client发起中断连接请求,向server发送FIN报文“client已经没有数据要发送给server”

                                                               (2)若server还有数据没发送完,则不必关闭socket,server给client发送ACK报文告诉client“server已经收到client的请求,但server还没有准备好,请继续等待消息”

                                                                (3)server确定数据发送完成后,向client 发送FIN报文告诉client“server数据已发完,准备好关闭连接”

                                                                 (4)client收到FIN后知道可以关闭连接但它不相信网络,怕server不知道要关闭,client会发送ACK给server,发送完后client进入TIME—WAIT状态,server收到ACK后,知道可以断开连接就关闭了,client等待2MSL后没有收到回复,证明server已关闭,client才关闭