Linux 进程优先级、程序地址空间、进程控制

news2024/10/3 8:29:57

个人主页:仍有未知等待探索-CSDN博客

专题分栏: Linux

目录

一、进程优先级

1、什么是进程优先级?

2、为什么要有优先级?

3、Linux的优先级特点、查看方式

4、命令行参数和环境变量

1.命令行参数

2.环境变量

获取环境变量的方式:

二、程序地址空间

1、进程的地址空间

2、基本理解

对于现象的解释(操作系统 -> 写时拷贝):

3、细节问题

为什么不在子进程创建的时候就直接全部拷贝一份?

4、如何理解地址空间

1.区域的划分

2.地址空间的理解

3.为什么要有地址空间

4.页表和写时拷贝的理解

5.虚拟地址的理解

6.Linux中调度

大O(1)调度算法

三、进程控制

1、进程创建

进程调度fork之后,内核的工作(步骤)

进程具有独立性的理解

fork函数的返回值

fork函数为什么会有两次返回值

fork函数常规用法

fork函数调用失败的原因

写时拷贝

2、进程终止

进程终止的意义

进程终止的三种情况

进程为什么会异常?

进程退出的原因?

进程退出判断顺序?

如何终止?

3、进程等待

进程等待是什么?

进程等待的原因

wait/waitpid

status参数是什么?

退出信息

如何理解阻塞等待子进程?

如何从status中获取到退出码和退出信息?

非阻塞等待

4、进程的程序替换

exec系列函数

解释原理

进程替换有没有创建新的进程?

怎么加载?

exec*系列的返回值

程序替换的意义

系统调用:execve


一、进程优先级

1、什么是进程优先级?

进程获取某种资源(cpu)的先后顺序。

  • task_struct 进程控制块 -> int prio;
  • Linux中优先级数字越小,优先级越高
  • 优先级和权限的区别:优先级是能执行,表示执行的顺序;而权限是能不能执行的问题。

2、为什么要有优先级?

进程访问cpu的资源始终是有限的

操作系统关于调度和有限级的原则:分时操作系统:根据时间片来进行调度 --- 保证基本的公平。

如果进程长时间不被调度,就造成了饥饿问题。

3、Linux的优先级特点、查看方式

  • Linux查看优先级的指令:ps -al
  • PRI:进程的优先级,NI:进程优先级的修正数据(用于对优先级的动态修改)。最终进程的优先级 = PRI + NI。
  • 调整优先级的指令:top --->  r ---> PID to renice -> Value(本人修改的NI值)NI值也就是nice值,不是随便调整的,而是有范围的[-20, 19]
  • 每次优先级的调整,PRI的值都是从80开始的。

4、命令行参数和环境变量

1.命令行参数

int main(int argc, char *argv[]):对于这种写法的main函数里面的参数代表着什么

是命令行字符串,程序的路径+名称 和 该进程匹配的选项。

命令行参数的意义

命令行参数的本质是交给我们不同的选项,来定制不同的程序功能

  • 父进程的数据默认能被子进程看到并访问。

  • 命令行中启动的程序,都会变成进程,都是bash的子进程。

2.环境变量

Linux中存在一些全局的设置,告诉命令行解释器,应该去哪个路径下去寻找可执行程序。

  • 可以用env指令去查看所有的环境变量:

  • 可以用echo指令打印环境变量的内容:

  • 默认我们能查到的环境变量是内存级别的,当xshell重启后,环境变量默认会恢复。
  • 环境变量不是在内存中,而是在系统对应的配置文件中。内存的环境变量,是xshell启动的时候,加载到内存中的。
  • env:一个查看环境变量的指令

    export name=value:导入环境变量的指令

    unset name:取消环境变量的指令

  • 本地变量:hello=1234,不能被子进程继承。这个helloc是本地变量,当你用env查看环境变量的时候是不会找到这个变量的。

  • environ -> 一个char**类型,存放着环境变量(unistd.h、需要声明,extern char** environ)
  • 环境变量可以被子进程拿到的。-> 环境变量默认在bash内部。

  • bash进程启动的时候,默认会给子进程形成两种表:

    argv[]命令行参数表、env[]环境变量表。bash通过各种方式交给子进程。

  • 环境变量具有系统级的全局属性,因为环境变量本身会被子进程继承下去。

  • echo、export都是内建命令(不是bash子进程创建的,而是bash执行的)。

  • 本地变量旨在本bash内部有效,无法被子进程继承下去,导成环境变量,此时才能够被获取。

获取环境变量的方式:

1、函数:获取环境变量的值:char* getenv(char* name)。

2、extern char** environ。

3、通过main函数的参数。

二、程序地址空间

1、进程的地址空间

现象:在一段代码中,子进程改变了全局变量,但是在父进程中读取到的仍是原来的值,并且子进程和父进程中全局变量的地址一样。

2、基本理解

  • 每个进程都有一个独立的地址空间。
  • 每个进程都有一个独立的页表。
  • 地址空间的本质就是内核中的一个结构体对象。
  • 子进程会把父进程的大部分内核数据拷贝一份。

对于现象的解释(操作系统 -> 写时拷贝):

如果子进程要修改的值,这个值不仅仅只有子进程在使用的话,操作系统会重新开辟一块新的物理空间,将数据拷贝给新的物理空间,让子进程指向新的物理空间(修改物理内存、修改页表)。(物理内存中的代码和数据要拷贝一份、task_struct也要拷贝一份,拷贝后的内容大部分和之前是相同的)

子进程和父进程中共享变量的地址相同,其实是虚拟地址相同而已。

3、细节问题

如果父子进程不写的话,全局变量默认是被父子共享的,代码是共享的(只读)。

为什么不在子进程创建的时候就直接全部拷贝一份?

为了节省空间。并且父子进程共享的数据中,有大部分数据都是不会进行修改的 --- 按需申请。

4、如何理解地址空间

1.区域的划分

地址空间本质是内核的一个struct结构体,很多的属性都是表示范围的变量(start,end)

struct area
{
    int start;
    int end;
}

2.地址空间的理解

地址空间是一个结构体,有各种的地址划分。

如下图,

3.为什么要有地址空间

实际的物理空间,代码区、数据区、堆区、栈区、共享区、命令行参数和环境变量都是乱序的。

所以为了好管理,人为的规定了地址空间。

  • 地址空间将无序变成有序,让进程以统一的视角看待物理内存以及自己运行的各个区域。

  • 进程管理模块和内存管理模块进行解耦。

  • 拦截非法请求。

4.页表和写时拷贝的理解

5.虚拟地址的理解

程序运行后,使用的是虚拟空间的地址,而想要得到物理地址需要用页表进行映射。

最开始的时候,地址空间和页表中的数据是由操作系统在程序加载到内存中动态创建和管理的。

6.Linux中调度

在Linux中,每个cpu都会由一个运行队列。

大O(1)调度算法

三、进程控制

1、进程创建

进程调度fork之后,内核的工作(步骤)

  1. 分配新的内存块和内核数据结构给子进程。

  2. 将父进程大部分数据结构内容拷贝至子进程。

  3. 添加子进程到系统进程列表中。

  4. fork返回,开始调度器调度。

进程具有独立性的理解

子进程有自己的相关管理数据结构,虽然代码是和父进程共享的,但是数据被写时是以写时拷贝进行独立的。

fork函数的返回值

子进程返回0,父进程返回子进程的pid。

fork函数为什么会有两次返回值

在fork函数返回之前,子进程已经创建完毕,可以开始进行调度了。

fork函数常规用法

1、子进程复制父进程,是父子进程同时执行不同的代码段。

2、子进程执行一个不同的程序。

fork函数调用失败的原因

1、系统中有太多的进程。

2、实际用户的进程数超过了限制。

写时拷贝

2、进程终止

进程终止的意义

1、释放曾经的代码和数据所占用的空间。

2、释放内核数据块。 --- 可能延迟释放。(僵尸状态)

进程终止的三种情况

1、代码跑完,结果正确。

2、代码跑完,结果不正确。

2、代码执行时,出现了异常,提前退出了。

  • 结果正不正确可以通过进程的退出码决定
  • 一旦出现异常,退出码就没有任何的意义了。

pl:在用VS编程时,代码运行的时候崩溃了。 --- 本质就是os发现这个进程做了不该做的事情(如:访问了非法地址等),直接杀死了进程。

进程为什么会异常?

进程出现异常 本质上 就是因为进程收到了os发给进程的信号!

我们可以通过查看退出信号来判断进程出现异常的情况。

进程退出的原因?

可以根据退出码来进行判断,退出的原因。

进程退出判断顺序?

1、先看退出信息,判断是否是因为异常而退出的。

2、如果不是异常引起的,在看退出码,判断是否运行正常。

衡量一个进程退出,只需要退出码和退出信号

如何终止?

1、main函数中return,表示进程结束。(非main函数中return,表示函数结束)

2、调用exit函数。注意:我们代码的任意位置调用exit(int status),都表示进程退出。

3、调用_exit(int status) --- 系统调用。

3、进程等待

进程等待是什么?

任何进程在退出的情况下,一般必须要被父进程进行等待。如果父进程不管不顾,子进程变成Z状态,内存泄漏。

进程等待的原因

  • 父进程通过等待解决子进程退出的僵尸问题,回收系统资源。(一定要考虑)
  • 获取子进程退出的信息。(不一定需要)

wait/waitpid

status参数是什么?

  • 输出型参数
  • 输出子进程退出信息。

退出信息

退出信息 = 进程退出码 + 退出信号

一个int,在X86下是32位bit位,怎么存储信息如下:

如何理解阻塞等待子进程?

阻塞等待子进程的本质是父进程主动放弃CPU使用权,进入等待状态,并将其PCB从运行队列转移到等待队列中。当子进程结束时,父进程会被操作系统唤醒并重新加入到运行队列中。

如何从status中获取到退出码和退出信息?

1、退出码 = (status >> 8) & 0xFF

     退出信号 = status & 0x7F

2、WIFEXITED(status) --- 判断是不是正常退出(判断退出信号)。

      WEXITSTATUS(status) --- 获取子进程退出码。

非阻塞等待

  • waitpid的参数optionsu如果为0就是阻塞等待,如果为WNOHANG就是非阻塞等待。

  • waitpid采用非阻塞等待,本质就是检测子进程的状态变化。

pid_t > 0:  调用成功了,并且子进程退出了,父进程回收成功。

pid_t < 0:  调用失败了。

pid_t == 0:调用是成功的,只不过子进程还没退出,需要要你下一次进行重复等待。

  • 非阻塞等待的时候 + 循环 = 非阻塞轮询。

4、进程的程序替换

exec系列函数

就是用exec系列的函数,执行新的程序。

解释原理

进程替换有没有创建新的进程?

没有创建新进程。只是把新程序的代码和数据覆盖老进程。页表可能会修改一下新的映射关系,PCB属性可能会有改变。

站在被替换进程的角度,本质就是这个程序被加载到内存了!

怎么加载?

exec*系列函数类似于是一种Linux上的加载函数。

exec* 系列的函数,执行完毕之后,后续的代码不见了,被替换了。

exec*系列的返回值

exec* 函数的返回值不需要考虑,如果exec*函数运行成功了,后续代码不会被运行;如果运行失败了,才会运行后续代码。

程序替换的意义

创建子进程,让子进程完成任务:

1、让子进程执行父进程代码的一部分

2、让子进程执行一个全新的程序。

系统调用:execve

谢谢大家!!! 

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

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

相关文章

Unity强化工程 之 SpriteEditer Multiple

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 1. SpriteEditer Multiple Automatic slicing - Unity 手册 这是用于裁剪图集的模式 应用之后精灵编辑器会看到Slice亮…

云计算第二阶段:----监控与服务安全SECURITY

本模块内容&#xff0c;主要讲述 服务器的安全防护与配置软件相关知识。分为网络防护软件介绍、配置与使用用&#xff0c;网络安全相关知识浅度解析。 涉及软件有prometheus ,graphna,zabbix。 网络安全方面涉及基于debian linux系统的kali版本liunx的介绍与简单使用。 SECUR…

c++----内存管理

okk&#xff0c;大家好。我们大家学习了鄙人的前面前面几篇博客&#xff0c;并且还稍微使用了一些c的基础知识。并且我们前面都说过&#xff0c;我们前面学习的知识都说过。我们前面的几篇博客都是我们以后使用c基础。但是我们大家都知道现在代码都关注什么时间啊&#xff0c;内…

强光照射对半导体材料在紫外线下稳定性的影响

引言 半导体材料在光电器件中的应用日益广泛&#xff0c;其稳定性直接影响到器件的性能和寿命。特别是对于那些需要在户外或强光环境下工作的半导体器件&#xff0c;紫外线的照射会对材料的稳定性带来严峻挑战。因此&#xff0c;对半导体材料在紫外线照射下的稳定性进行深入研究…

模型实战(25)之 基于LoFTR深度学习匹配算法实现图像拼接

模型实战(25)之 基于LoFTR深度学习匹配算法实现图像拼接 图像拼接在全景图、大图或者多目场景下经常会被使用,常用的方法有传统图像处理算法和深度学习直接获取对应点的算法传统图像处理算法过程繁琐,阈值少且整体算法结果对调参比较敏感,其主要通过形状、特征点等描述子对…

【解决error】安装torch 1.1.0

第一步 当云服务器上没有指定版本的torch可以选择 先确定指定torch符合的python版本号 例如这里&#xff0c;我需要安装torch1.1.0&#xff0c;所以需要python>3.6 且 python<3.7 根据python版本&#xff0c;确定服务器安装torch的版本配置 第二步 新建conda虚拟环境…

搞DDR必懂的关键技术笔记:Initialization, Training , Calibration

初始化、训练和校准 引言 当一个带有DRAM子系统的设备上电时,DRAM达到可操作状态之前会发生一系列事件。以下是根据JEDEC规范中的状态机所显示的DRAM从上电到可操作状态所经历的各种状态。 这可不是我们平时就一句Training阶段就能概述。 本质上,初始化过程包括四个不同的阶…

【Redis】全局命令/内部编码/浅谈单线程模型

目录 前言 两个核心命令 GET和SET 全局命令 KEYS EXISTS DEL EXPIRE TTL TYPE 数据结构的内部编码 Redis的5中数据类型 Redis数据结构和内部编码 单线程架构 前言 Redis 提供了 5 种数据结构&#xff0c;理解每种数据结构的特点对于 Redis 开发运维⾮常重要&a…

easyrecovery和diskgenius哪个好 easyrecovery好用吗 diskgenius值得买吗

随着数据存储重要性的不断增加&#xff0c;数据丢失问题变得让人越来越担忧。当文件因为操作不慎、存储文件的介质损坏或其他原因导致数据丢失时&#xff0c;人们迫切需要一种强大的数据恢复工具来帮助他们找回丢失的文件。在这篇文章中&#xff0c;我们将比较两款知名的数据恢…

[Bugku] web-CTF靶场系列系列详解④!!!

平台为“山东安信安全技术有限公司”自研CTF/AWD一体化平台&#xff0c;部分赛题采用动态FLAG形式&#xff0c;避免直接抄袭答案。 平台有题库、赛事预告、工具库、Writeup库等模块。 --------------------------------- eval 开启环境&#xff1a; 进入页面发现是一道php题&…

axios请求响应拦截器

目录 axios-拦截器 拦截器的作用 请求拦截器-基本写法: axios请求拦截器-统一设置token 需求: 核心步骤: 关键代码: 响应拦截器-基本写法: axios响应拦截器-统一处理token失效 需求: 核心步骤: 关键代码: axios响应拦截器-数据剥离 需求: 核心步骤: 关键代码: ax…

试用AWS全新神器:Amazon Bedrock的「Open Artifacts」版Claude.ai Artifacts

Claude.ai的Artifacts真是太方便了。 GitHub上的AWS Samples仓库中有一个仿制Artifacts的应用程序。 Open Artifacts for Amazon Bedrock https://github.com/aws-samples/open_artifacts_for_bedrockhttps://github.com/aws-samples/open_artifacts_for_bedrock本文将介绍「…

【Java算法专场】前缀和(下)

目录 和为 K 的子数组 算法分析 算法步骤 算法代码 算法示例 和可被 K 整除的子数组 算法分析 同余定理 负数取余 算法步骤 算法代码 算法示例 连续数组 算法分析 算法步骤 算法代码 算法示例 矩阵区域和 算法分析 算法步骤 算法代码 算法示例 算法分析 …

1008 Elevator(Java)

题目 解释 输入数字N&#xff0c;数字N后面跟着N个数字代表着目的楼层&#xff0c;起始点是0层&#xff0c;每上升一层花费6秒&#xff0c;每下降一层花费4秒&#xff0c;每达到一个目的楼层&#xff0c;电梯会停5秒。问你一共花费多少秒&#xff1f; 解题思路 这道题不难&a…

【论文笔记】Matching Anything by Segmenting Anything

【引用格式】&#xff1a;Li S, Ke L, Danelljan M, et al. Matching Anything by Segmenting Anything[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2024: 18963-18973. 【网址】&#xff1a;https://openaccess.thecvf.com/co…

【Python】把list转换成json文件(list中为字典,元素按行写入)

0.前言 数据需要处理成与大模型输入相同类型的数据&#xff0c;从csv文件读出后&#xff0c;想要转换成json文件&#xff0c;看了好多资料都是把整个list写入了json&#xff0c;并不是我想要的格式&#xff0c;这里记录一下最后的按行写入的格式。 1.list转json import json …

Camtasia怎么自动加字幕 Camtasia怎么设置字幕

为了防止观众听不清楚视频中的解说声音&#xff0c;在进行视频编辑时&#xff0c;往往需要添加字幕。但是&#xff0c;你是否觉得一个一个添加字幕有些麻烦&#xff1f;使用Camtasia时&#xff0c;有没有什么能够快速、方便添加字幕的方法呢&#xff1f;添加字幕后&#xff0c;…

Docker 环境下使用 Traefik 3 的最佳实践:快速上手

Traefik 最近终于发布了大版本升级后的第一个修正版本&#xff0c;或许是时候正式迁移程序到新版本了。 写在前面 最近 Traefik 发布了 3.1 版本。作为从 Traefik 1.x 开始使用的用户&#xff0c;Traefik 每个大版本升级都会出现一些配置不兼容的情况&#xff0c;这次 3.x 的正…

DC-DC芯片:MT2492说明

文章目录 一. MT2492介绍1. 特点2. 应用3. 额定值4. 电气特性5. 引脚说明6. 典型应用电路 二. 功能说明内部调节器过电流保护和打嗝模式误差放大器启动和关闭内部软启动设置输出电压电感器的选择输入电容器的选择输入电容器的选择PCB布局建议 一. MT2492介绍 MT2492是一款完全…

LaneATT推理详解及部署实现(下)

目录 前言一、LaneATT推理(Python)1. LaneATT预测2. LaneATT预处理3. LaneATT后处理4. LaneATT推理 二、LaneATT推理(C)1. ONNX导出2. LaneATT预处理3. LaneATT后处理4. LaneATT推理 三、LaneATT部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.2 配置Makefile 3. ONNX导出…