我在读这本书到目前为止,在第 3 章中,我了解到多道程序设计和多处理允许更快地执行多个现有进程/线程。我正在研究它们的所有复杂性,到目前为止一切都理解得很好。但是,还提到,当一个程序使用 I/O 模块时,另一个程序必须等待,这多次暗示两个程序不能同时使用 I/O 模块。
也许我问得太早了,这个问题在本书后面的某个地方会讲到,但现在 - 此时此刻 - 我禁不住想知道,我怎么可能让 VLC media player 和 Windows Media Player 在我的计算机上播放不同的视频,而音频却是两个视频声音的组合。是不是 I/O 中进程的执行也带有某种计时器?或者是不是我的计算机有多个 I/O(在本例中是音频/扬声器)模块?如果是这样,是否有限制?这本书中是否有我可以跳转到某处阅读的内容?或者也许有某个网站对此进行了解释?
答案1
有几件事需要考虑。首先请注意,模拟音频不同于通常以 48khz 的比特率传输的数字音频(模拟比特率理论上是无限的)。如果以更高的频率(比如可能是 1Mhz)查看它,您会看到比特之间的“空洞”,您可以利用这段时间做其他事情,比如处理第二个流。
第二点需要注意的是南桥处理音频编解码器处理,因此流不需要通过整个系统总线。在南桥和声卡本身之间,许多处理是在靠近源总线的地方完成的(超级IO 控制器)
第三,请注意南桥与 SuperIO 控制器有多个连接,并且它们之间的总线(在现代计算中)以 GHz 为单位进行测量,Sata 比特率也是如此。
第四,请注意,流是一种连续现象,因此从磁盘读取流的线程无法及时“完成”,因此它可以以同步方式将执行权交给另一个线程。在这种情况下,如果系统无法连续为线程提供执行单元,则输入将在执行其他线程时被缓冲。系统必须能够对它们进行时间切片,否则单核系统永远无法播放声音文件。尽管如此,CPU 在音频处理方面并没有做太多事情。
高比特率的高清音频会给系统总线带来压力,并且在保持流畅播放的同时出现多线程问题。Windows Vista+ 会限制其他南桥流服务,例如网卡以确保流畅播放,但是一个配置良好且没有太大负载的系统可以毫无困难地同时渲染几个流。
所以,总而言之,即使您的系统在 IO 模块上受到限制,音频也足够慢以进行时间切片,依靠组合在一起的硬件和总线来避免与其他系统组件的瓶颈,并且不会对实际的 IO 通道造成压力。
答案2
有多个软件模块为软件混频器模块提供信息,而软件混频器模块又为硬件提供信息。每个应用程序都会保持声音数据队列不为空,因为混频器模块会将输入合并起来,产生一个驱动硬件的输出。