预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共25页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux进程管理与调度1Linux进程与线程2Linux进程实现Linux进程描述符Linux进程实现——相关的系统调用Linux进程实现——相关的函数为新进程的执行设置跟踪进程的相关内核数据结构,新进程入链表。 置新进程状态为task_running,。 向父进程返回pid。 说明: 创建进程的系统调用返回时(ret_from_sys_call),将根据存放系统调用返回值寄存器EAX的内容(pid)是0还是一个小正整数来决定是运行父进程还是子进程。 在linux中第一个进程是内核进程,pid为0,它是所有的进程的父进程。这个进程也叫swapper,或者说是idle.Linux进程状态Linux状态转换scheduleranddispatcher线程的实现 在Linux系统中,线程被当作与其他进程共享某些资源的进程. 线程的创建:与普通进程相似,需要指明共享资源。 如:clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0); 对比:clone(SIGCHLD,0)//普通的fork() clone(CLONE_VFORK|CLONE_VM|SIGCHLD,0) 内核线程:内核进程没有独立的地址空间,只在内核空间运行。通常是一些后台执行的任务。 通过clone()的参数,新创建的进程,也称为LWP(Lightweightprocess)与父进程共享内存空间,文件句柄,信号处理等,从而达到创建线程相同的目的。5Linux进程调度策略Linux进程调度策略5Linux进程调度策略effective_prio()函数: 计算非实时进程的优先级,主要步骤如下: 算出当前进程平均睡眠时间。 得到进程的动态优先级。 staticinteffective_prio(task_t*p) { if(rt_task(p))returnp->prio; bonus=CURRENT_BONUS(p)–MAX_BONUS/2; prio=p->static_prio–bonus; ……… returnprio; } 说明:系统通过一系列宏计算出bonus. bonus=(进程睡眠jiffers/HZ)*10-5effective_prio()函数: 计算非实时进程的优先级,主要步骤如下: 算出当前进程平均睡眠时间。 得到进程的动态优先级。 staticinteffective_prio(task_t*p) { if(rt_task(p))returnp->prio; bonus=CURRENT_BONUS(p)–MAX_BONUS/2; prio=p->static_prio–bonus; ……… returnprio; } 说明:系统通过一系列宏计算出bonus. bonus=(进程睡眠jiffers/HZ)*10-56Linux进程调度实现Linux进程调度实现Linux进程调度实现调度的实现rt_priority;实时进程的优先级(0——99) nice:用户可控制的进程优先级因子。(-20——19) prio:进程的动态优先级 static_prio:进程的静态优先级 sleep_avg:进程的平均睡眠时间 static_prio=MAX_RT_PRIO+nice+20 schedule()函数 功能:选择一个合适的进程运行。 主要步骤 清理当前运行进程 选择下一个运行的进程 设置新进程的运行环境 执行进程上下文切换 后期整理直接启动调度: 发生在当前进程因等待资源而需要进入被阻塞状态时。 把当前进程放到适当的等待队列中 把当前进程的state设为TASK_INTERRUPTIBEL或者TASK_UNINTERRUPTIBEL; 调用schedule(),准备让新的进程使用CPU; 检查当前进程所需的资源是否可用,如果是,把当前进程从等待队列里删除,否则回到第2步;被动调度: need_resched标志为1时执行,每次调入一个用户态进程之前,该变量的值均会被检查,来决定是否调用schedule()。 如果当前进程用完了其时间片,则调用update_process_times()函数重新计算。 当一个进程被唤醒,且其优先级高于当前进程,wake_up_process()调用reschedule_idle(),设置当前进程的need_resched,使被唤醒的进程尽快使用CPU。 当sched_setschedler()或sched_yield()系统调用被调用时。