汇编如何同时对两个或多个任务执行多任务编程?

Eri*_*fat 0 x86 assembly tasm

我知道人们会讨厌我什至不显示任何代码,但是从理论上讲,例如,汇编程序如何才能显示功能菜单并同时播放歌曲?还是喜欢玩游戏并同时设置计时器,这怎么可能?

我看不到该怎么办,因为处理器只有一个代码段,也许我可以制作2个汇编文件,并且处理器可以以某种方式工作?

mev*_*ets 5

如果我正确理解了您的问题,那么您想知道多任务处理(不相关程序的持续前进)如何工作。如果您要执行的cpus数量很多,这很容易-为每个CPU使用一个CPU。如果不这样做,则需要通过在程序之间快速切换来共享它们。如果程序花费大量时间等待外部I / O运行,或者不需要CPU的全部计算能力,则这种快速切换效果很好。

例如,如果您想在扬声器上产生纯正弦波,则需要每22微秒(usec)产生一个音频样本,即音频再现的标准速率1 / 44,000。如果花费0.5usec在进程之间进行切换;0.1usec计算sin(),1usec切换扬声器;您只会使用(0.5 + 0.1 + 1)/ 22大约7%的CPU来执行此操作,而将93%的CPU留给其他程序使用。

在此示例中存在隐藏的复杂性和简化性。需要知道您的代码需要每22微秒运行一次。并且无法运行您的代码会带来可怕的后果(如果爆裂声和裂纹声非常可怕)。但是,一旦您填写了详细信息,就可以了。

OK,实际问题

单个程序也可以将注意力分散在多个活动之间。人们最常用的方法是线程。两个线程共享一个地址空间,但是具有专用寄存器集和一些专用堆栈。在支持完全独立线程的系统中,一个可以执行上面概述的音频操作,而另一个则保留在更典型的MVC模式中。一个潜在的问题是,各种运行时可能具有隐藏的同步,这可能导致意外的延迟。

没有线程,它将变得越来越困难。UNIX信号概念允许针对某个事件(例如定时器关闭)安排相对异步的函数调用。因此,音频示例可以由信号处理程序执行。这里的复杂性可能令人痛苦,因为您的库可能必须(完全)处理因EAGAIN偶尔失败的系统调用。虽然许多系统调用本身都是可重新启动的,但不能保证。一个相关的问题是某些系统调用(甚至是库函数)可能会暂时禁止信号,这可能会导致音频程序错过其截止日期。

没有信号,这是非常困难的。您需要分析程序,以找到等待事件的每个点(例如,从键盘读取),并将其更改为异步操作。然后,您必须在程序中散布代码,以检查是否该将音频样本放到扬声器上了。考虑到22usec的要求,这很多。一旦完成,您可能将无法说服任何人说它可行。