阻塞I / O来自哪里?

时间:2018-05-25 15:15:13

标签: multithreading operating-system multiprocessing scheduling multitasking

我的理解是硬件架构和操作系统的设计不是为了阻止cpu。当需要进行任何类型的阻塞操作时,操作系统会记录中断并继续执行其他操作,确保始终有效地使用cpu的宝贵时间。

这让我想知道为什么大多数编程语言都是使用阻塞API设计的,但最重要的是,由于操作系统在IO方面以异步方式工作,注册中断并在以后准备好时处理结果,我我真的很困惑我们的编程语言API如何逃避这种异步。操作系统如何使用阻塞API为我们的编程语言提供同步系统调用?

这种同步来自哪里?当然不是硬件级别。那么,在触发某些中断之前,我不知道旋转和旋转的某个地方是否存在无限循环?

1 个答案:

答案 0 :(得分:1)

  

我的理解是硬件架构和操作系统的设计不会阻止cpu。

任何合理设计的操作系统都会有一个系统服务界面,可以满足你的要求。但是,有许多非理性的操作系统在进程级别上不能以这种方式工作。

阻塞I / O比非阻塞I / O更容易编程。让我举一个VMS操作系统的例子(Windoze以同样的方式工作)。 VMS有一个名为SYS $ QIO和SYS $ QIOW的系统服务。即,队列I / O请求和队列I / O请求并等待。系统服务具有相同的参数。一对参数是完成例程的地址和该例程的参数。但是,这些参数很少与SYS $ QIOW一起使用。

如果您进行SYS $ QIO呼叫,它会立即返回。当I / O操作完成时,完成例程被称为软件中断。然后,您必须在应用程序中执行中断编程。我们一直这样做。如果您希望应用程序能够同时读取100个输入流,则必须采用这种方式。它比使用一个设备进行简单的阻塞I / O更复杂。

如果编程语言要将这样的回调系统合并到其I / O语句中,那么它将镜像VMS / RSX / Windoze。 Ada使用任务概念以独立于操作系统的方式实现此类系统。

在Eunuchs世界中,传统的做法是为每个设备创建一个单独的过程。在您必须读取和写入每个设备之前,这更简单。