进程概念 | 进程状态 | 进程优先级

进程的基本概念

  • 课本概念:程序的一个执行实例,正在执行的程序等。
  • 核心观点:担当分配系统资源(cpu时间、内存)的实体。

资源占用

它占用系统资源向CPU时间,内存等不同进程的资源是相互隔离的,确保进程的稳定运行。

结构组成

包含代码段存放程序代码,数据段存放全局变量的堆栈段,用于函数调用,系局部变量存储等部分。

父子关系

进程之间存在父子关系,父进程可以创建子进程,子进程可以继承父进程的某些属性,如文件描述符等。

  • 在Linux中,进程是程序执行时的一个实例。
  • 操作系统本质是一种进行软硬件资源管理的软件。
  • 操作系统对上以人为本。
  • 操作系统目的要对上给用户提供一个稳定的,高效的,安全的运行环境。
  • 而采用对下进行软硬件资源管理的手段来保证资源是稳定的,高效的,安全的,能进行良好的工作。

操作系统进行内存管理、文件管理、进程管理和驱动管理。

而对于进程管理,在进程运行的过程中,从进程加载,进程运行到进程结束的整个生命周期里,操作系统要对进程进行管理。

那么操作系统如何对进程进行管理?

先描述再组织。

也就是说操作系统为了管理进程,给进程创建了一个数据结构,用来管理每一个不同进程。其中这个数据结构中包含各种该进程的属性。便于操作系统进行管理不同的进程。

进程 = 内核数据结构struct(自己对应的页表和虚拟地址空间之间的映射)+ 程序的代码和数据

描述进程PCB

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。属于内核数据结构。课本上称之为PCB (process control block)。linux操作系统下PCB是task_struct。

  • Task_struct是PCB的其中一种。
  • 在Linux中描述进程的结构体叫做task_struct。
  • taskStruct是Linux内核数据内核的一种数据结构,它会被加载到RAM。内存里并且包含进程的信息。
  • Task struct是纯内存及数据结构,关机之后启动的内容和上一次不同,不是磁盘级别的不会被永久保存下来。

task_struct内容

  • 标识符:描述本进程的唯一标识符,用来区别其他进程。
  • 状态:任务状态,退出代码,退出信息等。
  • 优先级:相对于其他进程的优先级
  • 程序计数器eip:程序中即将被执行的下一条指令的地址。
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的代码块的内存。
  • 上下文数据:进程执行时处理器的寄存器中的数据。
  • Io状态信息:包括显示io请求分配给进程的io设备和被进程使用的文件列表。
  • 记账信息:可能包括处理器时间总和,使用的时钟数分总和和时间限制记账号的。
  • 其他信息。

通过系统调用获取进程的标识符

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;
}
  • 进程ID:pid
  • 父进程ID:ppid

查看进程,创建子进程

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();printf("hello proc : %d!, ret: %d\n", getpid(), ret);sleep(1);return 0;
}

在fork函数之后,两个进程是父子关系,一般而言,代码共享,但是数据是各自私有一份的,采用写时拷贝。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{int ret = fork();if(ret < 0){perror("fork");return 1;}else if(ret == 0){ //childprintf("I am child : %d!, ret: %d\n", getpid(), ret);}else{ //fatherprintf("I am father : %d!, ret: %d\n", getpid(), ret);}sleep(1);return 0;
}

创建多进程multprocess

#include <stdio.h>
#include <iostream>
#include <unistd.h>
using namespace std;
#include <vector>//创建十个子进程
int countNum = 10;void SubProcess()
{while(true){cout << "I am child process , pid : " << getpid() << " , "  << getppid() << endl;sleep(5);}
}int main()
{vector<pid_t> allchild;for(int i = 0 ; i < countNum ; i++){pid_t id = fork();//创建子进程if(id == 0){//子进程SubProcess();}//父进程// else if(id > 0)//{allchild.push_back(id);//}// else{//     perror("fork");//     return 1;// }}cout << "我所有的孩子是:";for(pid_t e : allchild){cout << e << " ";}cout << endl;sleep(10);while(true){cout << "I am father process , pid : " << getpid() << " , "  << getppid() << endl;sleep(10);}return 0;
}

一个函数fork怎么会有两个返回值?

  • Fork函数是一个系统调用的函数,是操作系统用来创建子进程的一个函数。
  • 在创建子进程之后,fork函数之后父子进程的核心工作都做完了,并且父子进程都已经运行了。
  • Folk一定有很多执行fork函数return的时候,前面的核心工作代码已经执行完了。
  • 也就是说当前子进程已经被创建了。
  • 子进程被创建的时候,他的代码,数据结构以及taskstruct都源自于父进程的代码和数据以及父进程的task struct。父子的数据独立。
  • 所以父子进程函数fork之后的返回值不同。
  • 对于父进程fork函数返回新创建子进程的标识符pid,这个pid是一个大于0的值,附近层可以通过这个pid来对此进程进行管理,如监视子进程的状态,向子进程发出信号等。
  • 对于子进程fork函数返回零是为了让子进程能够区别自己是子进程的身份,因为子进程可以通过这个返回值知道自己是新创建的子进程从而执行相应的代码逻辑比如执行与父进程不同的任务。

进程状态

看看Linux内核源代码怎么说?

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态,一个进程可以有几个状态在Linux内核里。进程有时候也叫做任务。下面的状态在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运行状态

并不意味着进程一定在运行中,它表示进程要么在运行中,要么在运行队列里面。

S休眠状态

意味着进程在等待事件完成,这里的睡眠有时候也可以被叫做可中断睡眠。

D磁盘休眠状态Disk sleep

有时候也叫不可中断睡眠状态,在这个状态的进程通常会等待io的结束。

T的状态Stopped

通过发送Sigstop信号来给进程来停止进程。这个可以被暂停的进程,可以通过发送sig cont信号让进程继续运行。

死亡状态dead

这个状态只是一个返回状态,你不会在任务列表里面看到。这个状态。

特殊的进程状态

僵尸进程

僵尸进程的概念。
  • 僵尸进程是一个比较特殊的状态。当子进程退出并且副进程没有读取到子进程退出的返回代码时,子进程就属于僵尸进程。
  • 僵尸进程会议终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
  • 所以只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
僵尸进程的代码实例
#include <stdio.h>
#include <stdlib.h>int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id > 0){ //parentprintf("parent[%d] is sleeping...\n", getpid());sleep(30);}else{printf("child[%d] is begin Z...\n", getpid());sleep(5);exit(EXIT_SUCCESS);}return 0;
}
僵尸进程的危害
  • 进程退出状态必须被维持下去,因为他要告诉关心他的进程(父进程)。你交给我的任务我办的怎么样了?可是父进程如果一直不读取,那么子进程就一直处于z状态。
  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task struct PCB中,换句话说。Z状态一直不退出,PCB一直都要被维护。
  • 那一个父进程创建了很多子进程,就是不回收就会造成内存资源的浪费,因为数据结构对象本身就是要占用内存。会在内存中进行开辟空间抑制持续占用资源,最终导致内存泄露

孤儿进程

孤儿进程的概念
  • 父进程先退出,子进程则就称为孤儿进程。孤儿进程被1号进程领养,被1号进程回收♻️。
孤儿进程的代码实例
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){//childprintf("I am child, pid : %d\n", getpid());sleep(10);}else{    //parentprintf("I am parent, pid: %d\n", getpid());sleep(3);exit(0);}return 0;
}

进程优先级

优先级概念

  • CPU资源分配的先后顺序就是指进程的优先权。因为CPU的资源是有限的,在一个电脑🖥️里面可能只有一个或者多个CPU,但是进程有很多个。
  • Linux操作系统,Windows操作系统的大部分民用级别的操作系统都是采用分时操作系统。分时操作系统保证调度任务绝对公平。
  • 优先权高的进程有优先执行权力。配置进程优先权对于多任务环境的Linux很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来把不重要的进程安排到某个CPU可以大大改善系统整体性能。

查看优先级

  • uid代表执行者的身份。
  • pid代表这个进程的代号
  • ppid表示这个进程是由哪一个进程发展延伸而来的,以及父进程的代号。
  • pri代表这个进程可被执行的优先级,其数越小越早被执行。
  • ni代表这个进程的nice值。

Pri && ni

新的pri = 旧的pri + nice值

  • 当nice值为负值的时候,那么该程序将会优先级值将变小及其优先级会变高,则其越快被执行。
  • 调整进程优先级,在Linux下就是调整进程的nice值。
  • Nice的值取值范围是-20~19,一共是40个级别。

Pri vs ni

  • 进程的nice值不是进程的优先级,进程的nice值会影响到进程优先级变化。
  • Nice值是进程优先级的修正数据。

用top命令更改已经存在进程的nice值

进入top后按r👉🏻输入进程pid👉🏻输入nice值

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

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

相关文章

X3U·可编程控制器的定位控制

FX3U可编程控制器的定位控制进行说明。 一、概要 FX3U可编程控制器可以向伺服电机、步进电机等输出脉冲信号&#xff0c;从而进行定位控制。 脉冲频率高的时候&#xff0c;电机转得快:脉冲数多的时候&#xff0c;电机转得多。用脉冲频率、脉冲数来设定定位对象…

【牛顿迭代法求极小值】

牛顿迭代法求极小值 仅供参考 作业内容与要求 作业内容 作业要求 递交报告 代码 编程实现 计算偏导数 故上述非线性方程组的根可能为 f ( x , y ) f(x, y) f(x,y)的极值点&#xff0c;至于是极小值点还是极大值点或鞍点&#xff0c;就需要使用微积分中的黑塞矩阵来判断了。…

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

C(十三)for、while、do - while循环的抉择 --- 打怪闯关情景

前言&#xff1a; 继C&#xff08;十&#xff09;for循环 --- 黑神话情景之后&#x1f449; https://blog.csdn.net/2401_87025655/article/details/142684637 今天&#xff0c;杰哥想用一个打怪闯关的场景让与大家一起初步认识一下for、while、do - while循环的抉择。&#xf…

【FPGA开发】Modelsim如何给信号分组

前面已经发布过了一篇关于 Modelsim 的入门使用教程&#xff0c;针对的基本是只有一个源文件加一个仿真tb文件的情况&#xff0c;而实际的工程应用中&#xff0c;往往是顶层加多个底层的源文件结构&#xff0c;如果不对信号进行一定的分组&#xff0c;就会显得杂乱不堪&#xf…

一个真实可用的登录界面!

需要工具&#xff1a; MySQL数据库、vscode上的php插件PHP Server等 项目结构&#xff1a; login | --backend | --database.sql |--login.php |--welcome.php |--index.html |--script.js |--style.css 项目开展 index.html&#xff1a; 首先需要一个静态网页&#x…

【深度学习】— 多层感知机介绍、 隐藏层、从线性到非线性、线性模型的局限性

【深度学习】— 多层感知机介绍 4.1 多层感知机4.1.1 隐藏层线性模型的局限性引入隐藏层 4.2 从线性到非线性线性组合的局限性引入非线性堆叠更多隐藏层 4.1 多层感知机 在第 3 节中&#xff0c;我们介绍了 softmax 回归&#xff0c;并实现了其从零开始的实现和基于高级 API 的…

MFC多媒体定时器实例(源码下载)

用MFC多媒体定时器做一个每1秒钟加一次的计时器&#xff0c;点开始计时按钮开始计时&#xff0c;点关闭计时按钮关闭计时。 1、在库文件Med_timeDlg.h文件中添加代码 class CMed_timeDlg : public CDialog { // Construction public:CMed_timeDlg(CWnd* pParent NULL); // st…

EEPROM读写实验——FPGA学习笔记18

一、EEPROM简介 Electrically Erasable Progammable Read Only Memory:是指带电可擦可编程只读存储器&#xff0c;是一种常用的非易失性存储器&#xff08;掉电数据不丢失&#xff09; EEPROM发展历史 我们这次实验所用的AT24C64存储容量为64Kbit&#xff0c;内部分成256页&am…

成都睿明智科技有限公司真实可靠吗?

在这个日新月异的电商时代&#xff0c;抖音作为短视频与直播电商的佼佼者&#xff0c;正以前所未有的速度重塑着消费者的购物习惯。而在这片充满机遇与挑战的蓝海中&#xff0c;成都睿明智科技有限公司以其独到的眼光和专业的服务&#xff0c;成为了众多商家信赖的合作伙伴。今…

《python语言程序设计》2018版第8章19题几何Rectangle2D类(中)-同志们我要起飞了

前言 昨天的原始绘制两个矩形的代码段draw_rec2原始draw_rec2运行结果我们不是上面往右转90.我怎么往左转90不对吗??? ☺️结果利用已建立完的Rectangle2D类来实现Rectangle2D类的代码可以找上集看,今天是锻炼的一天好几个倒立体式解锁了.祝大家愉快 经过昨天晚上的努力我终…

97. UE5 GAS RPG 实现闪电链技能(二)

书接上回&#xff0c;如果没有查看上一篇文章的同学推荐先看上一章&#xff0c;我们接着实现闪电链技能。 在上一章最后&#xff0c;我们实现了闪电链的第一条链&#xff0c;能够正确显示特效&#xff0c;接下来&#xff0c;我们先实现它的音效和一些bug修复。 我们在多端网络里…

cnn突破四(生成卷积核与固定核对比)

cnn突破三中生成四个卷积核&#xff0c;训练6万次&#xff0c;91分&#xff0c;再训练6万次&#xff0c;95分&#xff0c;不是很满意&#xff0c;但又找不到问题点&#xff0c;所以就想了个办法&#xff0c;使用三个固定核&#xff0c;加上三层bpnet神经网络&#xff0c;看看效…

双十一狂欢派对 五款市面上获得好评的好物

一年一度的双十一购物狂欢派对即将到来&#xff0c;这一天不仅是广大消费者的福利日&#xff0c;也是各大品牌展示实力的战场。随着市场的不断发展与消费者需求的多样化&#xff0c;双十一已经不仅仅是降价促销的代名词&#xff0c;更是品质与创新的竞技场。在琳琅满目的商品中…

产品经理产出的原型设计 - 需求文档应该怎么制作?

需求文档&#xff0c;产品经理最终产出的文档&#xff0c;也是产品设计最终的表述形式。本次分享呢&#xff0c;就是介绍如何写好一份需求文档。 所有元件均可复用&#xff0c;可作为管理端原型设计模板&#xff0c;按照实际项目需求进行功能拓展。有需要的话可分享源文件。 …

ChatGPT Canvas:交互式对话编辑器

自两年前 ChatGPT 发布以来&#xff0c;主流 AI 均以对话形式进行交互。传统的对话式界面可以直观看到反馈结果&#xff0c;但在需要深度编辑和协作的项目中就略显局限。为了解决此问题&#xff0c;几个月前 Claude 就发布过 Artifacts 功能&#xff0c;用来拓展原有对话。而现…

django华业社区电子政务管理系统-计算机毕业设计源码33448

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

【Java】Java面试题笔试

[赠送]面试视频指导简历面试题 Java面试笔试题题库华为 java笔试面试题2014.files 就业相关java 面试题 面试题库 视频笔记 java笔试题大集合及答案 java面试书籍源码 java算法大全源码包8张图解 java.docx25个经典的Spring面试问答.docx 25个经典的Spring面试问答.docx 100家大…

【hot100-java】【删除链表的倒数第 N 个结点】

链表篇 思路&#xff1a; 先走一遍记录链表长度 再走到对应的点&#xff0c;然后删除 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode…

【LLM】OpenAI o1模型和相关技术

Note OpenAI o1 模型中推理过程的工作原理 1、o1模型引入了reasoning tokens。这些token用于"思考"&#xff0c;帮助模型分解对提示的理解&#xff0c;并考虑生成回应的多种方法。2、在生成推理token后&#xff0c;模型会产生一个可见的完成token作为答案&#xff0…