找回密码
 FreeOZ用户注册
查看: 5856|回复: 36

[Linux] 200+行Kernel补丁显著改善桌面性能

[复制链接]
发表于 17-11-2010 13:58:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
Magicloud 写道
"200+行的内核补丁被Linus Torvalds称赞为“a killer feature”。
补丁的作者是Mike Galbrai,他刚刚发布了第三个修正版。该补丁为内核的调度器加入了224行代码,同时去除9行代码,起作用的代码总共233行。补丁的用途是设计自动为每个TTY创建任务组,降低延迟改进桌面交互性能。Mike完成的测试发现,最大延迟下降10倍以上,桌面的平均延迟下降60倍。Phoronix的测试显示,在Core i7 970机器上编译内核时,同时播放的1080p《大雄兔》视频仍然很流畅。该补丁预计将合并到Linux 2.6.38中。 视频演示:


回复  

使用道具 举报

 楼主| 发表于 17-11-2010 14:04:24 | 显示全部楼层
完成这一killer feature的代码补丁:
  1. Index: linux-2.6/include/linux/sched.h
  2. ===================================================================
  3. --- linux-2.6.orig/include/linux/sched.h
  4. +++ linux-2.6/include/linux/sched.h
  5. @@ -509,6 +509,8 @@ struct thread_group_cputimer {
  6.         spinlock_t lock;
  7. };

  8. +struct autogroup;
  9. +
  10. /*
  11.   * NOTE! "signal_struct" does not have it's own
  12.   * locking, because a shared signal_struct always
  13. @@ -576,6 +578,9 @@ struct signal_struct {

  14.         struct tty_struct *tty; /* NULL if no tty */

  15. +#ifdef CONFIG_SCHED_AUTOGROUP
  16. +        struct autogroup *autogroup;
  17. +#endif
  18.         /*
  19.          * Cumulative resource counters for dead threads in the group,
  20.          * and for reaped dead child processes forked by this group.
  21. @@ -1931,6 +1936,20 @@ int sched_rt_handler(struct ctl_table *t

  22. extern unsigned int sysctl_sched_compat_yield;

  23. +#ifdef CONFIG_SCHED_AUTOGROUP
  24. +extern unsigned int sysctl_sched_autogroup_enabled;
  25. +
  26. +extern void sched_autogroup_create_attach(struct task_struct *p);
  27. +extern void sched_autogroup_detach(struct task_struct *p);
  28. +extern void sched_autogroup_fork(struct signal_struct *sig);
  29. +extern void sched_autogroup_exit(struct signal_struct *sig);
  30. +#else
  31. +static inline void sched_autogroup_create_attach(struct task_struct *p) { }
  32. +static inline void sched_autogroup_detach(struct task_struct *p) { }
  33. +static inline void sched_autogroup_fork(struct signal_struct *sig) { }
  34. +static inline void sched_autogroup_exit(struct signal_struct *sig) { }
  35. +#endif
  36. +
  37. #ifdef CONFIG_RT_MUTEXES
  38. extern int rt_mutex_getprio(struct task_struct *p);
  39. extern void rt_mutex_setprio(struct task_struct *p, int prio);
  40. Index: linux-2.6/kernel/sched.c
  41. ===================================================================
  42. --- linux-2.6.orig/kernel/sched.c
  43. +++ linux-2.6/kernel/sched.c
  44. @@ -78,6 +78,7 @@

  45. #include "sched_cpupri.h"
  46. #include "workqueue_sched.h"
  47. +#include "sched_autogroup.h"

  48. #define CREATE_TRACE_POINTS
  49. #include
  50. @@ -605,11 +606,14 @@ static inline int cpu_of(struct rq *rq)
  51.   */
  52. static inline struct task_group *task_group(struct task_struct *p)
  53. {
  54. +        struct task_group *tg;
  55.         struct cgroup_subsys_state *css;

  56.         css = task_subsys_state_check(p, cpu_cgroup_subsys_id,
  57.                         lockdep_is_held(&task_rq(p)->lock));
  58. -        return container_of(css, struct task_group, css);
  59. +        tg = container_of(css, struct task_group, css);
  60. +
  61. +        return autogroup_task_group(p, tg);
  62. }

  63. /* Change a task's cfs_rq and parent entity if it moves across CPUs/groups */
  64. @@ -2006,6 +2010,7 @@ static void sched_irq_time_avg_update(st
  65. #include "sched_idletask.c"
  66. #include "sched_fair.c"
  67. #include "sched_rt.c"
  68. +#include "sched_autogroup.c"
  69. #include "sched_stoptask.c"
  70. #ifdef CONFIG_SCHED_DEBUG
  71. # include "sched_debug.c"
  72. @@ -7979,7 +7984,7 @@ void __init sched_init(void)
  73. #ifdef CONFIG_CGROUP_SCHED
  74.         list_add(&init_task_group.list, &task_groups);
  75.         INIT_LIST_HEAD(&init_task_group.children);
  76. -
  77. +        autogroup_init(&init_task);
  78. #endif /* CONFIG_CGROUP_SCHED */

  79. #if defined CONFIG_FAIR_GROUP_SCHED && defined CONFIG_SMP
  80. @@ -8509,15 +8514,11 @@ void sched_destroy_group(struct task_gro
  81. /* change task's runqueue when it moves between groups.
  82.   *        The caller of this function should have put the task in its new group
  83.   *        by now. This function just updates tsk->se.cfs_rq and tsk->se.parent to
  84. - *        reflect its new group.
  85. + *        reflect its new group.  Called with the runqueue lock held.
  86.   */
  87. -void sched_move_task(struct task_struct *tsk)
  88. +void __sched_move_task(struct task_struct *tsk, struct rq *rq)
  89. {
  90.         int on_rq, running;
  91. -        unsigned long flags;
  92. -        struct rq *rq;
  93. -
  94. -        rq = task_rq_lock(tsk, &flags);

  95.         running = task_current(rq, tsk);
  96.         on_rq = tsk->se.on_rq;
  97. @@ -8538,7 +8539,15 @@ void sched_move_task(struct task_struct
  98.                 tsk->sched_class->set_curr_task(rq);
  99.         if (on_rq)
  100.                 enqueue_task(rq, tsk, 0);
  101. +}

  102. +void sched_move_task(struct task_struct *tsk)
  103. +{
  104. +        struct rq *rq;
  105. +        unsigned long flags;
  106. +
  107. +        rq = task_rq_lock(tsk, &flags);
  108. +        __sched_move_task(tsk, rq);
  109.         task_rq_unlock(rq, &flags);
  110. }
  111. #endif /* CONFIG_CGROUP_SCHED */
  112. Index: linux-2.6/kernel/fork.c
  113. ===================================================================
  114. --- linux-2.6.orig/kernel/fork.c
  115. +++ linux-2.6/kernel/fork.c
  116. @@ -174,8 +174,10 @@ static inline void free_signal_struct(st

  117. static inline void put_signal_struct(struct signal_struct *sig)
  118. {
  119. -        if (atomic_dec_and_test(&sig->sigcnt))
  120. +        if (atomic_dec_and_test(&sig->sigcnt)) {
  121. +                sched_autogroup_exit(sig);
  122.                 free_signal_struct(sig);
  123. +        }
  124. }

  125. void __put_task_struct(struct task_struct *tsk)
  126. @@ -904,6 +906,7 @@ static int copy_signal(unsigned long clo
  127.         posix_cpu_timers_init_group(sig);

  128.         tty_audit_fork(sig);
  129. +        sched_autogroup_fork(sig);

  130.         sig->oom_adj = current->signal->oom_adj;
  131.         sig->oom_score_adj = current->signal->oom_score_adj;
  132. Index: linux-2.6/drivers/tty/tty_io.c
  133. ===================================================================
  134. --- linux-2.6.orig/drivers/tty/tty_io.c
  135. +++ linux-2.6/drivers/tty/tty_io.c
  136. @@ -3160,6 +3160,7 @@ static void __proc_set_tty(struct task_s
  137.         put_pid(tsk->signal->tty_old_pgrp);
  138.         tsk->signal->tty = tty_kref_get(tty);
  139.         tsk->signal->tty_old_pgrp = NULL;
  140. +        sched_autogroup_create_attach(tsk);
  141. }

  142. static void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty)
  143. Index: linux-2.6/kernel/sched_autogroup.h
  144. ===================================================================
  145. --- /dev/null
  146. +++ linux-2.6/kernel/sched_autogroup.h
  147. @@ -0,0 +1,18 @@
  148. +#ifdef CONFIG_SCHED_AUTOGROUP
  149. +
  150. +static void __sched_move_task(struct task_struct *tsk, struct rq *rq);
  151. +
  152. +static inline struct task_group *
  153. +autogroup_task_group(struct task_struct *p, struct task_group *tg);
  154. +
  155. +#else /* !CONFIG_SCHED_AUTOGROUP */
  156. +
  157. +static inline void autogroup_init(struct task_struct *init_task) {  }
  158. +
  159. +static inline struct task_group *
  160. +autogroup_task_group(struct task_struct *p, struct task_group *tg)
  161. +{
  162. +        return tg;
  163. +}
  164. +
  165. +#endif /* CONFIG_SCHED_AUTOGROUP */
  166. Index: linux-2.6/kernel/sched_autogroup.c
  167. ===================================================================
  168. --- /dev/null
  169. +++ linux-2.6/kernel/sched_autogroup.c
  170. @@ -0,0 +1,140 @@
  171. +#ifdef CONFIG_SCHED_AUTOGROUP
  172. +
  173. +unsigned int __read_mostly sysctl_sched_autogroup_enabled = 1;
  174. +
  175. +struct autogroup {
  176. +        struct kref                kref;
  177. +        struct task_group        *tg;
  178. +};
  179. +
  180. +static struct autogroup autogroup_default;
  181. +
  182. +static void autogroup_init(struct task_struct *init_task)
  183. +{
  184. +        autogroup_default.tg = &init_task_group;
  185. +        kref_init(&autogroup_default.kref);
  186. +        init_task->signal->autogroup = &autogroup_default;
  187. +}
  188. +
  189. +static inline void autogroup_destroy(struct kref *kref)
  190. +{
  191. +        struct autogroup *ag = container_of(kref, struct autogroup, kref);
  192. +        struct task_group *tg = ag->tg;
  193. +
  194. +        kfree(ag);
  195. +        sched_destroy_group(tg);
  196. +}
  197. +
  198. +static inline void autogroup_kref_put(struct autogroup *ag)
  199. +{
  200. +        kref_put(&ag->kref, autogroup_destroy);
  201. +}
  202. +
  203. +static inline struct autogroup *autogroup_kref_get(struct autogroup *ag)
  204. +{
  205. +        kref_get(&ag->kref);
  206. +        return ag;
  207. +}
  208. +
  209. +static inline struct autogroup *autogroup_create(void)
  210. +{
  211. +        struct autogroup *ag = kmalloc(sizeof(*ag), GFP_KERNEL);
  212. +
  213. +        if (!ag)
  214. +                goto out_fail;
  215. +
  216. +        ag->tg = sched_create_group(&init_task_group);
  217. +        kref_init(&ag->kref);
  218. +
  219. +        if (!(IS_ERR(ag->tg)))
  220. +                return ag;
  221. +
  222. +out_fail:
  223. +        if (ag) {
  224. +                kfree(ag);
  225. +                WARN_ON(1);
  226. +        } else
  227. +                WARN_ON(1);
  228. +
  229. +        return autogroup_kref_get(&autogroup_default);
  230. +}
  231. +
  232. +static inline struct task_group *
  233. +autogroup_task_group(struct task_struct *p, struct task_group *tg)
  234. +{
  235. +        int enabled = ACCESS_ONCE(sysctl_sched_autogroup_enabled);
  236. +
  237. +        enabled &= (tg == &root_task_group);
  238. +        enabled &= (p->sched_class == &fair_sched_class);
  239. +        enabled &= (!(p->flags & PF_EXITING));
  240. +
  241. +        if (enabled)
  242. +                return p->signal->autogroup->tg;
  243. +
  244. +        return tg;
  245. +}
  246. +
  247. +static void
  248. +autogroup_move_group(struct task_struct *p, struct autogroup *ag)
  249. +{
  250. +        struct autogroup *prev;
  251. +        struct task_struct *t;
  252. +        struct rq *rq;
  253. +        unsigned long flags;
  254. +
  255. +        rq = task_rq_lock(p, &flags);
  256. +        prev = p->signal->autogroup;
  257. +        if (prev == ag) {
  258. +                task_rq_unlock(rq, &flags);
  259. +                return;
  260. +        }
  261. +
  262. +        p->signal->autogroup = autogroup_kref_get(ag);
  263. +        __sched_move_task(p, rq);
  264. +        task_rq_unlock(rq, &flags);
  265. +
  266. +        rcu_read_lock();
  267. +        list_for_each_entry_rcu(t, &p->thread_group, thread_group) {
  268. +                sched_move_task(t);
  269. +        }
  270. +        rcu_read_unlock();
  271. +
  272. +        autogroup_kref_put(prev);
  273. +}
  274. +
  275. +void sched_autogroup_create_attach(struct task_struct *p)
  276. +{
  277. +        struct autogroup *ag = autogroup_create();
  278. +
  279. +        autogroup_move_group(p, ag);
  280. +        /* drop extra refrence added by autogroup_create() */
  281. +        autogroup_kref_put(ag);
  282. +}
  283. +EXPORT_SYMBOL(sched_autogroup_create_attach);
  284. +
  285. +/* currently has no users */
  286. +void sched_autogroup_detach(struct task_struct *p)
  287. +{
  288. +        autogroup_move_group(p, &autogroup_default);
  289. +}
  290. +EXPORT_SYMBOL(sched_autogroup_detach);
  291. +
  292. +void sched_autogroup_fork(struct signal_struct *sig)
  293. +{
  294. +        sig->autogroup = autogroup_kref_get(current->signal->autogroup);
  295. +}
  296. +
  297. +void sched_autogroup_exit(struct signal_struct *sig)
  298. +{
  299. +        autogroup_kref_put(sig->autogroup);
  300. +}
  301. +
  302. +static int __init setup_autogroup(char *str)
  303. +{
  304. +        sysctl_sched_autogroup_enabled = 0;
  305. +
  306. +        return 1;
  307. +}
  308. +
  309. +__setup("noautogroup", setup_autogroup);
  310. +#endif
  311. Index: linux-2.6/kernel/sysctl.c
  312. ===================================================================
  313. --- linux-2.6.orig/kernel/sysctl.c
  314. +++ linux-2.6/kernel/sysctl.c
  315. @@ -382,6 +382,17 @@ static struct ctl_table kern_table[] = {
  316.                 .mode                = 0644,
  317.                 .proc_handler        = proc_dointvec,
  318.         },
  319. +#ifdef CONFIG_SCHED_AUTOGROUP
  320. +        {
  321. +                .procname        = "sched_autogroup_enabled",
  322. +                .data                = &sysctl_sched_autogroup_enabled,
  323. +                .maxlen                = sizeof(unsigned int),
  324. +                .mode                = 0644,
  325. +                .proc_handler        = proc_dointvec,
  326. +                .extra1                = &zero,
  327. +                .extra2                = &one,
  328. +        },
  329. +#endif
  330. #ifdef CONFIG_PROVE_LOCKING
  331.         {
  332.                 .procname        = "prove_locking",
  333. Index: linux-2.6/init/Kconfig
  334. ===================================================================
  335. --- linux-2.6.orig/init/Kconfig
  336. +++ linux-2.6/init/Kconfig
  337. @@ -728,6 +728,18 @@ config NET_NS

  338. endif # NAMESPACES

  339. +config SCHED_AUTOGROUP
  340. +        bool "Automatic process group scheduling"
  341. +        select CGROUPS
  342. +        select CGROUP_SCHED
  343. +        select FAIR_GROUP_SCHED
  344. +        help
  345. +          This option optimizes the scheduler for common desktop workloads by
  346. +          automatically creating and populating task groups.  This separation
  347. +          of workloads isolates aggressive CPU burners (like build jobs) from
  348. +          desktop applications.  Task group autogeneration is currently based
  349. +          upon task tty association.
  350. +
  351. config MM_OWNER
  352.         bool

  353. Index: linux-2.6/Documentation/kernel-parameters.txt
  354. ===================================================================
  355. --- linux-2.6.orig/Documentation/kernel-parameters.txt
  356. +++ linux-2.6/Documentation/kernel-parameters.txt
  357. @@ -1622,6 +1622,8 @@ and is between 256 and 4096 characters.
  358.         noapic                [SMP,APIC] Tells the kernel to not make use of any
  359.                         IOAPICs that may be present in the system.

  360. +        noautogroup        Disable scheduler automatic task group creation.
  361. +
  362.         nobats                [PPC] Do not use BATs for mapping kernel lowmem
  363.                         on "Classic" PPC cores.
复制代码
回复  

使用道具 举报

发表于 17-11-2010 15:39:58 | 显示全部楼层
太晚了,马上都转Wayland了
回复  

使用道具 举报

 楼主| 发表于 17-11-2010 16:31:40 | 显示全部楼层
这个是内核的调度器,应该和X关系不大,只是使用这个对上层的进程响应优化得更加智能了。wayland,X甚至服务器进程应该都能受益
回复  

使用道具 举报

发表于 17-11-2010 19:39:16 | 显示全部楼层
这个不错,要顶。
回复  

使用道具 举报

发表于 17-11-2010 22:09:40 | 显示全部楼层
200多行,有这么大的效果,以前别人都写不出来,作者是天才。
回复  

使用道具 举报

发表于 18-11-2010 13:00:31 | 显示全部楼层
问个问题,为啥每行前面都有个+呢?看不懂
回复  

使用道具 举报

发表于 18-11-2010 13:01:53 | 显示全部楼层
有的前面没有,有的又是'-',奇怪啊,哪位帮俺解答一下?
回复  

使用道具 举报

发表于 18-11-2010 13:02:45 | 显示全部楼层
+号表示是插入原代码。所有补丁都有这个。
回复  

使用道具 举报

发表于 18-11-2010 13:03:20 | 显示全部楼层
-号就是删去了。
回复  

使用道具 举报

发表于 18-11-2010 13:06:18 | 显示全部楼层
原帖由 mohan29 于 18-11-2010 13:03 发表
-号就是删去了。



编译器能编译这样的文件吗?
回复  

使用道具 举报

发表于 18-11-2010 13:08:46 | 显示全部楼层
先用pacth命令打补丁。打完了补丁,源代码就是老样子,只是增减了一些代码行而已。
回复  

使用道具 举报

发表于 18-11-2010 13:09:22 | 显示全部楼层
油饼同学很好学啊,还有很多要学啊。
回复  

使用道具 举报

发表于 18-11-2010 13:12:25 | 显示全部楼层
这样其实很方便,我上次编译MPD 的ALSA支持,就是打了一些补丁。run一下patch命令就好了。但是手动也行啊。编译linux 核心的时候,为了支持某些特殊硬件,俺也干过这事。
回复  

使用道具 举报

发表于 18-11-2010 13:20:18 | 显示全部楼层
牛人啊,崇拜ing

俺一直希望自己学会写程序,I have a dream。。。。可似乎一直在梦里,出不来了
回复  

使用道具 举报

发表于 18-11-2010 13:23:18 | 显示全部楼层
写这个代码才是牛人,俺只不过是个业余程序员而已。写程序这个工作只是看上去很美而已。绝不要去做程序员,上了船的例外啊。

评分

参与人数 1威望 +50 收起 理由
coredump + 50 我很赞同!

查看全部评分

回复  

使用道具 举报

 楼主| 发表于 18-11-2010 14:00:01 | 显示全部楼层
原帖由 mohan29 于 18-11-2010 12:23 发表
写这个代码才是牛人,俺只不过是个业余程序员而已。写程序这个工作只是看上去很美而已。绝不要去做程序员,上了船的例外啊。
看上去也没觉得美阿[size=9.72222px]
回复  

使用道具 举报

发表于 18-11-2010 14:02:55 | 显示全部楼层
呵呵。顺便对我公司那些写CRS-1底层代码的印度哥们表示由衷地赞美和深刻地同情。没有他们,就没有互联网的今天啊。
回复  

使用道具 举报

发表于 18-11-2010 14:08:13 | 显示全部楼层
原帖由 四香油饼 于 18-11-2010 13:20 发表
牛人啊,崇拜ing

俺一直希望自己学会写程序,I have a dream。。。。可似乎一直在梦里,出不来了



我建议你写的3k行代码写了没有?
回复  

使用道具 举报

发表于 18-11-2010 14:10:43 | 显示全部楼层
原帖由 mohan29 于 18-11-2010 13:23 发表
写这个代码才是牛人,俺只不过是个业余程序员而已。写程序这个工作只是看上去很美而已。绝不要去做程序员,上了船的例外啊。


我想这个世界上只有两个工作是最好玩的,
一个是灌水,另一个是写程序。
由于灌水不能赚钱,所以我就写程序去了。
回复  

使用道具 举报

发表于 18-11-2010 14:11:24 | 显示全部楼层
原帖由 mohan29 于 18-11-2010 14:02 发表
呵呵。顺便对我公司那些写CRS-1底层代码的印度哥们表示由衷地赞美和深刻地同情。没有他们,就没有互联网的今天啊。


M 同学在cisco呀?
回复  

使用道具 举报

发表于 18-11-2010 14:16:52 | 显示全部楼层
原帖由 key 于 18-11-2010 14:10 发表


我想这个世界上只有两个工作是最好玩的,
一个是灌水,另一个是写程序。
由于灌水不能赚钱,所以我就写程序去了。


写程序都能写出快感来,真让人言不由衷地佩服啊。
回复  

使用道具 举报

发表于 18-11-2010 14:42:40 | 显示全部楼层
原帖由 key 于 18-11-2010 14:08 发表



我建议你写的3k行代码写了没有?


写了大概有1000行了
回复  

使用道具 举报

发表于 18-11-2010 14:45:44 | 显示全部楼层
原帖由 key 于 18-11-2010 14:10 发表


我想这个世界上只有两个工作是最好玩的,
一个是灌水,另一个是写程序。
由于灌水不能赚钱,所以我就写程序去了。


谁说灌水不能赚钱来的,1贴5毛
回复  

使用道具 举报

发表于 18-11-2010 15:59:02 | 显示全部楼层
原帖由 四香油饼 于 18-11-2010 14:42 发表


写了大概有1000行了


我是指在同一套程序里凑足3k行,而不是一个程序三四十行累加起来。
回复  

使用道具 举报

发表于 18-11-2010 16:06:51 | 显示全部楼层
其实这就是有点牺牲后台的调度有先级而使得前台有更好的用戶 (中断,系统信号)的响应, 这个利子的后台好想是起動一个大型编译程序, 所以延迟不是十分的敏感, 而前台的用戶响应要求叫高, 所以有限的改动, 用戶体验差很多!
回复  

使用道具 举报

发表于 18-11-2010 16:10:32 | 显示全部楼层

驳“200+行Kernel补丁显著改善Linux桌面性能”

http://tech.ifeng.com/internet/detail_2010_11/18/3153737_0.shtml

对昨天的“膜拜牛人:200+行Kernel补丁显著改善Linux桌面性能”很感兴趣,于是去看了原帖,仔细看下去却发现似乎不是那么回事。所谓显著改善 Linux 桌面性能,基本只对新闻中的那个视频设定的状况有效:你要开一个终端用 64 个线程编译 Linux 内核,然后再开一个终端放高清视频。这看上去不是 Linux 桌面用户面对的一般情景。

借用原文的话“补丁的用途是设计自动为每个TTY 创建任务组,降低延迟改进桌面交互性能。”TTY 在 Linux 桌面大体可以理解为终端窗口。 PulseAudio 和 systemd 的作者 Lennart Poettering 指出了这种方法的致命缺陷: 这个特性只对内核作者有意义,与普通桌面用户完全无关。因为首先,普通用户本来就不怎么用终端;

其次,如果他们用终端的话也绝不会在一个终端里开一大堆线程,在其他几个里面开一点。只有在这样的情况下这个补丁才有点用处。 在我的机器上这个补丁就完全没用(我还是个内核作者呢),因为我一般在 emacs 里面编译程序,而 emacs 并没有连接到终端(因为是个 X11/gtk 的版本)(也就是从桌面直接打开的图形界面),所以他不会在自己的调度组里面。

所以,这个补丁仅仅对这样的人有效:成天从 xterm 里面用 make -j 编译内核,同时还想从终端(还得是另一个)里面启动一个播放器看电影。 只有在这样这个补丁才有用。对任何其他人而言,这东西完全无关紧要。如果你不用终端,这东西没用。如果你不(在终端里)开一堆线程,这东西没用。如果你不在终端里面启动 mplayer,这东西没用。 ...

至少这样想:想想如果我们在用户空间里面实现这个策略,我们就可以同时支持旧的内核而且也不许要把所有东西都升级到还没发布的新内核。 突然之间,在内核里面搞这个就不再显得那么完美了不是么? 我是完全没有计划让大家都在自己的 bash 里面做这个。我所说的只是把这个机制绑定到TTY上纯是疯了。而且这是个策略,理所应当在用户空间里面做,而且我们几乎就做到了。

... 在随后的跟贴里,Lennart 总结道: 这里讨论的内核补丁对*普通用户**完全**没**关*。 这个补丁只对那些在一个终端里面开 mplayer,在另一个终端里面 make -j 的人才有关。 至翻译完成为止还没人对此提出质疑。 此外,Lennart 还提供了一个用户空间脚本,只用 10 行不到就实现了比 200 行的内核补丁还要低一些的延迟,这也得到了 Linus 的认同。

http://marc.info/?l=linux-kernel&m=128993935321081&w=2
回复  

使用道具 举报

发表于 18-11-2010 16:30:57 | 显示全部楼层
原帖由 四香油饼 于 18-11-2010 13:06 发表

编译器能编译这样的文件吗?


这样的文件当然不能直接编译,但是Linux/Unix下有个专门给源码应用补丁的工具,patch,就是干这个预处理的工作,处理完之后就可以编译了,省得重新下载所有的源码包:
http://en.wikipedia.org/wiki/Patch_(Unix)
回复  

使用道具 举报

发表于 18-11-2010 16:39:08 | 显示全部楼层

回复 #27 yuba 的帖子

有用。。。。上班的时候经常在一个伪终端打开多线程编译,然后在这里看帖子,看帖子很受影响,编译器把CPU吃光了。有了这个补丁就好多啦。。。

评分

参与人数 1威望 +50 收起 理由
coredump + 50 me too!

查看全部评分

回复  

使用道具 举报

发表于 18-11-2010 17:18:36 | 显示全部楼层
原帖由 蓝山夜妖 于 18-11-2010 16:39 发表
有用。。。。上班的时候经常在一个伪终端打开多线程编译,然后在这里看帖子,看帖子很受影响,编译器把CPU吃光了。有了这个补丁就好多啦。。。



正常情况下,我没有碰到这种情况, 比如: 一个窗口开 make zlinux -j24 , 另外的终端上上网, 看看贴子是完全没有影响的, Linux的调度策略不会傻到这种地步的, 这种最常见的优先级转换肯定考虑到了.
我觉的视频中的只是一种極端情况, 而不是普便装况.  

顺便问下,我在用 UBuntu, 没有找到什么好的中文输入法, 只道的同志share一下, 敲的好痛苦...
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 28-3-2024 20:08 , Processed in 0.066798 second(s), 46 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表