进程概念详解

news2025/1/29 13:49:41

目录

进程是什么?

描述进程:进程控制块-PCB

task_struct 

task_struct 是什么?

task_struct内容分类

组织进程 

查看进程 

fork创建子进程

进程状态 

 僵尸进程

孤儿进程 

进程优先级 

其他概念 


进程是什么?

一般书上说:进程是运行当中的程序,是担当分配资源的实体。

那么?程序是如何被运行的呢?

我们写好程序代码后,会将程序文件存储到磁盘中,要运行一个程序,首先会将程序代码文件加载到内存中,然后由cpu去运行。

但是,只要程序被加载到内存,它就是一个完整的进程吗?进程和程序仅仅是存储位置不同吗?

当然不是,进程需要消耗资源,那么它就一定会被操作系统所进行管理。

操作系统要管理:首先要先描述,再组织

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

描述进程:进程控制块-PCB

当程序被加载到内存后,操作系统会为该程序创建进程控制块,简称PCB,PCB当中存储着该进程属性的集合。

所以,完整的进程是什么?

进程=程序代码数据+相关数据结构(也就是进程控制块)。 

  

task_struct 

task_struct 是什么?

task_struct 是linux当中描述进程的结构体,它存储着进程信息。

task_struct与PCB的关系就是,task_struct是一种具体的PCB,它是linux环境下具体的PCB。 

task_struct内容分类

 标识符:描述本进程的唯一标识,简称PID。

状态:任务状态,退出代码,退出信号等

优先级:相对于其他进程的优先级。

 程序计数器:程序中即将被执行的下一条指令的地址。

内存指针 :包括程序代码和相关数据的指针,还有和其他进程共享的内存块指针。

 上下文数据:进程执行时,处理器的寄存器当中该进程的数据。(下文详解)

I/O状态信息:显示的IO请求,分配给进程的IO设备和被进程使用的文件列表。

记账信息:包括处理器时间总和,使用的时钟数总和,时间限制,记帐号等。

 其他信息

组织进程 

每个进程都对应着一个进程控制块,操作系统将这些进程控制块用链表形式组织起来,这样对于进程的管理,就变成了对链表的增删查改。

 

查看进程 

获取PID:getpid()

获取PPID:getppid(),PPID表示父进程的ID。

getpid(),getppid()属于系统调用,头文件为sys/types.h 

我们使用的XShell软件本质就是一款命令解释器,我们输入指令后,shell不会自己去解释指令,而是会产生子进程bash去解释这条指令给内核。

为什么要这么做呢?因为如果我们输入了错误指令,产生了错误影响,不能影响我xshell运行,

就相当于某公司员工出了问题,为了不影响公司声誉,公司对外宣称该员工与公司无关。

这样即使出了问题,也不影响公司的整体运行。

这样就由bash来解释这条指令,bash进程就是该指令的父进程。 

每个进程被创建后,会在/proc目录下以该进程PID为名形成目录。 

我们可以通过ls /proc/pid查看该进程

 

 下面我们通过ls -l指令查看该进程详细信息。

 两个重要概念:cwd:表示当前工作目录,程序当中创建文件,默认在该目录下。

                           exe:表示当前执行的程序是谁。

我们也可以通过其他指令查看进程信息。

 ps axj 或 ps ajx或 top

 

fork创建子进程

 fork属于系统调用,作用是创建子进程。

fork函数有两个返回值,对于父进程返回子进程pid,对于子进程返回0

 通过fork函数,可以让一个程序产生两个不同的结果。

通过fork创建的子进程,子进程的PCB以父进程为模板构建,子进程的代码完全和父进程共享,因为代码是不可以被更改的,而父子进程的数据是临时共享的,当父子进程数据要更新时,会发生写时拷贝,因为进程之间是相互独立的,为了防止一个进程数据改变时影响另一个进程,所以在数据发生改变时,对数据拷贝再更改,保证进程之间的独立性。

进程状态 

 下面展示linux状态源码:

/*
* 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状态:深度休眠状态,与S状态相似,但是不可被操作系统杀死。

T状态:暂停状态,无法被唤醒。

X状态:死亡状态

Z状态:僵尸状态

当进程所需资源充足,满足运行条件时,该进程的PCB会被调度模块分配到运行队列中,等待cpu运行,而其他不满足运行条件的进程,被放在等待队列中,称为挂起或阻塞状态

但是为什么R状态并不意味着该进程一直在运行呢?

还是因为资源问题,你这个进程要运行10s,操作系统要是一直让你运行,其他进程怎么办呢?

所以,我们从资源管理器中看到很多进程占用资源,好像一直在运行,这是错误的。

看似好多进程一直在运行,其本质是操作系统根据时间片(单个进程的单次运行最长时间,灰常短),快速切换进程运行的结果。

运行队列进程处于R状态,而等待队列进程处于S或D或T状态。 

 当系统负载高时,资源不够用,操作系统可能会杀掉S状态,而D状态进程处于深度睡眠,不可中断,即使你是操作系统也无法给他杀掉(D状态就是爷,不干事,你也管不了我)。

 到这里,问题又来了,既然操作系统不让进程一直运行,一直在切换,那么我怎么知道你这个程序运行到哪一步呢?

因为只有一份寄存器,所以进程在离开时,要将数据拷贝一份,再下次回来运行的时候,再把数据拷贝回寄存器,然后接着运行。

这种与进程强相关的临时数据就被称作上下文数据

T状态 :

我们可以通过发送SIGSTOP 使进程进入T状态,也就是发送SIGCONT使进程退出T状态。

  

我们可以发现退出T状态后S少了+号,这表示该进程由前端运行变成后端运行,后端运行时,我们可以输入命令,而前端不行。

 X,Z状态:

当程序执行完毕,直接退出是不行的!操作系统需要知道你这个程序是正常结束,还是非正常结束,要是没有这一步,万一出错,谁背锅?

所以,在程序执行完毕后,该进程会先进入Z状态,也就是僵尸状态,此时由父进程读取其退出码,

读取完毕后,进入X状态,也就是死亡状态,接着才被操作系统释放。

我们无法观测到X状态,因为一进入X状态,该进程立马就被释放了。

 僵尸进程

 处于僵尸状态的进程就是僵尸进程。

下面举一个例子:父进程一直处于运行态,不读取子进程退出码,此时子进程就会一直处于僵尸状态。 

 

 那么,僵尸进程有什么危害呢?

僵尸状态必须一直持续,直到父进程读取它的退出码。

僵尸状态也需要被维护。维护僵尸状态就是要维护它的数据信息,PCB。

那么一直不回收就是造成内存资源浪费,造成内存泄漏。

孤儿进程 

 子进程没噶,父进程先噶,此时子进程会被1号进程接管。

这种进程就叫孤儿进程。

进程优先级 

 进程优先级,表示cpu资源分配的先后。

 优先级高,先分配。

 通过优先级,可以极大提高系统性能。

查看系统进程优先级:ps -al 

进程优先级为PRI,值越小优先级越高。

而NI表示nice值,表示优先级修正值。 

默认PRI为80

PRI(new)=PRI(old)(默认为80)+ NI

 NI有40哥级别,-20到19.

修改nice值:top指令 进入后按r 

其他概念 

竞争性:进程数目多,而cpu只有几个,甚至一个,所以进程之间具有竞争属性,为了高效运行,便有了优先级。

独立性:多个进程之间,独立享受资源,运行期间互不干扰。

并发性:多个进程在一个cpu下通过切换,不同时运行,一段时间内,让多个进程都得以推进。

并行性:多个进程在多个cpu下分别执行,同时运行。

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

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

相关文章

【微信小程序】父子组件之间传值

微信小程序父子组件之间传值有两种: 1.父组件向子组件传值 2.子组件向父组件传值 区别: 父向子传值使用的是属性绑定,子组件中的properties对象进行接收父组件传递过来的值。子向父传值使用的是自定义事件,父组件通过自定义事件…

VUE 学习笔记(一)开发环境搭建

1、Visual Studio Code安装及使用 下载地址官网:https://code.visualstudio.com/ 直接点击下载按钮即可,会根据系统自动下载合适的版本,无需自行选择。 2、VSCode 上安装:JavaScript Debugger 目前 Debugger for Chrome 已经处…

基于html+css的盒子内容旋转

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【目标检测论文阅读笔记】Reducing Label Noise in Anchor-Free Object Detection

(Augmentation for small object detection) Abstract 当前的 anchor-free无锚目标检测器 将空间上落在真值框预定义中心区域内的所有特征标记为正。这种方法会在训练过程中产生 标签噪声,因为这些 正标记的特征中的一些 可能位于背景或遮挡…

2023最新8个电脑必装软件,新电脑装完好用又高效

新买的笔记本电脑到手了,需要安装什么软件?不会真的有人这样问吧,万一真的有人不知道需要安装什么软件呢?好吧,提醒一下各位,新电脑不要乱安装软件啊,不然电脑很容易中病毒的。根据我多次换电脑…

MyBatis配置文件 —— 相关标签详解

目录 一、Mybatis配置文件 — properties标签 二、Mybatis配置文件 — settings标签 三、Mybatis配置文件 — plugins标签 四、Mybatis配置文件 — typeAliases标签 五、Mybatis配置文件 — environments标签 六、Mybatis配置文件 — mappers标签 一、Mybatis配置文件 —…

burp抓包https链接不安全解决方法

在浏览器已经导入Burpsuite的证书之后,抓包,浏览器仍然显示抓取https包提示不是私密链接解决方法 适用于没有继续访问的按钮。 方法一: 浏览器输入 chrome://flags 搜索 Allow invalid certificates for resources loaded from localhost.翻译过来就是 允许从本地主机加载资…

2023 年十大目标检测模型!

2023 年十大目标检测模型! 使用深度学习革新对象检测的综合指南。 对象检测示例 “目标检测是计算机视觉中最令人兴奋和最具挑战性的问题之一,而深度学习已成为解决它的强大工具。” 对象检测是计算机视觉中的一项基本任务,涉及识别和定位…

SpringBoot与RabbitMQ 集成以及死信队列,TTL,延迟队列

简单示例 项目结构依赖配置生产者消费者 消息的可靠投递示例 confirmreturn 消费者确认机制消费端限流TTL 单条消息整个队列设置 TTL 死信队列 死信队列的实现步骤 延迟队列消息幂等设计 简单示例 项目结构 依赖 <dependencies><dependency><groupId>org.…

【Linux 裸机篇(一)】ARM Cortex-A 架构基础、汇编基础

目录一、ARM Cortex-A 架构基础1. Cortex-A 处理器运行模型2. Cortex-A 寄存器组2.1 通用寄存器2.1.1 未备份寄存器2.1.2 备份寄存器2.1.3 程序计数器 R152.2 程序状态寄存器二、ARM 汇编基础1. GNU 汇编语法1.1 语句1.2 段1.3 伪操作1.4 函数2. 常用汇编指令2.1 处理器内部数据…

你的订婚|结婚纪念日是质数吗?进来测算看看……

今年开年以来&#xff0c;随着ChatGPT的爆火&#xff0c;原本一直平静的三六零安全科技股份有限公司&#xff08;下称360&#xff09;股价仅2月以来涨幅就达到近200%。然而4月4日晚间&#xff0c;360发布公告称&#xff0c;公司董事长周鸿祎与妻子胡欢离婚。有意思的是&#xf…

【Java版oj】day25星际密码、数根

目录 一、洗牌 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、数根 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、洗牌 &#xff08;1&…

过度的焦虑 到底有多糟

你们知道过度的焦虑到底有多糟糕吗&#xff1f; 现在生活节奏越来越快&#xff0c;不管是生活、工作还是学习&#xff0c;很多方面都给我们带来了很多的压力问题&#xff0c;我们所承受的负担越来越重&#xff0c;很多人时常处于一种非常疲劳、过度的焦虑的状态。 你们知道过度…

什么是Node.js

文章目录什么是Node.js简介常用命令Node内置模块Node.js和JavaScript的区别什么是Node.js 简介 Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它允许开发者使用JavaScript编写服务器端代码&#xff0c;而不仅仅是浏览器端的代码。Node.js的出现使得JavaScript可以在…

Vue环境下安装Less|Sass|Stylus(详细指南)

Vue_Cli环境下如何使用less、sass、stylus&#xff1f;报错如何解决&#xff1f; 安装Less 依次使用以下npm执行命令即可完后less的安装 npm install lessnpm install less-loader在vue组件style中使用less <style lang"less"></style>安装Sass(三者之…

如何抓住ChatGPT的热潮,打造小红书爆款

如何抓住ChatGPT的热潮&#xff0c;打造小红书爆款 前两周我看到一个小红书才申请了没多久就已经有好几万的粉丝&#xff0c;于是我让我老婆也赶紧注册一个&#xff0c;毕竟小红书也有着不错的用户群体 那么我们如何通过GPT辅助我们快速创作呢&#xff1f;先来看下ChatGPT的回答…

《离散数学导学》精炼——第6,7章(类型集合论,谓词逻辑)

引言 笔者一直觉得在计算机这一学科的学习中&#xff0c;离散数学是极为重要的知识基础。离散化的思想体现在计算机学科的方方面面。举例来说&#xff0c;“像素”这一概念是我们日常生活中耳熟能详的&#xff0c;将一个图片拆分成一个个极微小的像素&#xff0c;就是利用了离…

[1] 顺序表实现

一、引入顺序表 提出问题&#xff1a; 顺序表底层是一个数组&#xff0c;为什么不是直接操作数组就好了&#xff0c;还要单独写一个类&#xff0c;说底层是数组呢&#xff1f;&#xff1f; 因为顺序表可以有更多的操作&#xff1a; 比如一个数组&#xff0c;我们没有办法知…

Android 11.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(二)

1.前言 在11.0的系统rom定制化开发中,在原生系统SystemUI下拉状态栏的下拉通知栏的背景默认是白色四角的背景, 由于在产品设计中,在对下拉通知栏通知的背景需要把四角背景默认改成圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景, 然后通过systemui的通知…

MobTech 秒验|极速验证,拉新无忧

一、运营拓展新用户的难题 运营拓展新用户是每个应用都需要面对的问题&#xff0c;但是在实际操作中&#xff0c;往往会遇到一些困难。其中一个主要的难题就是注册和登录的繁琐性。用户在使用一个新的应用时&#xff0c;通常需要填写手机号、获取验证码、输入验证码等步骤&…