1.大多数调度器是按照线程调度的,而且,是的,你的线程越多你抢到的cpu也会越多,不过大多数情况下cpu是不用抢的,而计算密集的程序因为时刻处于就绪态也会比io密集的程序获得多得多的时间片,虽然通常计算密集程序的优先级更低
2.不过切个cr3没那么慢吧,而且触发各种中断的时候也可能切cr3,所以感觉对性能没多大影响……tlb不命中的开销确实是有一些的,不过切换线程也可能触发tlb不命中
3.调度肯定最终是调度到线程的,因为只有线程才有rip的值,没有rip就没办法iret。通常内存中会保存所有进程控制块和线程控制块,因通常os是不允许自己的内存被swap的,会大幅度降低效率,页表可以被换出。
每个核心的的调度过程其实可以说是独立的,每个核心的时钟中断是独立的,然后在触发调度时调度程序会在触发调度的那一个核心上进行,所以基本上调度器不需要考虑其他核心的调度情况,然后,因为每个核心都有自己的cr3寄存器,所以,任意4个线程,cpu不在乎是否来自同一个进程,一般调度器也不在乎
4.没必要,切cr3没多少时间,tlb缓存吧反正中断和系统调用都有可能tlb不命中呢,os只能把自己常用的东西放到tlb里面,不可能全放。再说现在内存这么大,tlb不命中还有内存呢,到需要访问swap中的页表的时候就是相对比较少的情况了。
5.异步时钟可以,cpu一个核心有几个可编程时钟,定时的长度可以调的。
6.大多数情况核心是互相独立的,中断,系统调用这些东西都是独立进行,cpu 0上可以运行控制其他核心的特权指令
7.没啥大区别,ipc是在内存中进行的,多核需要一些特殊的lock技巧什么的
1.对于单核CPU,多线程程序和多进程程序调度是一样的吗?即例如最开始系统中有50个进程,加进来一个进程,每个进程的调度频率是1/51,再加进来一个进程,每个进程调度频率是1/52,所以对于一个多进程的程序,如果最开始它开启了2个进程,那么它的调度频率就是2/52。那么如果这个程序是一个进程中开启的是两个线程,那么它的调度周期是2/52,还是1/51,即操作系统是以线程调度还是进程调度。同时对于一个程序是不是开的进程或线程越多,那么一般情况下(不考虑进程线程创建,和特殊情况),这个程序的效率就越高(同一个调度周期内,它能够上CPU的机会更多)
绝大多数操作系统调度单位是线程,不是进程。
但跟你想象的不同,绝大多数的情况下CPU是闲着的而不是满着,你自己看任务管理器就知道了,在有些OS上时间片的长度不一定固定,如果真是计算密集型任务(需要吃CPU),操作系统会让它多占一会的。
2.对于问题1,如果是以线程为调度单位,那么操作系统会不会优化让连续一个进程的多个线程依次调度,这样就可以节省进程上下文的时间。
对于x86的CPU来说,切进程无非是换页+刷TLB这些,动作其实很快。你打开Windows任务管理器,看上去似乎很多进程,但多数进程都是闲着不干活的。
任务都是有一定优先级的,操作系统考虑的是根据优先级来调度,而不是切换上下文的时间,切换上下文的这点时间不算什么时间。
3.对于多核的CPU(例如4核),是以进程为调度单位,还是以线程为调度单位?如果以进程为调度单位,那么是不是内存中要同时保持4个进程的上下文?如果是以线程为单位,那么是否必须是同一个进程的4个线程,还是可以是4个不同进程的4个不同线程?
不管单核多核,调度单位都是线程,跟进程没关系。具体每个核是同一个进程还是不同进程,操作系统不关系,CPU也不关心,每个CPU都有寄存器能保存当前任务状态,其余的状态都在内存里。
4. 对于3的情况,如果是以线程为调度单位,操作系统是否可以优化,让一个进程的多个线程首先占据4个核,然后下一个调度周期优先让这个进程的其余线程继续跑,余下来的核再给其他进程的线程用,这样可以节省进程上下文的时间。
前面说了,进程切换的代价很低,而且多数情况下一个线程不可能跑满一个时间片,如果一个进程把全部核都占满,如果某些线程跑完了需要释放时间片怎么办?怎么解决每个线程占用时间片长度不同问题?
现场跑完了不释放CPU?浪费。
释放?又不符合你的模型,调度单位又变成线程了。
所以进程不作为调度的单位看待。
5. 多核CPU的每个核能否做到异步时钟?
可以。
6. 多个核,每个核操作系统是统一管理还是分别管理,总感觉对于每个进程在单核CPU中和多核CPU中的管理不同,正所谓4个核 != 一个核*4(效率方面)?
基于线程的调度效率比基于进程的效率高,因为一个进程的各个线程占用时间片是不同的,基于进程的调度会造成极大的CPU时间浪费。
7. 多个核,对于进程通信与线程同步有什么影响?
多核对于操作系统调度、锁的写法方面比较麻烦,对于上层应用,不需要考虑这些问题。按正常多线程加保护就够用了。
-------------------------------------
你的问题里,觉得任务切换的开销很大,实际上任务切换代价再大,也比浪费一个时间片要小。
基于进程的多核调度,就意味着某些情况下,某些核的时间片被浪费掉,这种性能损失比任务切换要大得多。
一个时间片内做几百次任务切换都没问题,与其减少任务切换,不如把浪费的时间片都用上。
任务切换的代价比中断切换的代价要小,操作系统中各种外设的中断(时钟、PCI、DMA等)比任务切换的代价要大的多。