一、同步和异步
同步:进程发出请求调用后,进程会一直处于等待状态,直到内核返回响应消息之后才能进行下一步操做,若是内核一直不返回数据,那么进程就会一直等待内核响应消息。
异步:进程发出请求调用后,进程无需等待内核返回响应消息,会进行其余的操做或者发送下一个调用请求。
阻塞:IO操做须要完全完成后才返回到用户空间,调用结果返回以前,调用者被挂起,没法进行其余操做,调用者只有在获得结果以后才会返回,该线程在此过程当中不能进行其余处理。
非阻塞:IO操做被调用后当即返回给用户一个状态,无需等到IO操做完全完成,最终的调用结果返回以前,调用者不会被挂起,能够去作别的事情。nginx
阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操做师被阻塞,用户线程经过系统调用read发起IO操做,由用户空间转到内核空间。内核等到数据包到达后,而后将接收的数据cp到用户空间,完成read操做,用户空间须要等待read将数据读取到buffer后,才继续处理接受的数据。整个IO请求的过程当中,用户线程是被阻塞的,这致使用户在发起IO请求时,不能作任何事情,对CPU的资源利用率不够。
优势:程序简单,在阻塞等待数据期间进程/线程挂起,基本不会占用CPU资源
缺点:每一个链接须要独立的进程/线程单独处理,这样虽然能够有效的利用CPU资源,可是代价就是多进程的大量内存开销。
同步阻塞:程序向内核发送IO请求后一直等待内核响应,若是内核处理请求的IO操做不能当即返回,则进程将一直等待并再也不接收新的请求,并由进程轮询查看IO是否完成,完成后进程将IO结果返回给Client,在IO没有返回期间进程不能接收其余用户的请求,并且只有进程本身去查看IO是否完成。web
数组
服务器
select模型:select模型经过一个select()系统调用来监视包含多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程能够得到这些文件描述符从而进行读写操做。select的一个缺点是单个进程可以监听的文件描述符的数量存在最大限制(Linux上通常为1024),因此加入使用select的服务器最多只能同时监听1024(64位操做系统默认为2048)个链接。因为nginx的prefork模型其底层所使用的的是select模型,所以nginx的prefork的最大链接数为1024。其次,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增加;因为网络响应时间的延迟使得大量的TCP链接处于非活跃状态,但调用select()会对全部socket进行一次线性扫描,因此在必定程度上浪费CPU时间。网络