目录
一、进程状态
1.什么是进程状态
2.进程状态都包含什么?
3.进程状态的查看
4.进程退出
(1)进程退出的步骤
(2)僵尸进程
(3)孤儿进程
二、进程优先级
1.进程优先级是什么?
2.为什么要有进程优先级?
3.查看进程优先级
4.进程优先级的修改
(1)为什么nice值范围只有[-20,19]?
(2)进程优先级由什么元素构成?
(3)修改进程优先级的指令
一、进程状态
1.什么是进程状态
- 进程状态是指进程在执行过程中的不同情况或阶段,这些状态反映了进程的生命周期和当前的活动情况。进程状态可以随着进程的执行和外界条件的变化而转换。
2.进程状态都包含什么?
- 进程状态在kernel源代码中的定义:
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
- R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
- S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))
- D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束
- T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行
- X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态
3.进程状态的查看
4.进程退出
(1)进程退出的步骤
- 进程=内部数据结构(task_struct)+代码数据
- 进程不再执行后,首先释放代码和数据
- 进程退出,退出信息(退出码)保存在task_struct中
- 管理结构task_struct必须被OS维护,方便用户来获取
(2)僵尸进程
- 子进程退出,父进程不作操作
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork");
exit(1);
}
if(id > 0)
{
printf("parent[%d]is sleeping...\n",getpid());
sleep(30);
}
else
{
printf("child[%d]is begin Z...\n",getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
return 0;
}
循环查看进程的指令
while :; do ps axj | head -1; ps axj | grep [僵尸进程];sleep 1;done
结果展示
- 由上图可以看到,父进程的pid为2911783,子进程的pid为2911784
- 由下图可以看到,父进程休眠30秒进入S+的睡眠状态,子进程休眠5秒后退出进程,则子进程状态是Z+的僵尸状态,并带上了<defunct>后缀
(3)孤儿进程
- 父进程退出,bash维护退出信息,子进程被系统自动领养
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork");
exit(1);
}
if(id > 0)
{
printf("parent[%d]is sleeping...\n",getpid());
sleep(30);
}
else
{
printf("child[%d]is begin Z...\n",getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
return 0;
}
结果展示
- 这里可以看到,父进程pid为2927931,子进程pid为2927932,当父进程退出后,子进程的ppid由原来的2927931变为1,即子进程被系统自动领养(system)
二、进程优先级
1.进程优先级是什么?
- 进程优先级(Process Priority)是操作系统用来决定哪个进程应该优先获得CPU资源的一种机制。操作系统通过分配不同的优先级给进程,以优化系统性能和响应速度。高优先级的进程通常会被操作系统更频繁地调度执行,而低优先级的进程则可能等待更长的时间
2.为什么要有进程优先级?
- CPU目标资源有限,进程之间需要竞争CPU资源(僧多粥少),程优先级的存在是为了优化操作系统的资源分配,提高系统的响应速度、稳定性和资源利用率,同时实现任务之间的公平性和防止资源饥饿
3.查看进程优先级
- 查看进程优先级的指令
ps -al
其中:
UID是指用户ID(可使用ls -ln查看)
PID是指用户进程pid
PPID是指用户父进程id
PRI是指进程最终优先级,PRI=pir + nice值
NI是指进程nice值
4.进程优先级的修改
(1)为什么nice值范围只有[-20,19]?
- 将nice值设定在一个有限的范围内[-20到19],可以确保优先级的划分既足够细致以满足不同任务的需求,又不会过于复杂以至于难以管理。通过限制nice值的范围,操作系统可以更好地平衡各个进程对资源的需求,确保系统能够稳定运行。将nice值范围设定为-20到19,可以为系统管理员提供一个明确的界限,以便他们更好地控制和管理用户对进程优先级的调整。
(2)进程优先级由什么元素构成?
- 在用户空间中,进程优先级通常通过nice值或scheduling priority来表示。nice值是一个用户可调整的参数,用于改变进程获取CPU资源的比例。而scheduling priority则用于实时进程,表示其相对于其他进程的优先级
最终优先级=pri+nice
(3)修改进程优先级的指令
top/r/[PID]/[改nice值] [-20,19]