Kernel Kernel Kernel Kernel load estimator runqueue kernel/sched.

Similar documents
To remove this message please register. 学习资料 4. 进程从绻统踃用返回到用户态时 ; 5. 内核处理完中断后, 进程返回到用户态 ; 六 : 进程队列 :( 对队列都有初始化 添加 删除等功能 ) 1: 运行队列 :Linux 绻统为处于帱绪态的进程的队列

第一章 概论

1 CPU interrupt INT trap CPU exception

中文模板

Linux kernel exploit研究和探索


提纲 1 2 OS Examples for 3

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09: 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一

Microsoft Word - LJM05.doc

PowerPoint Presentation

unsigned int need_resched; 當此值為真,timer 會作 task 排程 struct task_struct *init_task; * 代表 ( 一開始 )start_kernel() 的 task union task_union { task 與 task 使用的

学习MSP430单片机推荐参考书

<4D F736F F F696E74202D20B2D9D7F7CFB5CDB35F4C696E7578BDF8B3CCD3EBCFDFB3CC2E BBCE6C8DDC4A3CABD5D>

投影片 1

2013_423WBD_HKPanel_JSC_01

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

RTX3.2.0标准版 - 技术白皮书

Microsoft Word - 中耳的主要疾病~中耳炎.doc

LSTA126中文操作说明

Microsoft Word - MSP430 Launchpad 指导书.docx

第 一 节 认 识 自 我 的 意 义 一 个 人 只 有 认 识 自 我, 才 能 够 正 确 地 认 识 到 自 己 的 优 劣 势, 找 出 自 己 的 职 业 亮 点, 为 自 己 的 顺 利 求 职 推 波 助 澜 ; 一 个 人 只 有 认 识 自 我, 才 能 在 求 职 中 保 持


报 告 简 要 丽 江 古 城 位 于 云 南 省 西 北 部, 始 建 于 宋 末 元 初 古 城 西 北 方 30 公 里 处 是 海 拔 5596 米 的 玉 龙 雪 山 及 第 四 世 冰 川 遗 迹 丽 江 古 城 在 南 宋 时 期 就 初 具 规 模, 已 有 八 九 百 年 的 历

有 不 良 企 图 时, 就 要 立 即 躲 开 他 当 你 实 在 难 以 分 辨 对 方 是 真 心 实 意 还 是 虚 情 假 意 时, 可 向 父 母 老 师 或 周 围 较 成 熟 和 亲 近 的 朋 友 请 教, 请 他 们 帮 你 分 析 情 况, 做 出 判 断 此 时, 拒 绝 帮

內 容 及 試 題 範 例 術 科 評 量 規 範 評 分 標 準 一 (, 工 具 與 材 料 由 本 校 提 供, 考 生 無 須 自 備 ) ( 一 ) 基 本 焊 接 工 具 操 作 及 辨 識 基 本 手 工 具 設 備 ( 二 ) 測 驗 時 間 50 分 鐘 ( 三 ) 工 具 與 材

2.??,,,,, ;,,,,,,,, 3.?,,?,?,

宜蘭縣風景區管理所五峰旗風景特定風景區開放行動咖啡車作業投標須知

第 二 十 七 章 一 夜 苦 熬 第 二 十 八 章 租 房 同 居 第 二 十 九 章 二 人 世 界 第 三 十 章 取 消 面 试 第 三 十 一 章 中 暑 卧 床 第 三 十 二 章 找 到 工 作 第

美 国 研 究

玻璃幕墙工程质量检验标准 JGJ/T

2

《垓下歌》 項羽

交 通 部 公 路 總 局 新 竹 區 監 理 所 104 年 第 2 次 契 約 服 務 員 甄 試 試 場 序 號 試 場 序 號 姓 名 A01 A02 A03 A04 A05 A06 A07 A08 A09 A10 A11 A12 A13 A14 A15 A16 張 齡 文 王 美 蕙 吳

玻璃幕墙工程质量检验标准 JGJ/T


CC213

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

C/C++ - 文件IO

华恒家庭网关方案

二 衛 生 所 環 境 介 紹 1F- 櫃 台 門 診 診 間 藥 局 糖 尿 病 衛 教 室 2F- 醫 檢 室 會 議 室 3F- 行 政 辦 公 室 正 門 1F 櫃 台 三 日 程 表 星 期 一 二 三 四 五 早 上 1. 環 境 介 紹 2.DM 衛 教 見 習 3. 藥 局 介 紹

内 容 培 训 目 标 基 础 知 识 常 用 监 控 命 令 在 实 战 中 综 合 运 用 2

ebook

资源管理软件TORQUE与作业调度软件Maui的安装、设置及使用

lec02.key

Microsoft Word - 正文.doc

普 通 高 等 教 育 十 二 五 重 点 规 划 教 材 计 算 机 系 列 中 国 科 学 院 教 材 建 设 专 家 委 员 会 十 二 五 规 划 教 材 操 作 系 统 戴 仕 明 姚 昌 顺 主 编 姜 华 张 希 伟 副 主 编 郑 尚 志 梁 宝 华 参 编 参 编 周 进 钱 进

中文模板

浙江大学本科论文模板


W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO

12天 本 會103年 模 範 郵 工 董 麗 珍 趙 美 珍 2人 參 加 梁 周昆法 歐陽陪興 林青豊 林秀蓮 曾文俊 甯鎮美 鄭麗娟 周肖梅 陳宏 103 年 11 月 23 日 板 橋 分 會 假 西 湖 渡 假 益 周 錦 燕 等12人 奉 准 升 遷 申 請 中 華 郵 政 村 舉 辦2

<4D F736F F D20B5DA35D5C22020B2D9D7F7CFB5CDB3BDF8B3CC>

untitled


untitled

untitled

案例分享产品文档

untitled

P4i45GL_GV-R50-CN.p65

1

A Community Guide to Environmental Health

<4D F736F F F696E74202D20A8E2A9A4AA41B0C8B77EB654A9F6B67DA9F1ABE1A141BB4FC657AAF7BFC4AAF7BFC4AA41B0C8B77EA4A7B0D3BEF7BB50AC44BED420A6BFACB C >


Chapter 9: Objects and Classes

79 SZ/SH/SM ONOFF SET/RST SZSHSM SET SET RST RESET ( ) ( ) SET XXXX SET XXXX XXXX RST XXXX RST XXXX XXXX 1(2) SZ3 SZ4 SH SM I000~I177 I000~I477 I000~I

Microsoft Word - 澎湖田調報告_璉謙組.doc

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

50 #define TASK_STOPPED 4 // 进程已停止 #ifndef NULL 53 #define NULL ((void *) 0) // 定义 NULL 为空指针 54 #endif 55 // 复制进程的页目录页表 Linus 认为这是内核中最复杂的函数之一 (

ebook 132-6

1

Microsoft Word - 第一篇第三章_3.doc

超级好的移值过程介绍: μC/GUI在MSGl9264液晶上的移植

中國外交機構演變歷程


BackCover

说 : 荀 子 极 偏 驳, 只 一 句 性 恶, 大 本 已 失 5 朱 熹 说 : 荀 扬 不 惟 说 性 不 是, 从 头 到 底 皆 不 识 6 采 取 的 都 是 这 种 理 论 框 架 另 一 种 理 论 框 架 始 于 20 世 纪 前 期, 这 便 是 诸 子 学 研 究 的 框 架

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;


untitled

40 COMMEMORATING THE FORTIETH ANNIVERSARY OF REFORM AND OPENING UP ( ) ( ) [1] :



Microsoft Word - 2CA13內文.doc

_NT K_SC_A5_ _print.pdf

untitled

<4D F736F F D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

1 C++ 2 Bjarne Stroustrup C++ (system programming) 6 (infrastructure) C++ 7 Herb Sutter 8 C++ (efficiency) (flexibility) 9 (abstraction) (productivity

檔案編號︰WTSDC 20/220 Pt

Scheduling in Windows and Linux

《嵌入式系统设计》教学大纲

untitled

<B1B1BEA9B9E2BBB7D0C2CDF8BFC6BCBCB9C9B7DDD3D0CFDEB9ABCBBEB4B43F3F12FB6CB293>

Microsoft Word - 实用案例.doc

51 C 51 isp 10 C PCB C C C C KEIL

目 录 1. 国 泰 君 安 证 券 股 份 有 限 公 司 中 国 银 河 证 券 股 份 有 限 公 司 申 银 万 国 证 券 股 份 有 限 公 司 广 发 证 券 股 份 有 限 公 司 国 信

,,,,, ;,,,,,,,,, ( ) ( ),,,,,,,,,,,,,

(辩证看 务实办•理论热点面对面2012)

LinuxÓû§»ù´¡

Microsoft Word 性平月手冊.doc

Transcription:

Linux Kernel 2.6 20321131

Kernel 2.4...3 Kernel 2.4...3 Kernel 2.4...3 Kernel 2.6...3...3 1....3 2....4 3. load estimator...4 4....4 5....4...4 1....4 2. runqueue kernel/sched.c...4 3. task_struct(include/linux/sched.h)...6...9 1....9 2....9 3. sleep_avg...10 4.... 11 5. schedule() kernel/sched.c...13 6....15 7....17 8....18 Kernel 2.6...20

Kernel 2.4 Kernel 2.4 Kernel 2.4 2.4 2.4 2.4 1. O(n) (1) 2.4 CPU goodness() (2) CPU runqueue 2. 3. Kernel 2.6 Linux Kernel 2.6.4 Kernel2.6 O(1) 1. CPU active array expired array Active array CPU Expired array active array active array expired array Active array expired array CPU active array Kernel 2.4

2. CPU 2.4 Kernel 2.6 64bit bitmap bitmap 1 BSFL 3. load estimator boost punish CPU bonus 4. 2.6 2.4 5. CPU pull CPU push 1. Kernel 2.6 0 ~ MAX_PRIO-1 0 ~ MAX_RT_PRIO-1 MAX_RT_PRIO ~ MAX_PRIO-1 2. runqueue kernel/sched.c struct runqueue 2.6 CPU (1) prio_array_t *active, *expired, arrays[2] runqueue CPU active expired prio_array_t struct prio_array { int nr_active; /* */ struct list_head queue[max_prio]; /* */ unsigned long bitmap[bitmap_size]; /* */

}; 1 prio_array queue[max_prio] i MAX_PRIO>i>=0 task_struct::runlist runnlist task_struct 1 queue[max_prio] struct prio_array unsigned long bitmap[bitmap_size] queue[max_prio] bitmap bit queue[i] queue[i] bitmap 1 0 1 idx sched_find_first_bit() queue[i]->next task_struct::runlist active array expired array active array active expired 2.4 2.6 2.6 struct runqueue sched.c sched.h (2) spinlock_t lock runqueue runqueue CPU runqueue (3) task_t *curr CPU current CPU runqueue curr rq->curr = next; rq->curr current rq->curr (4) unsigned long expired_timestamp

active array jiffies expired array EXPIRED_STARVING() expired array scheduler_tick() (5) unsigned long nr_running, nr_switches, nr_uninterruptible, timestamp_last_tick CPU nr_running CPU active array expired array nr_switches CPU nr_uninterruptible CPU timestamp_last_tick (6) struct list_head migration_queue CPU migration_req_t migration_req_t::list push 3. task_struct(include/linux/sched.h) Linux PCB Linux PCB task_struct task_struct 10 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. task_struct (1) volatile long state include/linux/sched.h 6 #define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 #define TASK_STOPPED 4 #define TASK_ZOMBIE 8 #define TASK_DEAD 16 TASK_DEAD (2) struct thread_info *thread_info s32 preempt_count; unsigned long flags; preempt_count 0 0 flags TIF_NEED_RESCHED Kernel 2.4 need_resched 1

(3) int prio, static_prio prio Kernel2.4 goodness() Kernel2.6 prio static_prio nice nice -20 ~ 19 kernel/sched.c nice prio prioity nice #define NICE_TO_PRIO(nice) (MAX_RT_PRIO + (nice) + 20) #define PRIO_TO_NICE(prio) ((prio) - MAX_RT_PRIO - 20) prioity nice priority = MAX _ RT _ PRIO + nice + 20 (4) struct list_head run_list prio_array queue[max_prio] list_head run_list include/linux/list.h struct list_head task_struct (5) prio_array_t *array CPU active array active array kernel/sched.c array = next->array; dequeue_task(next, array); recalc_task_prio(next, next->timestamp + delta); enqueue_task(next, array); 2 UP runqueue::active active array SMP next thread_info thread_info cpu next cpu runqueue active schedule (6) unsigned long sleep_avg nanosecond 0 ~ NS_MAX_SLEEP_AVG sleep_avg Kernel 2.6 sleep_avg (7) long interactive_credit -CREDIT_LIMIT ~ CREDIT_LIMIT+1 1 1 1 interactive_credit CREDIT_LIMIT interactive_credit

CREDIT_LIMIT+1 (8) unsigned long long timestamp sleep_avg activate_task() kernel/sched.c p->timestamp = now expired array schedule() kernel/sched.c expired array prev->timestamp = now active array schedule() kernel/sched.c active array next->timestamp = now CPU pull timestamp sched_clock() - (src_rq->timestamp_last_tick - p->timestamp) CPU (9) int activated actived=-1 sleep TASK_UNINTERRUPTIBLE try_to_wake_up() actived=0 actived=1 TASK_INTERRUPTIBLE credit activate_task() actived=2 TASK_INTERRUPTIBLE activate_task() (10) unsigned long policy 2.4 SCHED_FIF CPU SCHED_RR SCHED_OTHER (11) unsigned int time_slice, first_time_slice time_slice Kernel 2.4 counter first_time_slice 0

1. (1) static_prio prio nice static_prio sleep_avg effecitve_prio() kernel/sched.c sleep_avg -MAX_BONUS/2 ~ MAX_BONUS/2 bonus MAX_BONUS MAX_USER_P RIO* PRIO_BONUS_RATIO / 100 = 10 sleep_avg -5 ~ 5 bonus = (NS_TO_JIFFIES((p)- > sleep_avg)* MAX_BONUS / MAX_SLEEP_AVG) - MAX_BONUS / 2 prio = static _ prio bonus MAX_RT_PRIO MAX_PRIO-1 sleep_avg bonus sleep_avg bonus (2) effective_prio() recalc_task_prio () recalc_task_prio () actived interactive_credit sleep_avg sleep_avg effective_prio() a. effective_prio() sleep_avg interactive_credit b. recalc_task_prio () c. active array expired array effective_prio() d. IDLE 2. (1) time_slice task_timeslice() kernel/sched.c [MAX_RT_PRIO, MAX_PRIO-1] [MIN_TIMESLICE, MAX_TIMESLICE] timeslice = MIN_TIMESLICE + ((MAX_TIMESLICE - MIN_TIMESLICE) * (MAX_PRIO-1- (p)->static_prio) / (MAX_USER_PRIO-1)) 2 static_prio timeslice

2 static_prio time_slice (2) 0 Linux for (each task on the system) { recalculate priority; recalculate timeslice } O(n) task_struct Kernel 2.6 task_timeslice() a. sched_fork b. scheduler_tick c. first_timeslice Kernel2.6 3. sleep_avg sleep_avg Kernel 2.6 sleep_avg (1) sleep_avg PARENT_PENALTY / 100

sleep_avg CHILD_PENALTY / 100 PARENT_PENALTY=100 CHILD_PENALTY = 95 sleep_avg (2) acitvate_task() recalc_task_prio() sleep_avg sleep_avg 0 ~ NS_MAX_SLEEP_AVG MAX_SLEEP_AVG - AVG_TIMESLICE p->mm UNINTERRUPTIBLE p->activated!= -1 INTERACTIVE_SLEEP(p) p->mm UNINTERRUPTIBLE p->activated == -1!HIGH_CREDIT(p) sleep_avg INTERACTIVE_SLEEP(p) INTERACTIVE_SLEEP(p) INTERACTIVE_SLEEP(p) sleep_avg INTERACTIVE_SLEEP(p) sleep_avg+sleep_time sleep_avg (3) schedule() TASK_INTERRUPTIBLE actived>0 actived recalc_task_prio() (2) sleep_time actived=1 sleep_time (ON_RUNQUEUE_WEIGHT * 128 / 100) / 128 (4) CPU CPU sleep_avg run_time run_time sleep_avg 0 (5) sleep_avg p->parent->sleep_avg = p->parent->sleep_avg / (EXIT_WEIGHT+1) * EXIT_WEIGHT + p->sleep_avg /(EXIT_WEIGHT + 1); sleep_avg 1/( EXIT_WEIGHT+1) sleep_avg 1/( EXIT_WEIGHT+1) 4. Kernel 2.6

(1) interactive_credit sleep_avg interactive_credit task_struct 0 interactive_credit 1 recalc_task_prio() a. (p->mm!=null) TASK_UNINTERRUPTIBLE p->activated!=-1 sleep_time>interactive_sleep(p) interactive_credit 1 b. NS_MAX_SLEEP_AVG interactive_credit 1 interactive_credit 1 schedule() CPU run_time sleep_avg sleep_avg 0 interactive_credit HIGH_CREDIT(p) LOW_CREDIT(p) interactive_credit 1 interactive_credit -(CREDIT_LIMIT+1) ~ (CREDIT_LIMIT+1) interactive_credit CREDIT_LIMIT+1 interactive_credit HIGH_CREDIT() CPU run_time /= (CURRENT_BONUS(prev)? : 1) sleep_avg sleep_avg sleep_avg p->sleep_avg += sleep_time sleep_avg sleep_avg (2) sleep_avg sleep_avg TASK_INTERRUPTIBLE sleep_avg sleep_avg (3) TASK_INTERACTIVE() active array active array (p)->prio <= (p)->static_prio - DELTA(p) DELTA(p) = (SCALE(TASK_NICE(p), 40, MAX_BONUS) + INTERACTIVE_DELTA)

SCALE(v1,v1_max,v2_max) = (v1) * (v2_max) / (v1_max) TASK_INTERACTIVE() nice n p nice 12 nice>12 DELTA(p)>5 sleep_avg 5 TASK_INTERACTIVE(p) nice -20 sleep_avg TASK_INTERACTIVE(p) nice active array 5. schedule() kernel/sched.c schedule() Kernel (1) prev next prev CPU next CPU a. b. preempt_disable() c. current prev CPU rq prev prev prev run_time interactive_credit rq rq d. prev prev TASK_RUNNING prev rq schedule() e. rq 0 SMP next idle rq->expired_timestamp = 0 expired_timestamp a. rq active array 0 active array expired array array = rq->active; rq->active = rq->expired; rq->expired = array; rq->expired_timestamp = 0;

rq->best_expired_prio = MAX_PRIO; active array expired array b. sched_find_first_bit() idx queue[idx]->next next idx = sched_find_first_bit(array->bitmap); queue = array->queue + idx; next = list_entry(queue->next, task_t, run_list); 3 c. next TASK_INTERRUPTIBLE actived>0 prio a. prev!=next b. next->timestamp rq->curr=next rq->curr current c. Kernel 2.4 prev mm rq current current=next=rq->curr TIF_NEED_RESCHED (2) schedule() Kernel 2.4 schedule() schedule()

task_struct need_resched schedule() need_resched a. CPU b. CPU c. nice Kernel2.6 Kernel 2.4 need_resched bit 6. (1) sched_init() sched_init() init/main.c start_kernel() CPU runqueue SMP CPU wake_up_forked_process() wake_up_forked_process timer (2) sched_fork(task_t *p) fork kenel/fork.c do_fork()->copy_process->sched_fork() TASK_RUNNIG runqueue runlist array fork sched_tail preempt_count 1 first_timeslice 1 fork CPU 0 1 scheduler_tick() scheduler_tick (3) wake_up_forked_process(task_t * p) fork kernel/fork.c do_fork() fork sleep_avg sleep_avg interactive_credit 0 prio cpu active array idle activate_task(p, rq) active array (4) schedule_tail()

fork() entry.s fork (5) scheduler_tick() update_process_time() SCHED_RR SCHED_FIFO TIF_NEED_RESCHED a. TIF_NEED_RESCHED first_timeslice 0 rq-> expired_timestamp expired_timestamp b. TASK_INTERACTIVE() TASK_INTERACTIVE EXPIRED_STARVING(rq) expired array (STARVATION_LIMIT && ((rq)->expired_timestamp&&(jiffies- (rq)->expired_timestamp >= STARVATION_LIMIT * ((rq)->nr_running) + 1))) ((rq)->curr->static_prio > (rq)->best_expired_prio) EXPIRED_STARVING() EXPIRED_STARVING() STARVATION_LIMIT (rq)->expired_timestamp (rq)->expired_timestamp >= STARVATION_LIMIT * ((rq)->nr_running) + 1) expired array ((rq)->curr->static_prio > (rq)->best_expired_prio) expired array c. EXPIRED_STARVING() active array TASK_INTERACTIVE expired array 1 CPU active array RR a. sleep_avg sleep_avg CPU-bound cache b. CPU CPU (6) sleep wake up interruptible running

4 TASK_INTERRUPTBLE TASK_RUNNING wait_for_completion() try_to_wake_up() wait_for_completion() a. DECLARE_WAITQUEUE() b. add_wait_queue_tail() c. TASK_UNINTERRUPTIBLE d. schedule() e. remove_wait_queue() schedule() try_to_wake_up() activate_task() rq->curr curr TIF_NEED_RESCHED TASK_RUNNING (7) sched_exit(task_t *p) release_task() p->first_timeslice first_timeslice 1 p fork p p->sleep_avg < p->parent->sleep_avg sleep_avg 7. Kernel 2.6 Kernel 2.6 2.4 (1) preempt_disable() preempt_count 1

(2) preempt_count preempt_count arch/i386/kernel/entry.s ENTRY(resume_kernel) cmpl $0,TI_PRE_COUNT(%ebp) # non-zero preempt_count? jnz restore_all need_resched: movl TI_FLAGS(%ebp), %ecx # need_resched set? testb $_TIF_NEED_RESCHED, %cl jz restore_all testl $IF_MASK,EFLAGS(%esp) # interrupts off (exception path)? jz restore_all movl $PREEMPT_ACTIVE,TI_PRE_COUNT(%ebp) sti call schedule movl $0,TI_PRE_COUNT(%ebp) cli jmp need_resched preempt_count 0 0 0 TIF_NEED_RESCHED EFLAGS IF IF schedule() preempt_enable() a. preempt_count 1 b. TIF_NEED_RESCHED 0 preempt_schedule() preempt_count PREEMPT_ACTIVE schedule() schedule() 8. Kernel 2.6 pull push (1) pull CPU CPU CPU pull load_balance() load_balance() CPU idle=1 idle=0 idle=1

idle=0 CPU rebalance_tick() BUSY_REBALANCE_TICK load_balance() load_balance() CPU CPU CPU CPU CPU 25% CPU expired active a. b. cpus_allowed CPU c. CPU cache_decay_ticks cache a. CPU b. CPU CPU active array c. timestamp d. CPU TIF_NEED_RESCHED imbalance idle=1 load_balance() IDLE_REBALANCE_TICK load_balance() schedule() CPU rq load_balance() idle load_balance() idle=0 idle idle=1 (2) push migration_thread() CPU rq->migration_queue push CPU Kernel 2.6 CPU SCHED_FIFO migration_queue set_cpus_allowed() CPU migration_req_t CPU migration_queue migration_thread migration_thread() move_task_away() CPU activate_task() CPU CPU rq->curr resched_task() CPU TIF_NEED_RESCHED 1

Kernel 2.6 : [1] Linus Tovalds, Linux v2.6.4, from www.kernel.org [2] Robert Love, Linux Kernel Development [3], Linux 2.6