所有现代操作系统都支持多任务处理。因此,每个正在运行的应用程序都会从 CPU 获得一定量的时间片用于其操作(取决于其需求)。
问题是,如果时间片总是被计算(我猜是这样的)那么为什么一个应用程序可以使整个操作系统(或机器)停滞。
假设我正在使用 VLC 播放器播放音轨。然后我运行 NetBeans(一个 IDE)。然后 VLC 播放器的声音开始断断续续(这种情况会一直持续到 NetBeans 完全响应为止)。但是,VLC 播放器的时间片应该始终完整无缺,对吗?或者它只是为新软件重新分配新的时间片,从而减少了已在运行的应用程序所需的时间片?
答案1
为什么启动新应用程序会导致系统卡顿
然后 VLC 播放器的声音开始断断续续
你只提供了一个“口吃”的例子,而且它不是系统卡顿,但应用程序对 I/O 延迟很敏感。简而言之,您的系统已达到 I/O 带宽的极限。
因此,每个正在运行的应用程序都会从 CPU 获得一定量的时间片来进行操作(取决于它们的需求)
可能是,也可能不是。操作系统调度程序可以使用时间片为每个进程分配 CPU 时间,或者可以使用优先级抢占方案。或者,如果使用协作调度,可以允许进程独占 CPU,直到它放弃控制权。“现代操作系统”将为系统和应用程序程序员提供许多选项来定制调度。
但是我们假设您的示例中使用的是循环时间分片调度。VLC 播放器应归类为I/O密集型程序,而不是CPU 密集型本质上 VLC 播放器重复
- 读取数据(从磁盘文件)
- 将数据写入(音频设备)
VLC 播放器不会利用其时间片进行密集计算,而主要用来执行输入或输出操作,然后暂停,直到 I/O 操作完成。根据操作系统调度程序的不同,时间片的未使用部分可能会在下一次循环中被返还给进程,以获得更长的时间片,或者进程会失去它,或者进程会在 I/O 完成后立即跳到就绪队列的头部。具体会发生什么取决于操作系统调度程序的实现方式。例如,Linux 内核可以构建为使用多个调度程序之一,每个调度程序针对不同类型的进程具有不同的“公平性”特性。
然后,当您启动 NetBeans 时,您会启动一系列磁盘读取操作来定位和加载应用程序代码和共享库。很可能这些额外的磁盘活动与 VLC 播放器请求混合在一起,导致每次读取 VLC 的时间都超过可接受的延迟,因此音频设备缺乏数据,因此会出现可听见的“卡顿”。
不幸的是,调度程序往往专注于分配 CPU 资源,难以(或避免处理)不可预测的 I/O 问题。您可以尝试使用更快的磁盘驱动器,和/或将音频文件放在与 OS + 程序驱动器不同的驱动器上。
您的问题与即时的和近实时系统,用于处理对事件的可靠和快速/可预测的响应。视频和音频的播放不能容忍可变的 I/O 延迟,并且具有一些特征近实时系统。如果操作系统具有进程优先级等功能,玩家应该采用近实时系统中使用的技术。
网络一直致力于处理低延迟流量而非普通流量,因为它必须解决 VoIP 的这一问题。大容量存储系统也需要类似的东西。
答案2
当一个应用程序是唯一一个尝试运行的应用程序时,操作系统如何能为它提供与当其他 18 个应用程序尝试运行时相同的 CPU 数量?唯一的方法是,即使它是唯一的应用程序,它也只为该应用程序提供一小部分可用资源。这显然会是一场灾难。
当系统必须运行两个应用程序时,对于它们都希望使用的每种资源,大致来说,每个应用程序都可以获得一半的可用资源。如果它们都需要大量内存,它们将各获得一半。如果它们都需要大量磁盘 I/O,它们将各获得一半。如果它们都需要大量 CPU 时间,它们将各获得一半。或多或少。
如果是三次申请,他们不可能都获得超过 1/3。
调度程序处理 CPU 时间的方式各不相同。但以单核系统为例,其工作原理如下:如果只有一个准备运行的任务,则该任务在完成一个时间片后立即开始新的时间片。如果有两个准备运行的任务,则它们交替使用时间片。
实际上,情况要复杂得多。例如,如果某个任务没有用完其全部时间片,它通常会获得优先级提升。如果某个任务被系统 I/O 中断,情况也可能如此。实际上,这往往会使系统响应更快。(想象一下,您长时间盯着一个网页,然后单击一个按钮。由于您的浏览器在您阅读时表现良好并让出 CPU,因此当它突然需要 CPU 时,它会因表现良好而获得奖励并提高交互性。)