首页 > 编程知识 正文

内核函数结束进程,缓冲区和缓存区的区别

时间:2023-05-03 17:42:08 阅读:120065 作者:4470

用户空间和内核空间概念担心系统的核心是内核,它独立于常规APP应用程序,具有访问受保护内存空间和访问底层硬件设备的所有权限。 为了防止用户进程直接操作内核,确保内核的安全,心力系统将虚拟空间分为内核空间和用户空间两部分。

对于linux操作系统,操作系统为每个进程分配一个独立的连续虚拟地址内存空间。 此大小通常为4g(32位操作系统,即2的32次方),其中地址较高的内存空间分配给操作系统占用空间、linux os操作系统占用空间1G和窗口操作系统占用空间2G。 剩下的内存地址空间将分配给进程使用。

在linux系统中,内核使用的最大1G字节(虚拟地址0xC0000000到0xfffffff )、虚拟地址0x0000000到0 xbffffff )和低3gb被称为用户空间,以供每个进程使用因为每个进程都可以通过系统调用访问内核,所以Linux内核由系统中的所有进程共享。 因此,从具体过程的角度来看,每个过程可以有4gb的虚拟空间。

用户进程的缓冲区

缓冲区的目的是减少频繁与设备的物理交互。 因为外部设备的直接读写会导致操作系统的中断。 如果系统中断,则需要保存前面的工艺处理数据和状态等信息,但中断结束后,需要恢复前面的工艺处理数据和状态等信息。 为了减少这种基础系统的时间损失、性能损失,出现了内存缓冲器。 如果有内存缓冲器,则上层APP应用程序使用read系统调用时,只需将数据从内核缓冲器复制到进程缓冲器; 当上层APP应用程序调用write系统时,它只是将数据从进程缓冲区复制到内核缓冲区。 底层操作监视内核缓冲区,等待缓冲区达到一定数量,对IO设备执行中断处理,并集中执行物理设备的实际IO操作。

用户进程通过系统调用访问系统资源时,必须切换到内核状态,但这与特殊的堆栈和内存环境相对应,必须在系统调用之前建立。 系统调用结束后,cpu必须从核心模式返回到用户模式,堆栈必须返回到用户进程的上下文。 这个切换需要很多时间。

我们正在编写一些程序阅读文件。 首先申请称为buffer的内存数组,然后每次调用read,读取设定字节长度的数据并写入buffer。 (小次数满足缓冲区。 所有后续程序都从buffer中检索数据,在buffer使用后,进行以下调用以填充buffer。

所以“用户缓冲区的目的是为了减少系统调用次数,从而降低操作系统在用户态与核心态切换所耗费的时间。

内核缓冲区不仅在进程中设计缓冲区,而且内核也有自己的缓冲区。 当用户进程从磁盘读取数据时,内核通常会将内核缓冲区中的数据复制到处理缓冲区,而不是直接读取磁盘。 但是,如果内核缓冲区中没有数据,则内核会将对数据块的请求放入请求队列,然后挂起进程并为其他进程提供服务。 在将数据读取到内核缓冲区后,内核缓冲区中的数据将被读取到用户进程中,并通知进程。 当然,内核缓冲区的调度和使用方式因I/o模型而异。

read被认为是将数据从内核缓冲区复制到进程缓冲区。 write将进程缓冲区复制到内核缓冲区。 当然,write不一定会引起内核的写入行为。 例如,操作系统可能会积累一定量的内核缓冲区数据,然后再次写入。 因此,如果关闭电源,数据可能会丢失。

所以内核缓冲区,是为了在OS级别,提高磁盘IO效率,优化磁盘写操作。

详细了解典型的系统调用流在我们的用户程序空间中调用的读和写并不等效于内核缓冲器和磁盘之间的数据交换。 具体流程如下图所示。

这里,以read的套接字为例,主要有以下两个阶段。

首先,操作系统等待数据从网络到达网卡,当所有等待包到达时,操作系统将复制到内核中的缓冲区。

数据将从内核缓冲区复制到用户缓冲区

在此,以Java服务端为例,完成一次套接字请求和响应。 完整的过程如下。

客户端请求操作:服务器系统通过网卡读取客户端数据,并将数据读取到内核缓冲区

服务器获取请求数据: Java进程通过read系统调用从系统内核缓冲区读取数据,并将其存储在Java进程缓冲区中

进行服务端业务处理: Java流程完成相应的业务处理。

返回服务端数据: Java服务端调用系统的write将数据从进程缓冲区写入服务端内存缓冲区。

将数据发送到客户端:服务器的Linux内核将内核缓冲器中的数据写入网卡,网卡通过底层通信协议将数据发送到目标客户端。

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