Linux进程概念(二)

news2024/11/26 11:53:09

Linux进程概念

  • 进程状态
    • 普通操作系统层面理解
      • 运行与阻塞
      • 挂起与阻塞
    • Linux是怎么做的
    • 孤儿进程
  • 进程优先级
    • 什么是优先级
    • 如何改变优先级
  • 其他概念

进程状态

进程状态分有:

运行 新建 就绪 挂起 阻塞 等待 停止 挂机 死亡…

状态其实就是返回的整形,就像某个数字代表运行或者是阻塞等等。

普通操作系统层面理解

首先通过理论来理解操作系统的三大状态。

运行与阻塞

运行
CPU是被动接受进程的,并且操作系统会管理进程并放在内存中让CPU处理。
那么CPU是怎用什么方式去查看所有的进程呢?是定义了一个PCB类型的队列指向第一个进程的PCB,然后进行对所有进程的管理。
这个时候所有的进程是通过数据结构的方式来链接起来的,CPU会一个一个处理进程,这个时候无论被处理还是没被处理都叫做运行状态
在这里插入图片描述

入队的本质就是讲进程的PCB放入CPU的队列中。
注意:一个CPU只有一个运行队列!不是进程正在运行才是运行状态!运行状态用R表示!
阻塞
CPU在处理数据是非常非常快的,对比其他外设来说是这样的。
平时我们的每个进程都与外设有关,也就是说我们CPU在处理进程的时候会发现有些需要外设来配合,但是外设没有CPU快,这就导致了CPU可能还需要等这个进程和外设配合完成才行。
外设也有和CPU一样的队列,但是外设处理的很慢,也就是说会导致排队,那么CPU在处理某个进程发现他需要和外设配合,然后发现这个硬件已经开始排队了,一时半会也轮不到这个进程,也不可能让这个进程一直等着,这样非常影响效率,这个时候操作系统就会让这个进程的PCB在这个外设的队列中进行排队,这个时候R就变成了阻塞状态,等这个进程处理完成了,再去CPU的队列中重新入队,并且阻塞状态重新变为R。
在这里插入图片描述
这个也说明,我们的进程不仅仅要占用CPU的资源,也会随时随地占用外设资源。
也就是说,所谓的进程状态不同,也就是进入不同的队列等待资源而已!

挂起与阻塞

在这里插入图片描述
现在内存中有一堆的进程,假如说有很多的进程再外设队列,但是现在的内存满了,这应该怎么办呢?
这个时候操作系统就会出手了,将暂时不用的进程先放回磁盘当中,但是保留这个进程的PCB!
这样就节省了一部分空间,因为PCB几乎不占多少空间。
进程被暂时放在磁盘中,这个就叫做挂起,等内存不是那么吃紧了,操作系统就会将这个进程再放回到内存中。
在这里插入图片描述
这也侧面说明,阻塞不一定挂起,挂起一定是阻塞。
还有一种很极端的情况就是很多地方很多状态都需要挂起,就跟各种叠BUFF一样。

Linux是怎么做的

首先来看看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代表的就是运行状态:
在这里插入图片描述
在这里插入图片描述
进程状态这里显示R+,R代表是运行状态,至于后面的+是什么,这个一会说。

如果再代码中加上调用外设会怎么样呢?
在这里插入图片描述
在这里插入图片描述
答案是会阻塞,S代表阻塞的意思。

如何让一个程序暂停?
先用kill -l查询,之前说过,这个指令是对某个进程发射信号的。
在这里插入图片描述
9号是结束进程,19号是暂停进程的运行,18号是继续进程的运行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
继续这个进城之后发现+号没了,然后我对左边的使用了Ctrl+C竟然没有让程序停下来,然后我又用了其他指令发现也能正常运行,只不过刚才的进程也在运行,原来是不可能发生这种情况的。
这是因为+号代表前台进程,可以通过前台关闭,但是+号没了就变成了后台进程,只能通过kill -9 ’PID‘才能让他结束。
这里T代表进程暂停的意思。

上面还有一个D,这个不方便演示,它叫做深度睡眠,只有在进程自动停下来或者是断电的情况下进程才会结束。
比如:
在Linux下,一个进程很大的数据,正在写入磁盘中,但是内存是有限的,如果内存满了,操作系统就会找到这个进程并且干掉他,那么数据就很容易丢失,这个时候就出现了深度睡眠,操作系统看到不会管他,除非这个进程运行完毕自己醒来或者是断电。

想一下,在我们调试一个程序的时候,是会先让他跑起来然后再进行调试的,那么再打断点的时候程序就会停下来:
在这里插入图片描述
在这里插入图片描述
这里 $@代表第一行:的左边 $@代表:右边。
在这里插入图片描述
在这里插入图片描述
这里的 t 被称该程序被追踪,这也是一种暂停状态。

X是死亡状态,不方便展示,因为进程结束的一瞬间所有内容都会被回收。

最后一个很重要的进程状态,他是将要死亡的一个进程,也被称为僵尸进程(Z):
一个进程在结束的时候,并不是立刻结束,而是会有返回值结果的,返回的这个结果会放进PCB中,等待父进程来拿走。
但如果没等到父进程来拿走结果,这个进程提前结束了,这时候进程本身被释放掉,但是相对应的PCB没有被释放掉,这就是僵尸进程。.
下面用一个程序来说明:
在这里插入图片描述
在这里插入图片描述
然后用这个指令来持续监视。
在这里插入图片描述
状态从S变成了Z,这时因为创建的子进程直接就结束了,父进程没来得及收回数据!
僵尸进程也是有一定危害的,如果父进程或者是操作系统因为一些原因没办法收回内存中的PCB是会导致内存泄漏的!

孤儿进程

如果父进程比子进程先退出,那么谁来接受子进程的返回值呢?
这种事情很常见,父进程比子进程先结束,这个子进程会被系统进程1号“收养”,这个子进程也就被称为孤儿进程。
在这里插入图片描述
在这里插入图片描述
我们让父进程结束的时候发现子进程的父进程ID变成了1,这就是系统1号进程,那么为什么父进程结束的时候看不到僵尸状态呢?因为父进程结束PCB直接就会被回收。
并且孤儿进程是后台运行的,原来的S+变成了S。
在这里插入图片描述
后台需要用kiil -9 PID 去关闭。

进程优先级

什么是优先级

优先级是什么呢?就是这件事可以做,但是又很多人,谁先来的问题,比如打饭需要排队,谁先来买饭就给谁一个号。
或者是平时的老人优先,军人优先等。
为什么需要分配优先级?因为资源太少了!进程很多,但是硬件很少!
Linux优先级的特点:本质就是PCB的几个整数而已。(就像排队用的号一样)
Linux下用两个整数来确认优先级的:
在这里插入图片描述
运行起来之后用这条指令查看状态:ps -al

在这里插入图片描述

UID : 代表执行者的身份
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值

进程的优先级 = 老的优先级(80) + nice(NI)

如何改变优先级

Linux中支持正在运行的进程优先级的调整。
改变优先级也就是去改变NI的值而已。
当然平时我们并不需要改变优先级,NI改变的值也是有范围的,所以改变的效果并不太明显。
Ni的范围是:[-20,19]
PRI值越小,优先级越高。
先输入:sudo top
在这里插入图片描述
然后按一下r
在这里插入图片描述
这里输入的是你进程的PID
在这里插入图片描述
这里输入NI值,我输入的是-100
然后q退出
再查看进程的PRI和NI
在这里插入图片描述
这里NI只到了-20,然后就PRI也变成了60.
为什么有范围呢?如果某个进程的PRI太小,CPU分配资源就不均衡。

其他概念

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。(例如,你的QQ闪退不会影响微信正常使用,就算是父子进程也不会互相影响,只不过会需要分配更多资源)
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。(大型服务器会有多个CPU,多个进程在不同CPU运行)
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进。(采用进程不断切换,分配一定时间给某个进程运行)
进程切换:
CPU当中有一套寄存器,其中一个寄存器是保存当前进程的PCB,还有一个寄存器(pc/eip)保存的是当前运行指令的下一个指令的地址,对于这个寄存器还有一些寄存器是配合分析计算指令的,还有一些寄存器是保存的都是当前进程产生的临时数据。
在这里插入图片描述
当然,一个进程在运行的时候是会产生临时数据的,这个时候会将临时数据放在寄存器上运作(这里要注意寄存器硬件 != 寄存器内部数据,寄存器内部的数据也叫上下文),但是我们知道进程很多,CPU只有一个,所以需要通时间片进行并发。
那么在并发的过程中,当前进程是直接切换到下一个进程吗?不是的,因为现在CPU上还有当前进程的上下文,下一个进程如果直接来,也会产生上下文,直接就会将上一个进程的上下文覆盖掉,所以需要先保存当前进程的上下文在进行切换。
等下次轮到这个进程的时候,再将这个进程的上下文放进CPU就能继续正常工作了。
总结:寄存器中的数据是属于当前进程的!寄存器被所有进程共享,寄存器中的数据是属于每个进程的上下文数据!

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

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

相关文章

【毕业设计_课程设计】基于 SVM 分类器的动作识别系统(源码+论文)

文章目录0 项目说明1 研究目的2 研究方法2.1 动作采集2.2 动作识别2.3 智能家居模拟3 论文目录4 项目工程0 项目说明 基于 SVM 分类器的动作识别系统 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 1 研究目的 本项目对经典 SVM 二…

从企业关心的重点,带你了解商业智能BI

企业进行信息化建设,能通过业务信息系统以及规范化、标准化的业务流程存储高质量的业务数据,而这些数据则是数字化转型成功的重要条件。只有信息化和数字化共同发展,企业才能成功完成数字化转型,构建全新的商业模式,完…

kafka的客户端限流(资源配额)

前言 本文说明的是Kafka的客户端(生产者、消费者)与broker之前的限流,不是kafka的broker间topic副本同步的限流。 客户端限流 在kafka的官方文档,不叫限流,叫做资源配额:通过对客户端请求进行配额&#…

细节决定成败:探究Mybatis中javaType和ofType的区别

一. 背景描述 今天,给学生讲解了Mybatis框架,学习了基础的ORM框架操作及多对一的查询。在练习的时候,小张同学突然举手求助,说在做预习作业使用一对多查询时,遇到了ReflectionException 异常 。 二. 情景再现 1. 实…

css 网格布局

简介: 网格是由一系列水平及垂直的线构成的一种布局模式。一个网格通常具有许多的列(column)与行(row),以及行与行、列与列之间的间隙,这个间隙一般被称为沟槽(gutter)。…

智能摄像头视频监控,智和信通一站式解决方案

为进一步加强公共安全视频监控建设联网应用工作,推动整合各类视频图像资源,九部委联合发布的《关于加强公安视频监控建设网络化应用的若干意见》,明确以全域覆盖、全网共享、全时可用、全程可控为总目标。在大大加强城市社会安全保障能力的同…

Kafka Producer 开发

Kafka Producer 开发 kafka包含5个核心的API接口定义: Producer API - 允许应用程序往kafka集群中的topic中发送事件消息Consumer API - 允许应用程序从kafka topic 中读取数据Streams API - 允许对输入数据流进行数据计算、转换,并发送到其他主题进行…

Ultra-high Resolution Image Segmentation via Locality-aware Context Fusion

极高图像语义分割。 作者使用了一个高分辨率分割的pipeline,将原始的超高分辨率图像分成一块一块的用于局部分割,然后将局部的分割结果融合形成最终的高分辨率分割。 方法:1:作者引入了一个局部感知上下文融合(LCF&…

怎么提升360网站权重?怎么查询网站在360权重

怎么提升360网站权重? 一、增加网站流量 1、做高指数的关键词排名。 2、关键词的合理布局。 3、关键词的布局必须注意密度。 4、网站关键词的页面布局必须合理。二、网站页面内容布局 网站页面的内容可以说是网站的灵魂。网站的好坏完全取决于网站的内容是否能给访问…

Redis6新数据类型Bitmaps

Redis6新数据类型1.Bitmaps2.命令1.Bitmaps 简介:现代计算机用二进制(位)作为信息的基础单位,1个字节等于8位,例如“abc”字符串由3个字节组成,但实际在计算机存储时将其用二进制表示,“abc”分别对应的ASCII码是97、…

​草莓熊python turtle绘图(圣诞元旦倒数雪花版)附源代码

​草莓熊python turtle绘图(圣诞元旦倒数雪花版)附源代码 本篇目录: 一、前言 二、​草莓熊python绘图(圣诞元旦倒数雪花版)效果图 三、源代码保存方法 四、代码命令解释 (1)、绘图基本代码…

LaTeX教程(四)——文档内元素

文章目录1. 表格2. 插入图片3. 盒子4. 浮动体1. 表格 LaTeX的表格不想Word能够做到所见即所得,当表格较小还好,一旦表格内容逐渐增多,那么编写表格就变得十分麻烦了,为此,一般都是用在线表格并生成LaTeX代码的形式来得…

Linux——管道和重定向

一、Linux的文件 linux中奉行一切皆文件,包括目录、链接(类似windows的快捷方式)、设备文件。 在内核中,所有打开的文件都使用文件描述符(一个非负整数)标记。文件描述符的变化范围是0~OPEN_MAX – 1。早期的unix系统…

前端CDN和DNS

DNS的基础知识 统一资源定位符(URL) scheme: 方案,包括http,https协议。 host:主机 port:端口 path:路径 query:查询 fragment:片段,访问网址时候定位某个位置 DNS (Do…

Java 开发环境配置

在本章节中我们将为大家介绍如何搭建Java开发环境。 Windows 上安装开发环境Linux 上安装开发环境安装 Eclipse 运行 Javawindow系统安装java 下载JDK 首先我们需要下载 java 开发工具包 JDK,下载地址:Java Downloads | Oracle,在下载页面…

Kaggle房价预测 特征工程模型聚合

目录 一:Kaggle数据集准备 二:数据集分析 三:空值处理 四:空值填充 五:查找所有字符列 六:实例化独热编码对象 七:方差过滤 八:特征数据提取 九:查看特征之间…

跨域/解决跨域方法

一、同源策略 同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也是最基本的安全功能。同源策略会阻止一个域的javascrip脚本和另一个域的内容进行交互,是用于隔离潜在恶意文件的关键安全机制;关于这一点我们后面会举例说明。如果缺…

C语言—指针

指针用来存放一个内存地址&#xff1b; 指针的类型就是要存放地址的变量的数据类型&#xff1b; #include <stdio.h>int main() {int a 123;char b H;int *pa &a;char *pb &b;printf("%d\n", *pa);printf("%c", *pb); } pa要存放int类…

评估篇 | 单元测试评估也能复用到集成测试?脚本帮你高效评估

上次我们分享了单元测试用例的复用&#xff0c;单元测试的用例可以复用到集成测试&#xff0c;那单元测试的评估是否也可以复用到集成测试&#xff1f;答案是可以的。 TPT中提供了多种多样的评估方式&#xff0c;其中的脚本评估使我们复用测试评估成为可能。脚本评估&#xff…

@EnableCaching如何一键开启缓存

EnableCaching如何一键开启缓存手动挡CacheManagerCache使用演示小结自动挡CachingConfigurationSelectorAutoProxyRegistrarProxyCachingConfigurationCacheOperationSourceCacheOperationBeanFactoryCacheOperationSourceAdvisorCacheInterceptor小结手动挡 我们首先来看看S…