2.6.21开始取消了超线程的dependent_sleeper函数

简介:

在2.6.21以前的内核中有一个函数dependent_sleeper,该函数的意义就是,在schedule中,如果当前cpu的运行队列的进程数量不为0,那么还是不能简单的从这个队列中选择一个最高优先级的进程,而是要看看这个cpu是否拥有一个逻辑兄弟cpu,然后抉择,这种情况在intel的超线程中是可能的,由于超线程共享运算逻辑,而仅仅实现了两套寄存器组和中断控制逻辑,两个逻辑cpu共享一个mmu(影响tlb)和cache,导致两个cpu同时运行而共用那些东西的话效率很差,这么说来超线程的设计就是一个错误,linux认识了这种错误,于是就有了dependent_sleeper这个函数,它的策略是,如果兄弟cpu上运行着一个比要选择进程优先级高的进程,如果是就不能打扰这个正运行的进程,第一,人家优先级高;第二,人家的缓存和tlb还热着呢。

这个特性曾经一度让我着迷,linux内核设计得简直滴水不漏,可是我在沉迷于这种快感的同时忽视了linux的另一个热性:如果作用不大,任何花哨的功夫都将被砍去,如果说超线程是个错误的话,为何让内核去迎合它呢?如果是个错误的话,用户不要选择这样的cpu就是了,根本没有必要在schedule中插入这一段仅仅为了超线程的代码,因此在很多的机器上,dependent_sleeper这个函数其实是没有用的,因此2.6.21中终于被砍去了,被砍去的原因除了上述原因之外,内核社区的所谓的官方原因就是:

Remove the SMT-nice feature which idles sibling cpus on SMT cpus to facilitiate nice working properly where cpu power is shared. The idling of cpus in the presence of runnable tasks is considered too fragile, easy to break with outside code, and the complexity of managing this system if an architecture comes along with many logical cores sharing cpu power will be unworkable.

上面的描述是够详细了,idle进程十分的脆弱,任何的执行绪都可以打断它,如果兄弟cpu上运行着一个高优先级进程导致这个cpu上只能运行idle的话,那么就会导致这个idle会被不间断的打断,每次中断都会设置idle的调度标志,这样的话,idle就像一个无聊的把门者,明明大门敞开,仅仅因为屋里有一个比自己胖的食客就拒人于门外,这实在不公平,超线程岂不是成了摆设,好像开了几扇门却只有一个门让大众过,别的都成了官道,事实是,民众永远都是最多的。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273398

相关文章
|
存储 安全 数据管理
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
314 1
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
Lua的面向对象编程、协同线程与协同函数的概念和使用,以及Lua文件I/O操作的基本方法。
299 4
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
966 6
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
491 0
C++ 多线程之线程管理函数
处理串口线程数据的函数
【8月更文挑战第4天】处理串口线程数据的函数。
210 4
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
设计模式 安全 C++
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
630 2
|
存储 安全 Linux
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
1309 0
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
|
存储 前端开发 C语言
C++11的多线程、function和bind、可变函数模板-2
C++11的多线程、function和bind、可变函数模板
356 1
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
2213 1

热门文章

最新文章