1.liunx的内核态和用户态
1.1).用户空间与内核空间
liunx操心系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核,保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享
。空间分配如下图所示:
有了用户空间和内核空间,整个linux内部结构可以分为三部分,从最底层到最上层依次是:硬件-->内核空间-->用户空间。如下图所示:
1.2.需要注意的细节问题:
1.2.1) 内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。
1.2.2) Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。
1.2.3) 内核态与用户态:
1.当一个任务(进程)执行系统调用而陷入内核代码中执行时,称进程处于内核运行态(内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。
2.当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。
1.3) 进程上下文和中断上下文
当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。在LINUX中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程的执行。
2. IO分类
详细参考这篇博客: IO - 同步,异步,阻塞,非阻塞
2.1 阻塞blocking和非阻塞non-blocking IO,同步synchronous IO和异步asynchronous IO的区别在哪?
下面先说明一下四种io:(前3种属于同步IO,第4种属于异步IO,同步与异步IO最大区别在于进程是否会block)
blocking IO 阻塞IO
nonblocking IO 非阻塞IO IO multiplexing 非阻塞多路复用IO asynchronous IO 异步IO
对于一个network IO 会经历两个阶段,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel):1 等待数据准备 (Waiting for the data to be ready) 2.将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
2.2 blocking IO 阻塞IO
在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样:
1.当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。(用户态切换到内核态-准备数据)
2.对于network io来说,很多时候数据在一开始还没有到达,这个时候kernel就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。(用户态-阻塞,内核态-准备数据中)
3.当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果(用户态-阻塞,内核态-拷贝数据到用户进程)
4.用户进程才解除block的状态,重新运行起来。(用户态-解除阻塞,内核态-数据返回完毕)
特点:blocking IO的特点就是在IO执行的两个阶段都被block了。
2.3 non-blocking IO 非阻塞IO
linux下,可以通过设置socket使其变为non-blocking。java代码中修改如下:
服务端:
// 获得一个ServerSocket通道
ServerSocketChannel serverChannel = ServerSocketChannel.open();
// 设置通道为非阻塞
serverChannel.configureBlocking(false);
客户端:
// 获得一个Socket通道
SocketChannel channel = SocketChannel.open();
// 设置通道为非阻塞
channel.configureBlocking(false);
详细流程如下:
1.当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。(用户态 不阻塞------内核态-准备数据中)
2.从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是用户进程马上获取结果,如果结果是error,它就知道数据还没有准备好,于是它可以再次发送read操作。(用户态 不阻塞-------内核态-准备数据中)
3.一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。(用户态 进入阻塞-----内核态-拷贝数据回进程)
特点:用户进程其实是需要不断的主动询问kernel数据好了没有。
2.4 IO multiplexing 多路复用IO
IO multiplexing使用select,epoll机制,select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程(通过listener监听)。它的流程如图:
1.当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。(用户态-阻塞,内核态-准备数据中并通知)
2.这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。(用户态-阻塞,内核态-拷贝数据会用户进程)
特点:这里需要使用两个system call (select 和 recvfrom),而blocking IO只调用了一个system call (recvfrom)。但是,用select的优势在于它可以同时处理多个connection。
2.5 Asynchronous I/O 异步IO
linux下的asynchronous IO其实用得很少。先看一下它的流程:
用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。
2.6 各个IO Model的比较如图所示:
经过上面的介绍,会发现non-blocking IO和asynchronous IO的区别还是很明显的。在non-blocking IO中,虽然进程大部分时间都不会被block,但是它仍然要求进程去主动的check,并且当数据准备完成以后,也需要进程主动的再次调用recvfrom来将数据拷贝到用户内存。而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。
分享到:
相关推荐
无论是读取文件、向网络发送数据还是与用户进行交互,都需要用到IO操作。为了方便开发者进行这些操作,各种编程语言通常都会提供一系列的内置库或API,即所谓的IO标准库。 ### IO标准库的重要性 1. **简化开发过程...
1. **配置阶段**:首先,操作系统通过PCI配置空间来识别PCI9054,并获取其I/O基地址。这个基地址定义了PCI9054的I/O端口范围。 2. **初始化阶段**:开发者需要编程设置PCI9054的寄存器,包括I/O控制寄存器,以便...
操作系统中的I/O管理是至关重要的一个部分,它涉及到计算机系统如何有效地与外部设备交互,确保数据的高效传输和正确处理。I/O管理的目标是提高设备利用率,实现设备独立性,以及保证系统的稳定性和效率。 首先,...
### 从文件 IO 看 Linux 的虚拟文件系统 #### 引言 Linux 系统以其高度灵活性和可扩展性闻名,在文件系统方面更是如此。Linux 支持多种不同的文件系统,例如 ext2、ext3、ext4、vfat 等,并且能够在这些不同的文件...
Linux IO 之 IO 与网络模型是 Linux 操作系统中两个非常重要的概念,它们之间紧密相连,影响着系统的性能和响应速度。理解 IO 和网络模型的实现机理,可以帮助开发者更好地了解 Linux 操作系统,并提高系统的性能和...
在本主题中,我们将深入探讨“TwinCAT 3 Modbus TCP IO 自定义映射关系”,这是一个关键的通信机制,允许TwinCAT 3系统与支持Modbus TCP的设备进行数据交换。 首先,了解Modbus TCP的基础知识至关重要。Modbus TCP...
Apache Commons IO库是一个非常实用的辅助库,其中的`commons-io-1.4.jar`包含了大量对IO操作进行简化和扩展的工具类。例如: 1. **FileUtils**: 提供了大量静态方法来操作文件,如复制、移动、删除、比较文件等,...
1. **跨平台支持**:PlatformIO支持Windows、macOS和Linux操作系统,允许开发者在他们首选的平台上无缝地进行嵌入式开发。 2. **多框架兼容**:不仅限于Arduino和MBED,PlatformIO还支持众多其他嵌入式开发框架,如...
2. **多平台支持**:作为一个Web应用,draw.io可以在任何有浏览器的设备上运行,包括Windows、Mac、Linux等操作系统。 3. **丰富的模板库**:内含大量预设模板,涵盖各种用途,如组织架构图、流程图、概念图、逻辑...
3. **完成阶段**:一旦I/O操作完成,中断将被触发以通知操作系统,随后系统会进行相应的处理以释放资源。 #### 三、I/O模型的分类与特点 根据不同的操作系统和支持的技术,I/O模型可以分为以下几类: 1. **阻塞I/...
Socket.IO 是一个实时应用框架,它为开发人员提供了在 Web 应用中实现实时、双向通信的强大工具。基于 WebSocket 协议,Socket.IO 提供了更高级别的接口,能够处理各种网络条件下的连接问题,确保数据的可靠传输。在...
NIO提供了非阻塞的IO操作,通过Channel和Buffer对象实现。通道(Channel)类似于流,但它们是双向的,可以同时用于读写。缓冲区(Buffer)是用来存储数据的地方,读写操作都是通过通道与缓冲区进行交互。选择器...
随着信息技术的快速发展,Linux操作系统因其开源性、稳定性和安全性等特点,在服务器领域得到了广泛的应用。其中,SUSE Linux Enterprise Server(SLES)作为一款企业级的Linux发行版,受到了众多企业的青睐。然而,在...
总的来说,这个项目提供了一个练习Java IO操作和文件管理的机会,同时也展示了如何在没有数据库的情况下实现数据的持久化。虽然简化了用户界面和数据管理,但这个系统仍然涵盖了基础的软件工程实践和技术。
File类是Java.io包中的一个重要类,它提供了与文件和目录操作相关的功能。通过File对象,我们可以创建、删除、重命名文件,检查文件属性,以及获取文件路径等信息。 接下来,我们来看看IO流的层次结构。在Java中,...
本资料包包含了一份“高级IO思维导图”,这将帮助学习者系统地理解和掌握这一领域的关键概念和技术。 1. **Java传统IO** - Java传统IO基于流,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),...
计算机操作系统各种模拟程序,使用C语言编写。 包括:磁盘存储器管理模拟,单任务系统,独占设备分配模拟,内存的动态分区分配,请求分页存储管理模拟,生产者消费者问题,时间片轮转调度,实现前趋关系并发,文件...
在IT行业中,"Super IO"通常指的是一种特殊类型的输入/输出(I/O)控制器,它主要在个人计算机系统中用于管理低级别的硬件接口,如串行口、...学习这部分知识对于深入理解计算机硬件和操作系统与硬件之间的交互至关重要。
10. **跨平台性**:Drawio不仅有Windows版的.exe文件,还有Mac和Linux的版本,确保了不同操作系统用户的需求得到满足。 总结起来,Drawio是一款强大的免费绘图工具,其易用性、灵活性和协作性使其在各类用户群体...
进程是操作系统中的一项重要资源,它可以独立地占用系统的资源,如 CPU、内存、IO 设备等。每个进程都有其自己的虚拟地址空间、栈、寄存器、打开的文件描述符等资源。 2. 进程创建: 进程的创建是指操作系统创建一...