同步与异步。nginx与apache

// 同步与异步:是一种消息通讯机制。

同步:执行请求,然后一直在等待答复。不干其他事情。

异步:执行请求,然后可以去干其他的了。等待对方会把结果送过来给你。(另行通知的概念)

 

// 阻塞与非阻塞:是程序等待结果时候的状态。

阻塞:进程在得到结果前,啥事也不干,就干等着。也就是被挂起。

非阻塞:进程在得到结果前,可以去干其他的事情,然后隔一阵去轮询一次结果。

——阻塞可以及时返回数据结果,非阻塞可以同时执行多个任务。但是单个返回结果时间可能会被延长

——阻塞与非阻塞,其实都是同步的。因为都需要你去轮询是否有结果了。

 

//  I/O模型

原因:进程是不可直接访问外部设备(比如磁盘),所以调用内核去调用外部的设备(上下文切换),外部设备(磁盘)读出存储在设备自身的数据传送给内核缓冲区,内核缓冲区在copy数据到用户进程的缓冲区。在外部设备响应的给到用户进程过程中,包含了两个阶段;由于数据响应方式的不同,所以就有了不同的I/O模型。

—— 总结:进程 -> 内核 -> 外部设备(读取自身数据) -> 内核缓冲区 -> 进程缓冲区

IO模型一般有5种:

1)阻塞式模型:默认情况下是同步的,进程挂起,等待内核调磁盘,磁盘返回数据给内核缓冲区。然后内核缓冲区才给进程缓冲区。

2)非阻塞式:进程调用内核开始,就不断轮询。浪费资源,很少用。

3)IO多路复用(select,poll,epoll...):可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数,也就是说一个线程可以响应多个请求。

select、poll:主动查询。

epoll:回调方式(也就是异步)。

=> 所以明显,在高并发中,select要一遍一遍的去轮询,而epoll只要等待通知即可。epoll效率显然高非常多。

4)信号驱动式:第一阶段是非阻塞的,当数据传送的kernel buffer后,直接用信号的方式通知线程,用的不多。

5)异步:在整个操作(包括将数据从内核拷贝到用户空间)完成后才通知用户进程。

 

// web一般请求流程

1、首先我们客户端发送一个请求到Web服务器,请求首先是到网卡。

2、网卡交给内核处理(拆包),发现请求的是80端口。

3、内核交给Web服务器,Web服务器解包发现客户端请求的index.html页面。

4、Web服务器便进行系统调用将请求发给内核。

5、内核发现在请求的是一页面,便调用磁盘的驱动程序,连接磁盘。

6、内核通过驱动调用磁盘取得的页面文件

7、内核将取得的页面文件保存在自己的缓存区域中便通知Web进程或线程来取相应的页面文件

8、Web服务器通过系统调用将内核缓存中的页面文件复制到进程缓存区域中

9、Web服务器取得页面文件来响应用户,再次通过系统调用将页面文件发给内核

10、内核进程页面文件的封装并通过网卡发送出去

11、当报文到达网卡时通过网络响应给客户端

 

// Apache和nginx比较:

由于web服务器是一对多的关系,通常完成并行处理的方式有多进程、多线程、异步三种方式。

1、多进程:每个进程对应一个连接来处理请求,进程独立响应自己的请求,一个进程挂了,并不会影响到其他的请求;而且设计简单,不会产生内存泄漏等问题,因此进程比较稳定。但是进程在创建的时候一般是fork机制,会存在内存复制的问题,另外在高并发的情况下,上下文切换将很频繁,这样将消耗很多的性能和时间。早期的apache使用的prework模型就多进程方式,但是apache会预先创建几个进程,等待用户的响应,请求完毕,进程也不会结束。因此性能上有优化很多。

2、多线程:每个线程响应一个请求,由于线程之间共享进程的数据,所以线程的开销较小,性能就会提高。由于线程管理需要程序自己申请和释放内存,所以当存在内存等问题时,可能会运行很长时间才会暴露问题,所以在一定程度上还不是很稳定。apache的worker模式就是这种方式

3、异步的方式:nginx的epoll,apache的event也支持,不多说了。

【apache】:同步多进程,一个连接对应一个进程。且IO模型是阻塞型。

【nginx】:异步非阻塞,多个连接(万级别)可以对应一个进程。工作方式也是多进程,一个master和多个woker进程(与cpu核数相同即可)。

 

转载于:https://www.cnblogs.com/windyet/articles/10012954.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值