linux下task_struct部分解析

来源:互联网 发布:云计算大数据视频教程 编辑:程序博客网 时间:2024/05/12 11:13
...
task_struct结构体详解:
1,进程状态
TASK_RUNNING:可运行状态
TASK_INTERRUPTIBLE:可中断的等待状态
TASK_UNINTERRUPTIBLE:不可中断的等待状态
TASK_ZOMBIE:僵尸状态
TASK_STOPPED:暂停状态
TASK_SWAPPING:换入换出状态
A:可运行状态:
处于这种状态,程序要么正在运行,要么正准备运行。
正在运行的进程就是当前进程(由current所指向的进程),而准备运行的进程只要得到CPU就可以立即投入运行,CPU是这些进程唯一等待的系统资源。系统中有一个运行队列(run_queue),用来容纳所有处于可运行状态的进程,调度程序执行时,从中选择一个进程投入运行。
B:等待状态
处于该状态的进程正在等待某个事件(event)或某个资源,它肯定位于系统中的某个等待队列(wait_queue)中。Linux中处于等待状态的进程分为两种:可中断的等待状态和不可中断的等待状态。处于可中断等待态的进程可以被信号唤醒,如果收到信号,该进程就从等待状态进入可运行状态,并且加入到运行队列中,等待被调度;而处于不可中断等待态的进程是因为硬件环境不能满足而等待,例如等待特定的系统资源,它任何情况下都不能被打断,只能用特定的方式来唤醒它,例如唤醒函数wake_up()等。
C:暂停状态
此时的进程暂时停止运行来接受某种特殊处理。通常当进程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信号后就处于这种状态。例如,正接受调试的进程就处于这种状态。
D:僵死状态(子进程退出,但是父进程没有退出)
当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵死进程。僵死进程会以终止状态存在进程表中,并且会一直在等待父进程读取退出状态代码。
僵尸程序产生的原因:该程序应该已经执行完毕,或者是因故应该要终止了,但是该程序的父进程却无法完整的将该程序结束掉,而造成那个程序一直存在内存当中。如果某个程序的CMD后面还接上<defunct>时,就代表该程序是僵尸程序。
僵尸进程的解决方法:

E:死亡状态
死亡状态是内核运行kernel/exit.c里的do_exit()函数返回的状态。这个状态只是一个返回状态,任务列表中看不到这个状态。

2.进程信息调度
调度程序利用这部分信息决定系统中哪个进程最应该运行,并结合进程的状态信息保证系统运转的公平和高效。这一部分信息通常包括进程的类别(普通进程还是实时进程)、进程的优先级等等。
进程调度信息
need_resched :调度标志
Nice:静态优先级
Counter:动态优先级
Policy:调度策略
rt_priority:实时优先级
当need_resched被设置时,在“下一次的调度机会”就调用调度程序schedule()。 counter代表进程剩余的时间片,是进程调度的主要依据,也可以说是进程的动态优先级,因为这个值在不断地减少;nice是进程的静态优先级,同时也代表进程的时间片,用于对counter赋值,可以用nice()系统调用改变这个值;policy是适用于该进程的调度策略,实时进程和普通进程的调度策略是不同的;rt_priority只对实时进程有意义,它是实时进程调度的依据。
进程调度策略:

注: 只有root用户能通过sched_setscheduler()系统调用来改变调度策略。
进程优先级:
进程CPU资源分配就是指进程的优先级。优先级高的进程有优先执行权力。配置进程优先级对多任务环境的
Linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
修改进程优先级的命令主要有两个:nice,renice

1,nice:一开始执行程序就指定nice值。
nice[-n <优先等级>][-help][--version][执行命令]
A:-n<优先等级>或-<优先等级>设置预执行指令的优先权等级。
B:等级的范围从-20到19,其中-20最高,19最低。
C:只有系统管理者可以设置负数的等级。
2,renice:已存在的程序的nice重新调整
renice[number]PID
renice[优先等级][-g<程序群组名称>..][-p<程序识别码>...][-u 用户名称...]
renice指令可重新调整程序的优先权等级。
A:预设是一程序识别码制定程序调整其优先权,亦可以通过程序群组或用户名称调整优先权等级,并修改其所有隶属于该程序群组或用户的程序的程序的优先权,等级范围从[-20,19]。
B:只有系统管理者可以改变其他所有用户程序的优先权,也仅有系统管理者可以设置负数等级。
整个nice值是可以在父进程和子进程之间传递的呢!
3,top命令也可以更改已存在进程的nice
进入top程序,点击"r"->输入要修改的PID值->输入要修改的Nice值。
3,标识符
进程标识符:PID,每个进程都有唯一的一个标识符,内核通过这个标识符来识别不同的进程。进程标识符也是内核提供给用户程序的接口,用户程序PID对进程进行发号施令。PID是32位无符号整数。 它被顺序编号,新创建的进程的PID通常是前一个进程的PID加1。
PID:进程id
PPID:父进程id
每个进程都属于某个用户组。task_struct结构中定义有用户标识符和组标识符。这两种标识符用于系统的安全控制,系统通过这两种标识符控制进程对系统中文件和设备的访问。
0 0