进程概念(Linux)

news2025/4/5 20:40:05

目录

一. 冯诺依曼体系结构

二. 操作系统(OS(操作系统的英文缩写Operator System))

2.1概念

2-2 设计OS的目的

2.3 核心功能

2.4 如何管理(先描述再组织)

2.5 系统调用和库函数概念

三.进程

3.1 基本概念与基本操作

3.2 描述进程-PCB

3.3 如何查看进程

3.4 PID,PPID 和 STAT(进程状态status)

3.5 Z(zombie)-僵尸进程

僵尸进程危害

3.6 孤儿进程

四.进程优先级

4.1 PRI and Nl

4.1.2 更改NI值

五.调度队列

5.1 活动队列

5.2 过期队列

5.3 active指针和expired指针

六.环境变量

6.1环境变量相关的命令

6.2 常见环境变量

6.3 查看环境变量方法

6.4 通过代码如何获取环境变量

七. 进程地址空间

7.1虚拟地址

7.2mm_struct

7.3 为什么要有虚拟地址空间


一. 冯诺依曼体系结构

笔记本,服务器,PC等大部分计算机都遵守冯诺依曼体系。

网图:

解释图片:

输入单元:包括键盘,鼠标,扫描仪,写板等
中央处理器(CPU):含有运算器和控制器等
输出单元:显示器,打印机等

这里的存储设备指的是内存,我们计算机存放游戏的磁盘叫外存!!
不考虑缓存情况,这里的CPU能且只能对内存进行读写!,不能访问外设(输入或输出设备)


二. 操作系统(OS(操作系统的英文缩写Operator System))

2.1概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。

操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)

2-2 设计OS的目的

对下,与硬件交互,管理所有的软硬件资源
对上,为用户程序(应用程序)提供一个良好的执行环境

2.3 核心功能

在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件

2.4 如何管理(先描述再组织)

1.描述,用struct结构体
2.组织,用链表或其他高效的数据结构

2.5 系统调用和库函数概念

系统调用在使用上,功能比较基础,比如(open,read,_exit()...)就是系统调用。

用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成

比如(fopen,fread,fget,exit()...)


三.进程

3.1 基本概念与基本操作

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

3.2 描述进程-PCB

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

3.3 如何查看进程

比如我们有一个程序,让他一直运行

我们可以输入: gcc -o mytest test.c 

生成:

在其运行期间:

就会有:

这些是什么?下面3.4会讲到


3.4 PID,PPID 和 STAT(进程状态status)

进程id (PID)
父进程id(PPID)

进程状态(STAT)

R运行状态(running):并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
(interruptible sleep))。
D磁盘休眠状态(Disksleep)有时候也叫不可中断睡眠状态(uninterruptiblesleep),在这个
状态的进程通常会等待IO的结束。
T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止(T)进程。这个被暂停的
进程可以通过发送SIGCONT信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

3.5 Z(zombie)-僵尸进程

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()函数)没有读取到子进程退出的返回代码 时就会产生僵死(尸)进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出父进程还在运行,但 父进程没有读取子进程状态子进程进入Z状态。

僵尸进程危害

维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护!!!
那一个父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费!!因为数据结构对象本身就要占用内存。

3.6 孤儿进程

父进程先退出(跟僵尸区别一下),子进程还在,就称之为“孤儿进程”。

孤儿进程被1号init进程领养,被init进程回收。


四.进程优先级

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

把重要的进程运行到指定的CPU上,或者把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

UID:代表执行者的身份(就像原神的UID一样)

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

4.1 PRI and Nl

PRI值越小越快被执行,那么加入nice值后,将会使得新的PRI变为:PRI = PRI(默认值) + nice

nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高(越快被执行。所以,调整进程优先级,在Linux下,就是调整进程nice值。

nice其取值范围是-20至19,一共40个级别。

4.1.2 更改NI值

用top命令更改已存在进程的nice:
先输入top ->进入top后按“r”->输入进程PID->输入nice值


五.调度队列

一个CPU拥有一个 runqueue

如果有多个CPU就要考虑进程个数的负载均衡问题

调度队列中存在 活动队列 和 过期队列。

5.1 活动队列

时间片还没有结束的所有进程都按照优先级放在活动队列

注:时间片:当代计算机都是分时操作系统,没有进程都有它合适的时间片(其实就是一个计数器)。时间片到达,进程就被操作系统从CPU中剥离下来。

nr_active: 总共有多少个运行状态的进程

queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!

当一个进程运行完时,就会进入 过期队列 等待第二次运行

5.2 过期队列

过期队列和活动队列结构一模一样

过期队列上放置的进程,都是时间片耗尽的进程
当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算

5.3 active指针和expired指针

active指针永远指向活动队列
expired指针永远指向过期队列

因此,在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批
新的活动进程!就可以继续运行被 过期队列重置的进程。


六.环境变量

环境变量(environmlentvariables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。

如:我们在编写C/C++代码的时候,X在链接的时候,从来不知道我们的所链接的动态静态库在哪
里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

6.1环境变量相关的命令


1. echo:显示某个环境变量值
2. export:设置一个新的环境变量
3. env:显示所有环境变量
4. unset:清除环境变量
5. set:显示本地定义的shell变量和环境变量

6.2 常见环境变量

1. PATH:指定命令的搜索路径
2. HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
3. SHELL: 当前Shell,它的值通常是/bin/bash。

6.3 查看环境变量方法

echo $NAME(NAME:你的环境变量名称)

例子: PATH

6.4 通过代码如何获取环境变量

1. 通过第三方变量environ获取

比如:

注意: libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用 extern 声明。

2. getenv()

  

3 .putenv()

4.putenv()和 getenv()的区别

七. 进程地址空间

7.1虚拟地址

我们输入一段代码(不想敲了)

1.首先我们使用fork建立 一个父进程和 一个子进程。

2.然后printf出他们的地址,我们就会发现父子进程,输出地址是一致的!!!

因为地址值是一样的,说明,该地址绝对不是物理地址!
在Linux下,这种地址叫做虚拟地址
我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS(操作系统)统一管理。

OS必须负责将 虚拟地址 通过页表映射关系转化成 物理地址

网图:

7.2mm_struct

linux 下进程的地址空间的 所有的信息的结构体是mm_struct(内存描述符). 每个进程只有一个mm_struct结构,在每个进程的 task_struct 结构中,有一个指向该进程的结构。

通过它,我们就可以访问我们需要的 代码段 或者 数据段,

如图所示:

7.3 为什么要有虚拟地址空间

如果直接使用物理内存的话,一个进程就是作为一个整体(内存块)操作的,如果出现物理
内存不够用的时候,我们一般的办法是将不常用的进程拷贝到磁盘的交换分区中,好腾出内
存,但是如果是物理地址的话,就需要将整个进程一起拷走,这样,在内存和磁盘之间拷贝
时间太长,效率较低。

如果有虚拟地址

因为有地址空间的存在,所以我们在C、C++语言上new,malloc空间的时候,其实是在地址
空间上申请的,物理内存可以甚至一个字节都不给你。而当你真正进行对物理地址空间访问
的时候,才执行内存的相关管理算法,帮你申请内存,构建页表映射关系(延迟分配),这
是由操作系统自动完成。

因此虚拟地址可以帮助我们提高效率,和减少空间的浪费,更高效运行进程。

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

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

相关文章

免费在线MBTI性格测试工具 - 探索你的性格特质

免费在线MBTI性格测试工具 - 探索你的性格特质 简介 我很高兴为大家分享这个专业的MBTI性格测试工具。这是一个完全免费的在线测试系统,基于迈尔斯-布里格斯类型指标(MBTI)理论开发,旨在帮助您更好地了解自己的性格特征,发现职业发展方向。…

AI 数理逻辑基础之统计学基本原理(上)

目录 文章目录 目录统计学统计学基本概念描述性统计数据可视化图表工具 汇总统计统计数据的分布情况:中位数、众数、平均值统计数据的离散程度:极差、方差、标准差、离散系数 相关分析Pearson 线性关系相关系数Spearman 单调关系相关系数 回归分析回归模…

积分赛——读取实时时间

设计要求 调用DS1302芯片驱动程序,读取DS1302中的实时时分秒数据,并显示在数码管上。 23时59分59秒 通过串口发送时间作为定时时间,定时时间到则蜂鸣器响2s后静音。 串口发送格式:“12:35:66”。 备注&…

进程和线程的概念及Linux操作

文章目录 一、进程与线程1、进程2、线程3、查看进程与线程 二、Linux的“虚拟内存管理”,它与stm32中的 真实物理内存(内存映射)有什么区别?三、Linux系统调用函数 fork()、wait()、exec() 等1、fork()函数…

APang网联科技项目报告【服务器篇】

APang网联科技:连接未来,智能领航 公司简介 APang网联科技成立于 [2005年],总部位于 [广东深圳],是一家集网络技术研发、系统集成、项目实施与运维服务为一体的高新技术企业。我们致力于为客户提供全方位、定制化的网络部署解决…

[MySQL初阶]MySQL表的操作

MySQL表的操作 1. 创建表2. 查看表结构3. 修改表(修改表的属性而非表的数据)4. 删除表 1. 创建表 语法: CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储…

AI助力高效PPT制作:从内容生成到设计优化

随着人工智能技术的不断发展,AI在各个领域的应用日益普及,尤其是在文档和演示文稿的创建过程中。PowerPoint(PPT)作为最常用的演示工具之一,借助AI的技术手段,可以极大地提高制作效率并提升最终呈现效果。在…

《双影奇境》手机版上线?ToDesk用跨平台技术实现「全设备云电脑3A游戏」

《双影奇境》是由Hazelight Studios研发发行的一款双人合作冒险类游戏,玩家们在游戏中将扮演米欧和佐伊两位风格迥异的女作家,剧情讲述的是她们被骗进入一台意在窃取创意的机器后便陷入了自己创作的故事之中,并且必须相互依靠,努力…

spring IOC 反射 bean生命周期

目录 反射 反射三种方式 获取反射中的Class对象 通过反射创建类对象 通过反射获取类属性、方法、构造器 IOC 概念 原理 实现方式 基于 XML 配置 基于注解配置 IOC优点 IOC的初始化过程 1. 资源定位 3. Bean 定义注册 4. BeanFactory 后置处理 5. Bean 后置处理…

Pytorch中预置数据集的加载方式

Pytorch中数据集加载方式 数据类型​PyTorch 模块​是否预置数据集图像/视频torchvision.datasets✅ 是音频torchaudio.datasets✅ 是文本torchtext.datasets✅ 是(需安装)自定义数据torch.utils.data❌ 否(需手动实现)多模态/第三…

ARM-----数据处理、异常处理、模式切换

实列一: 1. 异常向量表 area reset, code, readonly code32 entry area reset, code, readonly:定义一个名为reset的代码区域,只读。 code32:指示编译器生成32位ARM指令。 entry:标记程序的入口点。 2. 程序入口…

d202541

目录 一、分隔链表 二、旋转链表 三、删除链表中重复的数字 一、分隔链表 用两个list存一下小于和大于等于 x的节点 最后串起来就行 public ListNode partition(ListNode head, int x) {ListNode ret new ListNode(1);ListNode cur ret;List<ListNode> small new A…

YOLOv12 从预训练迈向自主训练,第一步数据准备

视频讲解&#xff1a; YOLOv12 从预训练迈向自主训练&#xff0c;第一步数据准备 前面复现过yolov12&#xff0c;使用pre-trained的模型进行过测试&#xff0c;今天来讲下如何训练自己的模型&#xff0c;第一步先准备数据和训练格式 https://gitcode.com/open-source-toolkit/…

【UVM学习笔记】更加灵活的UVM—通信

系列文章目录 【UVM学习笔记】UVM基础—一文告诉你UVM的组成部分 【UVM学习笔记】UVM中的“类” 文章目录 系列文章目录前言一、TLM是什么&#xff1f;二、put操作2.1、建立PORT和EXPORT的连接2.2 IMP组件 三、get操作四、transport端口五、nonblocking端口六、analysis端口七…

NSSCTF [HGAME 2023 week1]simple_shellcode

3488.[HGAME 2023 week1]simple_shellcode 手写read函数shellcode和orw [HGAME 2023 week1]simple_shellcode (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file vuln vuln: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpret…

数据集(Dataset)和数据加载器(DataLoader)-pytroch学习3

pytorch网站学习 处理数据样本的代码往往会变得很乱、难以维护&#xff1b;理想情况下&#xff0c;我们希望把数据部分的代码和模型训练部分分开写&#xff0c;这样更容易阅读、也更好维护。 简单说&#xff1a;数据和模型最好“分工明确”&#xff0c;不要写在一起。 PyTor…

数据结构|排序算法(一)快速排序

一、排序概念 排序是数据结构中的一个重要概念&#xff0c;它是指将一组数据元素按照特定的顺序进行排列的过程&#xff0c;默认是从小到大排序。 常见的八大排序算法&#xff1a; 插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序、基数排序 二、快速…

文件或目录损坏且无法读取:数据恢复的实战指南

在数字化时代&#xff0c;数据的重要性不言而喻。然而&#xff0c;在日常使用电脑、移动硬盘、U盘等存储设备时&#xff0c;我们难免会遇到“文件或目录损坏且无法读取”的提示。这一提示如同晴天霹雳&#xff0c;让无数用户心急如焚&#xff0c;尤其是当这些文件中存储着重要的…

leetcode数组-螺旋矩阵Ⅱ

题目 题目链接&#xff1a;https://leetcode.cn/problems/spiral-matrix-ii/ 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7…

小刚说C语言刷题——第14讲 逻辑运算符

当我们需要将一个表达式取反&#xff0c;或者要判断两个表达式组成的大的表达式的结果时&#xff0c;要用到逻辑运算符。 1.逻辑运算符的分类 (1)逻辑非(!) &#xff01;a&#xff0c;当a为真时&#xff0c;&#xff01;a为假。当a为假时&#xff0c;&#xff01;a为真。 例…