进程的状态和优先级

news2024/9/9 4:08:53

一.进程的退出

进程=内核PCB+数据和代码,它们都要占据内存空间,进程退出的核心工作之一就是释放掉自己的PCB+数据和代码。

为什么要创建出进程呢?一定是我要进程完成某些任务!

当进程退出了,不光光只是退出了这么简单,还要知道该进程把任务完成的怎么样吧,这里的你指的是谁啊?

一般指的是父进程或者OS,进程退出的时候,要有一些退出信息,表明自己把任务完成得怎么样了!

比如说平时我们写代码,给main函数的返回值都是return 0的,为什么这里我们要返回0呢?返回1,2,3等等行不行,

其实这里return 0就是一种退出信息,表示将任务完成的很好。(后续细说这个退出码)


进程退出了,退出信息会由OS写到该退出进程的PCB中,可以允许进程的代码和数据空间释放掉,但是它的退出信息还没有被父进程或OS读取到,OS就还必须维护该进程的PCB!

此时,该进程算是退出了吗?OS已经不会再调用该进程了,但是它的PCB确实还存在着,这时的进程就叫做僵尸进程。

二.Z(zombie)-僵尸进程

1.什么是僵尸进程?

僵尸状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)

没有读取到子进程退出的返回代码时就会产生僵尸(死)进程。

僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。

所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

用代码来验证僵尸进程:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
 {
     pid_t id=fork();
     if(id<0)
          return 1;
      else if(id==0)//子进程
     {
       int ret=5;
       while(ret)
         {
            printf("I am child,run time:%d\n",ret--);
            sleep(1);
         }
        printf("I am child,dead!\n");
        exit(2);//进程退出(后续说)
    }
    else
    {                                         
        while(1)//父进程
       {
            printf("I am father,running any time\n");
            sleep(1);
       }
    }
    return 0;
 }

image-20240710154638161

可以很清晰的看见,当进程运行起来的时候,父子进程一起运行起来,当打印了五次之后,子进程退出了,但是父进程还在继续运行,父进程没有读取到子进程的退出信息,此时的子进程的状态就变成了Z+状态,也就是僵尸状态,此时的子进程也就变成了僵尸进程。

当进程变成了僵尸进程,就连kill -9也没办法杀死该进程,因为谁也杀死不了一个已经死了的进程。

2.僵尸进程的危害

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!


维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话

说,Z状态一直不退出,PCB一直都要维护?是的!


那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构

对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!

内存泄漏?是的!

如何避免?后面讲

三.孤儿进程

当子进程退出了,父进程还没退出,父进程没有获取到子进程的退出信息,这时子进程就变成了僵尸进程。

然而孤儿进程恰恰是相反的,当父进程退出的时候,子进程还没有退出,这个时候的子进程就变成了孤儿进程了。

同样的我们还是使用代码来说明:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
 {
     pid_t id=fork();
     if(id<0)
          return 1;
      else if(id==0)//父进程
     {
       int ret=5;
       while(ret)
         {
            printf("I am father,run time:%d\n",ret--);
            sleep(1);
         }
        printf("I am father,dead!\n");
        exit(2);//进程退出(后续说)
    }
    else
    {                                         
        while(1)//父进程
       {
            printf("I am child,running any time\n");
            sleep(1);
       }
    }
    return 0;
 }

image-20240710162825346

image-20240710163215381

父进程的父进程是bash,这时毋庸置疑的,故而父进程退出的时候,它的退出信息被bash获取到了。

父进程使用fork创建出的子进程,父进程需要管理子进程的,但是子进程还在运行,父进程却已经退出了,子进程这个时候需要被领养,也就是被1号进程(init进程)领养,其实也就是OS。

四.进程的优先级

1.优先级的概念

  • cpu资源分配的先后顺序,就是指进程的优先级(priority)。

  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。

  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

OS中有很多进程需要调度,但是cpu就只有一个,那么这些进程就需要排队,排队的本质就是在确定进程的优先级。

2.为什么要有优先级?

举一个很简单的例子,像我们排队在食堂打饭的时候,为什么我们要排队呢?本质上就是窗口太少了,人太多了,资源分配不足。在OS中也是一样的,CPU只有一个,键盘只有一个,显示器只有一个,当很多进程都需要访问这些软硬件资源的时候,分配不过来,就需要指定哪些先执行,哪些后执行,这就是优先级的作用!!

3.查看系统进程

使用命令:**ps -l**查看系统中的进程。

image-20240710210106581

注意到几种重要的信息:

  • UID : 代表执行者的身份

  • PID : 代表这个进程的代号

  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号

  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行

  • NI :代表这个进程的nice值

4.操作优先级-修改NICE值

在linux中进程的优先级的范围为:60-99(一共四十个)。

默认进程的优先级都是80

其中优先级的数字越小,优先级越高。


其中通过nice值可以修改进程的优先级。

pri(新)=80+nice值。

修改步骤如下:

  • 使用命令top,进入任务管理器。

  • 然后在按“r”->输入进程的PID->输入nice值。

注意优先级的返回是有限制的。所以你输入再大或者再小的nice值,进程的优先级都会在60-99之间。

当你输入负nice值的时候,进程的优先级会变大,普通用户是做不到的,root账户才能做到。


为什么要将进程的优先级设置在一定范围呢?

OS调度进程的时候,要较为均衡的让每一个进程都要得到调度!

如果将进程可以设置为超级大,那么优先级小的进程,长时间得不到cpu的调度——进程饥饿。


其他概念

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。

  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。

  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。

  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1918091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

巢链接小程序正式上线!全面开启AI共创新时代

巢链接小程序正式上线&#xff01;全面开启AI共创新时代 &#x1f680; 今天我们官宣&#xff0c;巢链接小程序正式上线啦&#xff01;这是一款致力于打造连接开发者、创业者和运营者的全新平台&#xff0c;旨在通过共创和分享实现共同成长。快来了解巢链接小程序的诸多功能&a…

普中51单片机:定时器与计数器详解及应用(七)

文章目录 引言定时器工作原理TMOD定时器/计数器工作模式寄存器定时器工作模式模式0(13位定时器/计数器)模式1(16位定时器/计数器)模式2(8位自动重装模式)模式3(两个8位计数器) 定时器配置流程代码演示——LED1间隔1秒闪烁代码演示——按键1控制LED流水灯状态代码演示——LCD160…

抖音机构号授权矩阵系统源码:打造自媒体帝国的新利器

在自媒体风起云涌的时代&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;早已成为内容创作者们争相入驻的热门平台。然而&#xff0c;随着竞争加剧&#xff0c;如何在这场流量大战中脱颖而出&#xff0c;成为每一位自媒体人不得不面对的课题。今天&#xff0c;我们将带您深…

JVM:类加载器

文章目录 一、什么是类加载器 一、什么是类加载器 类加载器&#xff08;ClassLoader&#xff09;是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。类加载器只参与加载过程总的字节码获取并加载到内存这一部分。

【JavaWeb程序设计】JavaBean(一)

目录 一、<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>的使用 1. 运行截图 2. UserBean.java 3. login.html 4. display.jsp 二、设计求三角形面积 1. 运行截图 2. 设计View&#xff08;inputTriangle.jsp&#xff09; 3. 设计Model&#…

AI发展到现在,国内大模型行业还有哪些机会?

随着各种AI工具的发展&#xff0c;AI领域的竞争格局正在悄然变化。GPT-4o被许多人误解为重大突破的更新&#xff0c;实际上主要是在多模态功能上的增强&#xff0c;而核心智能水平似乎仍停留在GPT-4阶段。这一现象为我们思考AI发展路径和国内大模型行业的机遇提供了新的视角。 …

运维Tips | Ubuntu 24.04 安装配置 xrdp 远程桌面服务

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Ubuntu 24.04 Desktop 安装配置 xrdp 远程桌面服务 描述:Xrdp是一个微软远程桌面协议(RDP)的开源实现,它允许我们通过图形界面控制远程系统。这里使用RDP而不是VNC作为远程桌面,是因为Windows自带的远程桌面连接软…

软件缺陷简介

缺陷种类 遗漏&#xff0c;指规定或预期的需求为体现在产品种错误&#xff0c;需求是明确的&#xff0c;在实现阶段未将需求的功能正确实现冗余&#xff0c;需求说明文档中未涉及的需求被实现了不满意&#xff0c;用户对产品的实现不满意也成为缺陷 缺陷等级划分 致命&#…

Qt QWebSocket网络编程

学习目标&#xff1a;Qt QWebSocket网络编程 学习前置环境 QT TCP多线程网络通信-CSDN博客 学习内容 WebSocket是一种通过单个TCP连接提供全双工通信信道的网络技术。2011年&#xff0c;IETF将WebSocket协议标准化为 RFC6455&#xff0c;QWebSocket可用于客户端应用程序和服…

金龙鱼:只是躺枪?

中储粮罐车运输油罐混用事件持续发酵&#xff0c;食用油板块集体躺枪。 消费者愤怒的火&#xff0c;怕是会让食用油企们一点就着。 今天&#xff0c;我们聊聊“油”茅——金龙鱼。 一边是业内人士指出&#xff0c;油罐混用的现象普遍存在&#xff0c;另一边是金龙鱼回应称&am…

Mac虚拟机跑Windows流畅吗 Mac虚拟机连不上网络怎么解决 mac虚拟机网速慢怎么解决

随着技术的发展&#xff0c;很多用户希望能在Mac电脑上运行Windows系统&#xff0c;从而能够使用那些仅支持Windows系统的软件。使用虚拟机软件可以轻松满足这一需求。但是&#xff0c;很多人可能会有疑问&#xff1a;“Mac虚拟机跑Windows流畅吗&#xff1f;”&#xff0c;而且…

3SRB5016-ASEMI逆变箱专用3SRB5016

编辑&#xff1a;ll 3SRB5016-ASEMI逆变箱专用3SRB5016 型号&#xff1a;3SRB5016 品牌&#xff1a;ASEMI 封装&#xff1a;SGBJ-5 批号&#xff1a;2024 现货&#xff1a;50000 最大重复峰值反向电压&#xff1a;1600V 最大正向平均整流电流(Vdss)&#xff1a;50A 功…

懂点技术就可以做,适合程序员的一种生意思路|在FlowUs记录成长 发布知识库

你们是否经常在闲暇时刷刷手机&#xff0c;看看视频&#xff0c;打发时间呢&#xff1f;其实&#xff0c;这些零散的时间完全可以被利用起来&#xff0c;成为你们财富增长的源泉。下面我将分享一种适合程序员的生意思路&#xff0c;让你们用技术的力量&#xff0c;将知识转化为…

星环科技推出语料开发工具TCS,重塑语料管理与应用新纪元

5月30-31日&#xff0c;2024向星力未来数据技术峰会期间&#xff0c;星环科技推出一款创新的语料开发工具——星环语料开发工具TCS&#xff08;Transwarp Corpus Studio&#xff09;&#xff0c;旨在通过全面的语料生命周期管理&#xff0c;极大提升语料开发效率&#xff0c;助…

什么是业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架&#xff0c;旨在帮助组织高效地进行架构设计和管理。而TOGAF的核心就是由我们熟知的四大架构领域组成&#xff1a;业务架构、数据架构、应用架构和技术架构。 所以今天我们就来聊聊&#xff0c;企业…

挂载磁盘目录(挂载一个u01的磁盘目录)

这里我们没有u01磁盘目录&#xff0c;需要重新挂载一个u01磁盘目录 查看当前文件系统使用情况 [rootlocalhost ~]# df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 devtmpfs devtmpfs 1.4G 0 1.4G 0% /dev tmpfs …

C++初学者指南-5.标准库(第一部分)--顺序视图

C初学者指南-5.标准库(第一部分)–顺序视图 文章目录 C初学者指南-5.标准库(第一部分)--顺序视图std::string_view (C17)避免不必要的内存分配类似字符串的函数参数创建string_viewsstring_view接口 std::span &#xff08;C20&#xff09;作为参数&#xff08;主要用例&#x…

0301STM32GPIO外设输出功能

STM32GPIO外设输出功能 STM32内部的GPIO外设GPIO简介基本结构GPIO位结构输入部分&#xff1a;输出部分&#xff1a; GPIO八种工作模式浮空/上拉/下拉输入模拟输入开漏/推挽输出复用开漏/推挽输出 手册寄存器描述English缩写GPIO功能描述外设的GPIO配置GPIO寄存器描述端口输入数…

TSN时钟同步 | PTP对时案例演示——基于NXP i.MX 8M Plus

TSN简介 TSN介绍 时间敏感网络(TSN&#xff1a;Time Sensitive Networking)是IEEE802.1工作组中的TSN任务组开发的一套协议标准。该标准定义了以太网数据传输的时间敏感机制&#xff0c;为标准以太网增加了确定性和可靠性&#xff0c;以确保以太网能够为关键数据的传输提供稳…

Keil 5 在编译代码时出现CPU占用过高、伴随出现keil卡顿未响应的问题解决办法

问题背景&#xff1a; 在使用keil 5编译程序的时候&#xff0c;经常出现CPU占用100%&#xff0c;并且伴随出现keil卡顿未响应情况。 如下图所示&#xff1a; 解决方法1&#xff1a; 修改keil的多线程编译设置&#xff0c;减少编译的线程数或者不使用多线程编译&#xff08;编译…