操作系统原理:在操作系统中,CPU竞争有很多策略,Unix系统使用的是时间片算法,而Windows则属于抢占式的。
在时间片算法中,所有的进程都拍成一个队列,操作系统按照他们的顺序,给每个进程分配一段时间。如果时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。
所谓抢占式操作系统,就是说如果一个进程得到了CPU时间,则除非它自己放弃使用CPU,否则将完全霸占CPU。因此可以看出,在抢占式操作系统中,操作系统假设所有进程都是“人品很好”的,会主动退出CPU。在抢占式操作系统中,假设有若干进程,操作系统会根据他的优先级、饥饿时间,给他们一个总的优先级。然后操作系统就会把CPU交给总优先级最高的这个进程。当进程执行完毕或自己挂起时,操作系统会在计算一次所有进程的总优先级,然后挑选一个优先级最高的把CPU控制权交给他。
假设现在是2020-11-12 12:00:00.000,如果调用一下 Thread.Sleep(100) ,在 2020-11-12 12:00:01.000 的时候,这个线程会不会被唤醒?并一定会被立刻唤醒,因为我们只是告诉操作系统,在未来100毫秒内不参与CPU竞争,在100毫秒后也许有别的线程在使用CPU,也有可能操作系统在进行CPU权限分配时,当前线程的总优先级并不是最高的那个,CPU还是会被别的线程抢占去。
当代码中使用Thread.Sleep(0)时,Sleep 0毫秒,会使操作系统立刻进行一次CPU竞争,竞争的结果就是也许当前线程仍然获得CPU使用权,也许会换成其他线程获得CPU的使用权。