进程状态|进程优先级

目录

一、进程状态

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)+代码数据
  1. 进程不再执行后,首先释放代码和数据
  2. 进程退出,退出信息(退出码)保存在task_struct中
  3. 管理结构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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值