加入收藏 | 设为首页 | 会员中心 | 我要投稿 新余站长网 (https://www.0790zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

30万单就这样没了!

发布时间:2021-02-11 16:52:03 所属栏目:动态 来源:互联网
导读:在这里,我们看到计算机最底部是各种硬件,包括芯片,主板,磁盘,键盘,显示器等。在硬件之上则是软件。大多数计算机都有两种操作模式:内核模式和用户模式。 内核模式Kernel Mode: 在内核模式下,程序具有硬件的所有控制权限,可以执行所有CPU指令,可以

在这里,我们看到计算机最底部是各种硬件,包括芯片,主板,磁盘,键盘,显示器等。在硬件之上则是软件。大多数计算机都有两种操作模式:内核模式和用户模式。

内核模式Kernel Mode:

在内核模式下,程序具有硬件的所有控制权限,可以执行所有CPU指令,可以访问任意地址的内存。在内核模式下的任何异常都是灾难性的,将会导致整台机器停机。

用户模式User Mode:

在用户模式下,程序没有对硬件的直接控制权限,也不能直接访问地址的内存。程序是通过调用系统接口API来访问硬件和内存。在这种保护模式下,即使程序发送崩溃也是可以恢复的。
 

然一般来说这样漂亮的用户界面通常不属于操作系统,但可看作它是操作系统的一部分,通过操作系统来完成其底层复杂的与硬件层面的交互工作。

现今的计算机是一个极其复杂的系统,一般由一个或多个处理器,以及一些主内存、磁盘、网络接口、各种外设以及各种其他输入/输出设备组成。如果每个程序员都必须详细了解所有这些硬件层面的原理和机制,然后才能编写相应的代码,那么可想而知这样的效率会有多低。
 

异步IO的效率是最高的。

异步IO通过aio_read函数实现,aio_read提交请求,并递交一个用户态空间下的缓冲区。即使内核中没有数据到来,aio_read函数也立刻返回,应用程序就可以处理其他的事情。

当数据到来后,操作系统自动把数据从内核空间拷贝到aio_read函数递交的用户态缓冲区。拷贝完成以信号的方式通知用户态程序,用户态程序拿到数据后就可以执行后续操作。

异步IO和信号驱动IO的不同?

在于信号通知用户态程序时数据所处的位置。异步IO已经把数据从内核空间拷贝到用户空间了;而信号驱动IO的数据还在内核空间,等着recv函数把数据拷贝到用户态空间。

异步IO主动把数据拷贝到用户态空间,主动推送数据到用户态空间,不需要调用recv方法把数据从内核空间拉取到用户态空间。异步IO是一种推数据的机制,相比于信号处理IO拉数据的机制效率更高。

推数据是直接完成的,而拉数据是需要调用recv函数,调用函数会产生额外的开销,故效率低。
 

这种方式使异步处理成为可能,信号是异步处理的基础。

在 Linux 中,通知的方式是信号:

如果这个进程正在用户态忙着做别的事,那就强行打断之,调用事先注册的信号处理函数,这个函数可以决定何时以及如何处理这个异步任务。由于信号处理函数是突然闯进来的,因此跟中断处理程序一样,有很多事情是不能做的,因此保险起见,一般是把事件 “登记” 一下放进队列,然后返回该进程原来在做的事。

如果这个进程正在内核态忙着做别的事,例如以同步阻塞方式读写磁盘,那就只好把这个通知挂起来了,等到内核态的事情忙完了,快要回到用户态的时候,再触发信号通知。

如果这个进程现在被挂起了,例如无事可做 sleep 了,那就把这个进程唤醒,下次有 CPU 空闲的时候,就会调度到这个进程,触发信号通知。

异步 API 说来轻巧,做来难,这主要是对 API 的实现者而言的。Linux 的异步 IO(AIO)支持是 2.6.22 才引入的,还有很多系统调用不支持异步 IO。Linux 的异步 IO 最初是为数据库设计的,因此通过异步 IO 的读写操作不会被缓存或缓冲,这就无法利用操作系统的缓存与缓冲机制。

很多人把 Linux 的 O_NONBLOCK 认为是异步方式,但事实上这是前面讲的同步非阻塞方式。需要指出的是,虽然 Linux 上的 IO API 略显粗糙,但每种编程框架都有封装好的异步 IO 实现。操作系统少做事,把更多的自由留给用户,正是 UNIX 的设计哲学,也是 Linux 上编程框架百花齐放的一个原因。

异步IO

(编辑:新余站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读