3

我来自网络编程领域,通常服务器通过指定的方法(get、post 等)设置一个超全局变量,使用户输入到字段中的数据可用。另一种方法是使用 AJAX 向事件注册回调方法,一旦浏览器通知 AJAX XMLhttpRequest 对象将启动该事件(我假设......)。所以我想我的问题是,是否存在某种调度接口,系统程序员的代码必须与之交互以响应用户输入来执行,或者程序员是否直接控制“等待”过程?如果有调度,操作系统中是否存在等待特定事件发生的循环结构?

我被提示在这里问这个问题,因为我在一个基本的编程逻辑课上,教授不会回答这样一个“复杂”的问题。我的书给出了一个模糊的伪代码示例,例如:

    //start
    sentinel_val = 'stop';
    get user_input;
while (user_input not equal to sentinel_val)
     {
         // do something.
         get user_input;
     }
     //stop

这个例子让我相信 1) 如果没有收到用户的输入,循环将继续重复序列“做某事”,用旧的或没有输入,直到新的输入神奇地出现,然后它会再次重复,或者一个空值。这本书似乎试图使用启动和读取文件的示例来传达程序如何从事件驱动的输入中获取数据,不是吗?

我很困惑 :(

4

4 回答 4

5

在最低级别,计算机的输入是异步的——它通过“中断”发生,这基本上是 CPU(键盘控制器)外部的东西向 CPU 发送一个信号,表示“停止你正在做的事情并接受这个数据”。(这很复杂,但这是一般的想法)。因此,CPU 停止,抓住击键,并将其放入缓冲区以进行读取,然后继续执行中断前的操作。

入站网络流量以及从磁盘读取的结果等会发生非常相似的事情。

在更高的层次上,它更加依赖于您正在使用的操作系统或框架。

使用键盘输入,可能有一个进程(基本上是应用程序)被阻塞,等待用户输入。该“块”并不意味着计算机只是坐在那里等待,而是让其他进程运行。但是当键盘结果进来时,它会唤醒正在等待它的人。

从等待过程的角度来看,他们调用了某个函数“get_next_character()”,该函数与字符一起返回。等等。

坦率地说,所有这些东西如何联系在一起非常有趣且易于理解。:)

于 2010-02-18T01:21:03.783 回答
2

操作系统由硬件事件(称为中断)驱动。操作系统不会等待中断,而是执行特殊指令以使 CPU 在循环中小睡。如果发生硬件事件,将调用相应的中断。

于 2010-02-18T01:20:05.860 回答
2
It seems the book has tried to use the example of priming and reading from a file
to convey how a program would get data from event driven input, no?

是的,这就是这本书正在做的事情。事实上...... unix 操作系统是建立在抽象任何设备的所有输入和输出的想法上的,看起来像这样。

实际上,大多数操作系统和硬件都利用中断跳转到我们可以调用的子程序来执行低级数据读取,然后将控制权返回给操作系统。

同样在大多数系统上,许多设备独立于操作系统的其余部分工作,并向操作系统提供高级 API。例如,计算机进程上的键盘端口(或者更好的例子是网卡)会自行中断,然后键盘驱动程序会向操作系统提供不同的 api。您可以查看设备标准以了解它们是什么。例如,如果您想知道键盘端口提供的 api,您可以查看 linix 发行版中键盘驱动程序的源代码。

于 2010-02-18T01:20:18.740 回答
1

基于我的理解的基本解释......

您的get user_input伪函数通常类似于readLine. 这意味着该函数将阻塞,直到读取的数据包含换行符。

在此之下,操作系统将使用中断(这意味着它不会不必要地处理键盘,而仅在需要时)以允许它在用户按下某些键时做出响应。键盘中断将导致执行跳转到一个特殊的例程,该例程将用来自键盘的数据填充输入缓冲区。然后,操作系统将允许适当的进程(通常是活动的进程)使用readLine函数来访问这些数据。

那里有更多的复杂性,但这是一个简单的观点。如果有人提供更好的解释,我会心甘情愿地向高级知识低头。

于 2010-02-18T01:19:52.443 回答