BIO/NIO/AIO

①内核空间(kernel-Space):内核模块运行在内核空间,对应的进程处于内核态;

②用户空间(User-Space):用户程序运行在用户空间,对应的进程处于用户态。

内核态和用户态是操作系统的两种运行状态。

1.1、内核态操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内核空间,也有访问底层硬件设备的权限。内核空间总是驻留在内存中,它是为操作系统的内核保留的。应用程序是不允许直接在内核空间域进行读写,也是不允许直接调用内核代码定义的函数。

1.4、IO底层

设置缓冲区的目的为:减少频繁地与设备之间的物理交换。

有了内核缓冲区,操作系统会对内核缓冲区进行监控,等待缓冲区达到一定数量时,再进行IO设备的中断处理,集中执行物理设备的实际IO操作,通过这种机制来提升系统的性能。至于具体在什么时候执行系统中断(包括读中断、写中断),则由系统的内核来决定,应用程序不需要关心这个问题。

上层应用程序使用sys_read系统调用时,仅仅是吧数据从内核缓冲区复制到了进程缓冲区;

而在使用sys_write系统调用时,仅仅是把数据从进程缓冲区复制到了内核缓冲区。

IO的基本概念

1、阻塞IO和非阻塞IO网卡同步数据到内核缓冲区,如果内核缓冲区中的数据未准备好,用户进程发起read操作,阻塞则会一直等待内存缓冲区数据完整后再解除阻塞,而非阻塞则会立即返回不会等待,注意,内核缓冲区与用户缓冲区之间的读写操作肯定是阻塞的。

2、同步和异步同步:调用者主动发送请求,调用者主动等待这个结果返回,一旦调用就必须有返回值;异步:调用发出后直接返回,所以没有返回结果。被调用者处理完成后通过回调、通知等机制来通知调用者。

我觉得它不属于一种单独的IO模型,只是IO中一种提高用户态与内核态交换数据的效率,原本是每次交换只交换一个,通过多路复用后,加入了一个文件描述符fd,一次交换可以交换多个IO的状态数据。

select使用了一个fd_set集合来保存需要监控的文件描述符,并提供了select()函数来检查这些文件描述符的状态。当调用select()函数时,内核会遍历这个fd_set集合,检查每个文件描述符的状态是否就绪。如果某个文件描述符就绪,select()函数就会返回,否则会阻塞程序直到有文件描述符就绪或超时。

监视的文件描述符数量有最大限制,通常为1024,增加数量会降低性能。

3.2、poll

3.3、epollepoll可以理解为eventpoll,它是一种事件驱动的I/O模型,可以用来替代传统的select和poll模型。epoll的优势在于它可以同时处理大量的文件描述符,而且不会随着文件描述符数量的增加而降低效率。(也即不需要遍历)

epoll的实现机制是通过内核与用户空间共享一个事件表,这个事件表中存放着所有需要监控的文件描述符以及它们的状态,当文件描述符的状态发生变化时,内核会将这个事件通知给用户空间,用户空间再根据事件类型进行相应的处理。

epoll使用了一个事件表(eventtable)来保存需要监控的文件描述符和相应的事件类型,并提供了epoll_ctl()函数来向事件表中添加、修改或删除文件描述符。与select和poll不同的是,epoll的设计更加高效,它使用了内核中的事件通知机制,可以避免遍历文件描述符集合,当文件描述符的状态发生变化时,内核会立即通知应用程序。这样可以避免遍历文件描述符集合,减少了不必要的CPU消耗,从而提高了效率。当调用epoll_wait()函数时,它会返回一个包含已就绪文件描述符的列表,并且它只返回那些真的有事件发生的文件描述符。这意味着它避免了遍历整个事件表,直接返回你感兴趣的文件描述符。

外卖点单–下完单出餐后由快递送过来,你在这期间可以去干别的事情

THE END
1.003Linux内核什么是内核空间,用户空间?注意:用户空间和内核空间之间的切换涉及到一定的开销,因此需要尽量减少切换的次数,提高系统的性能。 Linux中内核空间、用户空间的区别? 内存访问权限不同:内核空间的内存访问权限比用户空间更高,因为内核需要访问整个系统的物理资源,例如设备驱动、中断处理程序等。 https://blog.csdn.net/qq_41709234/article/details/131060489
2.内核空间和用户空间之间的差异腾讯云开发者社区内核空间和用户空间是操作系统中的两个重要概念,用于区分操作系统内核和用户程序的运行环境。它们之间的差异主要体现在以下几个方面: 1. 定义:内核空间是操作系统内核运行的环境,包含操作系统的核心功能和https://cloud.tencent.com/developer/information/%E5%86%85%E6%A0%B8%E7%A9%BA%E9%97%B4%E5%92%8C%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%E4%B9%8B%E9%97%B4%E7%9A%84%E5%B7%AE%E5%BC%82-article
3.Linux为什么区分内核空间和用户空间?Linux操作系统通过区分内核空间和用户空间的这种设计,将操作系统代码和用户程序代码分开,这样即使在某一个应用程序出错,也不会影响到操作系统,再说,Linux操作系统是多任务系统,其它应用程序不也还能运行。 现代操作系统基本上都是分内核空间和用户空间的做法,来保护操作系统自身的安全性和稳定性,这也是区分内核空间和用户https://www.51cto.com/article/701867.html
4.Linux内核空间与用户空间有什么不同问答Linux内核空间和用户空间是操作系统中的两个不同的运行环境。1. 权限:Linux内核空间具有更高的权限,可以直接访问硬件资源和操作系统的核心功能,如内存管理、进程调度、设备驱动等。用户空间则受到限制,不能直接访问这些核心功能,只能通过系统调用来请求内核执行特定的操作。2. 内存访问:内核空间可以直接访问整个系统的https://www.yisu.com/ask/5945656.html
5.Linux中内核空间与用户空间的区别在哪?Linux运维培训Linux作为近几年来十分热门的操作系统,被广大开发者所使用的,那在Linux后期的学习中,我们会接触到内核空间和用户空间,两者乍看都是空间,那究竟区别在哪?或者说我们什么情况该使用哪种更为合适呢?接下来老男孩教育通过这篇文章为大家介绍一下。https://www.oldboyedu.com/blog/3012.html
6.内核对象命名空间“Session\”前缀保留供系统使用,不应在内核对象的名称中使用它。 通过使用会话实现快速用户切换。 第一个登录用户使用会话 1,下一个登录用户使用会话 2 等。 内核对象名称必须遵循为远程桌面服务列出的准则,以便应用程序可以支持多个用户。 从会话零以外的会话创建全局命名空间中的文件映射对象或符号链接对象(例如使用https://msdn.microsoft.com/en-us/library/aa382954
7.硬核操作系统讲解内核空间:操作系统内核访问的区域,独立于普通的应用程序,是受保护的内存空间。内核态下CPU可执行任何指令,可自由访问任何有效地址。 用户空间:普通应用程序可访问的内存区域。被执行代码会受到CPU众多限制,进程只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址。 那为啥要搞俩空间呢?现在嵌入式环http://baijiahao.baidu.com/s?id=1705058832615063960&wfr=spider&for=pc
8.[转]Linux内核使用浮点问题出现这种问题的原因是:内核由于性能原因,在内核运行的代码,内核在进行上下文切换时,不会主动保存和恢复浮点寄存器。这样可能会导致内核在进行浮点运算时,可能会破坏此时用户空间的浮点寄存器状态,导致用户空间的fpsimd_state状态异常,随后程序的行为将变的不可控。https://www.jianshu.com/p/c1b29f9dea97
9.Linux系统中,为何需要区分内核空间与用户空间?为什么黄章的魅族和雷军的小米走向了两个完全不同的结局? 195 万热度 4 深圳市实施赴港旅游「一签行」政策,珠海市实施赴澳旅游「一周一行」政策,赴港澳旅游新政释放了什么信号? 117 万热度 查看更多 ? ? AI 总结 Linux 系统中,为何需要区分内核空间与用户空间? 已引用 8 位答主的内容 查看AI 回答 赞同https://www.zhihu.com/question/553731336/answer/2675160636?utm_id=0