首页 > 编程知识 正文

post请求参数,nginx获取不到静态文件

时间:2023-05-03 07:22:55 阅读:19387 作者:4543

发送文件

当前流行的web服务提供了sendfile选项来提高服务性能,但什么是sendfile呢? 它是如何影响性能的呢? sendfile实际上是Linux2.0或更高版本的系统调用,web服务器可以通过调整其配置来决定是否使用sendfile系统调用。 首先,让我们看看不使用sendfile的传统网络传输过程。

读取(file,tmp_buf,len );

write (套接字,tmp_buf,len );

hddkernelbufferuserbufferkernelsocketbuffer协议栈

通常,网络APP应用程序通过读取硬盘上的数据并将数据写入套接字来完成网络传输。 上面两行用代码说明了这一点,而上面两行简单的代码掩盖了很多基础操作。 看看下面的图层是如何运行上面两行代码的:

1、系统调用读取) )生成上下文开关。 从用户模式切换到kernel模式,DMA执行复制并将文件数据从硬盘读取到kernel buffer。

2、数据从kernel buffer复制到user buffer,系统调用读取) )返回。 此时,会出现从kernel mode切换到user mode的上下文开关。

3、系统调用write ) )从用户模式切换到kernel模式,将步骤2中读入到用户缓冲器的数据复制到kernel缓冲器中(数据是第二次复制到kernel缓冲器中)

4、系统调用write ()返回,发生上下文开关。 从kernel mode切换到用户模式)第四次切换),然后DMA将数据从kernel buffer复制到协议栈)第四次复制)。

在上面的四个步骤中,我们发现如果有四个上下文交换机、四个副本,并且可以减少交换机和复制次数,则性能会得到有效提高。 在kernel 2.0版中,系统调用sendfile ()用于简化上述步骤以提高性能。 sendfile ()不仅可以减少切换次数,还可以减少复制次数。

让我们看看在sendfile ()中进行网络传输的过程。

sendfile(socket,file,len );

hddkernelbuffer (快速复制到kernelsocketbuffer )协议栈

1、系统调用sendfile ()通过DMA将硬盘数据复制到kernel buffer,然后数据通过kernel直接复制到另一个socket相关的kernel buffer。 这里没有用户模式和密钥模式的切换,而是直接进行了从作为密钥的缓冲器到另一个缓冲器的复制。

2、DMA将数据直接从kernelbuffer复制到协议栈,无需切换,无需将数据从用户模式复制到kernel模式。 因为数据在kernel上。

参考文章: http://www.th7.cn/system/Lin/201306/41314.shtml

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。