汇编程序如何同时处理两个或多个任务?
How Can Assembly Program Multitask Two Or More Tasks In The Same Time?
我知道人们会因为我什至不显示任何代码而讨厌我,但从理论上讲,例如,汇编程序如何显示功能菜单并同时播放歌曲?
或者喜欢玩游戏的同时有一个计时器,怎么可能?
我不知道如何做到这一点,因为处理器只有一个代码段,也许我可以制作 2 个汇编文件,处理器会以某种方式处理它?
如果我正确理解你的问题,你想知道多任务处理——无关程序的持续前进——是如何工作的。
如果您有与要做的事情一样多的 cpu,那很容易——为每个事情使用一个 cpu。如果不这样做,则需要通过在程序之间快速切换来共享它们。如果程序花费大量时间等待外部 I/O 运行,或者不需要 cpu.
的全部计算能力,这种快速切换效果很好。
例如,如果您想在扬声器上生成纯正弦波,则需要每 22 微秒 (usec) 生成一个音频样本,即 44,000 分之一,这是音频再现的标准速率。如果在进程之间切换需要 0.5usec; 0.1usec 用于计算 sin(),1 usec 用于切换扬声器;您只会使用 (0.5+0.1+1)/22 cpu 的大约 7% 来执行此操作,而 cpu 的 93% 可用于其他程序。
这个例子中隐藏着复杂性和简化性。需要知道的是,您的代码需要每 22 usec 运行;并且 运行 您的代码失败会产生可怕的后果(如果爆裂声和噼啪声很可怕)。但是一旦你填写了细节,就差不多了。
OK,正题:
单个程序也可以将注意力分散到多个活动中。人们为此使用的最常用方法是线程。两个线程共享一个地址 space,但具有私有寄存器集和一些私有堆栈。在支持完全独立线程的系统中,一个可以执行上述音频操作,而另一个则保持更典型的 MVC 模式。一个潜在的问题是各种 运行 时间可能具有隐藏的同步,这可能会导致意外的延迟。
没有线程,就越来越难了。 UNIX 信号概念允许相对于某些事件(如定时器启动)安排相对异步的函数调用。所以音频示例可以由信号处理程序执行。这里的复杂性可能令人痛心,因为您的库可能必须(完美地)处理偶尔因 EAGAIN 而失败的系统调用;虽然许多系统调用本身是可重启的,但这并不能保证。一个相关的问题是某些系统调用(甚至库函数)可能会暂时抑制信号,这可能会导致音频程序错过最后期限。
没有信号,很难。您需要分析您的程序以找到它等待事件(例如从键盘读取)的每个点,并将它们更改为异步操作。然后,您必须在整个程序中添加代码,以检查是否到了将音频样本放入扬声器的时间。鉴于 22usec 的要求,这是很多洒水。完成后,您可能无法说服任何人它有效。
这种多任务(线程)的调度通常是操作系统的用途,它提供了设置定时器的开销,这会导致处理器中断,这使得它保存了当前的程序计数器和寄存器内容等并加载程序计数器并注册下一个任务(线程)的内容并继续处理它。
定时器通常是处理器的一部分,也就是说,特定的汇编指令将设置它在后台(=在硬件中)运行,而处理器不需要任何操作。只有当计时器到期时,处理器才会显示一个中断标志,然后处理器将保存其当前状态并跳转到您(或操作系统)将保存代码的预定义位置,该代码将决定处理器下一步应该做什么.
我知道人们会因为我什至不显示任何代码而讨厌我,但从理论上讲,例如,汇编程序如何显示功能菜单并同时播放歌曲? 或者喜欢玩游戏的同时有一个计时器,怎么可能?
我不知道如何做到这一点,因为处理器只有一个代码段,也许我可以制作 2 个汇编文件,处理器会以某种方式处理它?
如果我正确理解你的问题,你想知道多任务处理——无关程序的持续前进——是如何工作的。 如果您有与要做的事情一样多的 cpu,那很容易——为每个事情使用一个 cpu。如果不这样做,则需要通过在程序之间快速切换来共享它们。如果程序花费大量时间等待外部 I/O 运行,或者不需要 cpu.
的全部计算能力,这种快速切换效果很好。例如,如果您想在扬声器上生成纯正弦波,则需要每 22 微秒 (usec) 生成一个音频样本,即 44,000 分之一,这是音频再现的标准速率。如果在进程之间切换需要 0.5usec; 0.1usec 用于计算 sin(),1 usec 用于切换扬声器;您只会使用 (0.5+0.1+1)/22 cpu 的大约 7% 来执行此操作,而 cpu 的 93% 可用于其他程序。
这个例子中隐藏着复杂性和简化性。需要知道的是,您的代码需要每 22 usec 运行;并且 运行 您的代码失败会产生可怕的后果(如果爆裂声和噼啪声很可怕)。但是一旦你填写了细节,就差不多了。
OK,正题:
单个程序也可以将注意力分散到多个活动中。人们为此使用的最常用方法是线程。两个线程共享一个地址 space,但具有私有寄存器集和一些私有堆栈。在支持完全独立线程的系统中,一个可以执行上述音频操作,而另一个则保持更典型的 MVC 模式。一个潜在的问题是各种 运行 时间可能具有隐藏的同步,这可能会导致意外的延迟。
没有线程,就越来越难了。 UNIX 信号概念允许相对于某些事件(如定时器启动)安排相对异步的函数调用。所以音频示例可以由信号处理程序执行。这里的复杂性可能令人痛心,因为您的库可能必须(完美地)处理偶尔因 EAGAIN 而失败的系统调用;虽然许多系统调用本身是可重启的,但这并不能保证。一个相关的问题是某些系统调用(甚至库函数)可能会暂时抑制信号,这可能会导致音频程序错过最后期限。
没有信号,很难。您需要分析您的程序以找到它等待事件(例如从键盘读取)的每个点,并将它们更改为异步操作。然后,您必须在整个程序中添加代码,以检查是否到了将音频样本放入扬声器的时间。鉴于 22usec 的要求,这是很多洒水。完成后,您可能无法说服任何人它有效。
这种多任务(线程)的调度通常是操作系统的用途,它提供了设置定时器的开销,这会导致处理器中断,这使得它保存了当前的程序计数器和寄存器内容等并加载程序计数器并注册下一个任务(线程)的内容并继续处理它。
定时器通常是处理器的一部分,也就是说,特定的汇编指令将设置它在后台(=在硬件中)运行,而处理器不需要任何操作。只有当计时器到期时,处理器才会显示一个中断标志,然后处理器将保存其当前状态并跳转到您(或操作系统)将保存代码的预定义位置,该代码将决定处理器下一步应该做什么.