问题描述
让我们使用简单的示例。我在池中有 1个核心和 1个线程,其中有两个cpu绑定的任务持续很长时间。由于一个线程在1个内核上运行,因此从开始到结束都不会中断。然后运行第二个任务。
但是让我们把这个变得有趣。我在池中添加了另一个线程(大小= 2),但仍在该1核上工作。现在,我使线程1与任务1一起工作,并使线程2与任务2一起工作。这很不好,因为我会得到著名的 time-slicing 。
引进它要付出多少代价?从线程1切换到线程2以及相反的线程需要做什么? 任何有用的资源都会很好。我需要知道操作系统更改执行线程时需要再次加载什么。
解决方法
现在,我使线程1与任务1一起工作,并使线程2与任务2一起工作。这很糟糕,因为我会得到著名的时间分片。
不一定有什么坏处;它使计算机可以同时完成两项任务,这通常是您想要的。
引进它要付出多少代价?
代价是您的操作系统的调度程序必须每隔几毫秒就进行一次上下文切换-这通常不大,因为调度程序的工作量(即在从执行切换到执行之前,它经过的时间量)一个线程调到足够长,以至于执行上下文切换的开销可以忽略不计。
另一个价格是,如果同时执行两个任务,则计算机必须同时将两个任务的数据保存在RAM中,这意味着最大RAM使用量要高于“一个任务”中的最大RAM使用量。时间情况。这是否有意义取决于两个任务使用多少RAM。如果一个任务的工作集在很大程度上适合可用的缓存空间,而两个任务的工作集都不适合,则在两个数据集之间来回切换也可能会稍微降低CPU缓存的有效性。
从线程1切换到线程2需要进行时间切片吗 相反吗?
要进行上下文切换,操作系统的调度程序必须对计时器中断做出反应(这将导致调度程序例程运行),将所有CPU内核寄存器的当前值保存到RAM缓冲区中,然后加载将其他线程的寄存器值(先前保存它们的RAM缓冲区)从其返回到CPU内核的寄存器中,然后为调度程序下次运行时设置一个中断计时器。