【Linux】进程概念二

news2024/11/15 15:37:48

文章目录

  • 进程概念二
    • 1. 进程状态
    • 2. 进程状态查看
    • 3. 僵尸进程
      • 3.1 僵尸进程的危害
    • 4. 孤儿进程
    • 5. 环境变量
      • 5.1 常见环境变量
      • 5.2 查看环境变量的方法
      • 5.3 测试PATH
      • 5.4 环境变量相关的命令
      • 5.5 环境变量的组织方式
      • 5.6 通过代码获取环境变量
    • 6. 程序地址空间
    • 7. 进程地址空间
    • 8. 扩展
      • 8.1 为什么有地址空间?
      • 8.2 重新理解地址空间

进程概念二

1. 进程状态

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在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磁盘休眠状态:有时候也叫不可中断休眠状态,在这个状态的进程通常会等待IO的结束
  • T停止状态:可以通过发送SIGSTOP信号给进程来停止(T)状态。这个被暂停的进程可以通过发送SIGSTOP信号让进程继续运行
  • X死亡状态:这个状态只是一个返回状态,不会在任务列表当中看到这个状态

阻塞:进程因为等待某种条件就绪,而导致的一种不推进的状态

进程卡住了,阻塞一定是在等待某种资源

为什么会阻塞?

进程要通过等待的方式,等具体的资源被别人用完之后,再被自己使用。

阻塞:进程等待某种资源就绪的过程

进程只要是R状态,就一定是在CPU上运行吗?

并不直接代表进程在运行,而代表该进程在运行队列当中排队。

2. 进程状态查看

可以通过命令

ps ajx | 后面跟选项

3. 僵尸进程

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

创建一个僵尸进程的例子:

image-20230307232326369

编译器在另一个终端下,启动监控:

image-20230307232357767

3.1 僵尸进程的危害

  • 进程的退出状态必须被维持下去,因为它要告诉父进程,任务现在怎么样了,如果父进程一直不读取僵尸进程就会一直维持下去
  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,换句话说Z状态一直不退出,PCB一直都要维护的
  • 那么如果一个父进程创建了很多子进程,就是不回收会不会造成资源的浪费,是的因为数据结构对象本身就要占用内存

4. 孤儿进程

  • 父进程如果提前退出,那么子进程后退出,进入Z之后,该如何处理?

父进程先退出,子进程就称之为“孤儿进程”,孤儿进程被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){//child
         printf("I am child, pid : %d\n", getpid());
         sleep(10);
     }else{//parent
         printf("I am parent, pid: %d\n", getpid());
         sleep(3);
         exit(0);
     }
     return 0;
}

先让父进程退出,子进程休眠查看子进程的进程状态

5. 环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,环境变量通常有些特殊用途,还有在系统当中通常具有全局性

环境变量本质就是一个内存级的一张表,这张表用户在登录系统的时候,进行特定用户形成属于自己的环境变量表。

环境变量中的每一个,都有自己的用途:有的是路径查找,有的时进行身份认证的,有的进行动态库查找的,有的是用来确定当前路径等等,每一个环境变量都有自己的特定的应用场景

5.1 常见环境变量

  • PATH:指定命令搜索路径
  • HOME:指定用户的主工作目录(即用户登录到LInux系统当中,默认的目录)
  • SHELL:当前shell,它的值通常是/bin/bash

5.2 查看环境变量的方法

echo $NAME

NAME:你的环境变量名称

5.3 测试PATH

为什么有些指令可以直接执行,不需要带路径,但是我们的二进制文件需要带路径。

将我们的程序所在的路径加入到PATH当中

export PATH=$PATH:~/code/test_3_8

我们可以发现直接,输入就可以运行了

5.4 环境变量相关的命令

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

5.5 环境变量的组织方式

image-20230308185532565

每个程序都会收到一个环境表,环境表是一个字符指针数组,每个指针指向一个以‘\0’结尾的环境字符串

5.6 通过代码获取环境变量

  • 命令行第三个参数

image-20230308190108390

  • 通过第三方变量environ获取

image-20230308190410848

环境变量通常具有全局属性,可以被子进程继承下去

6. 程序地址空间

之前的学习当中,我们都见过这样的空间布局图

让我们来用一段代码感受一下:

输入的结果如下图所示:

我们发现输出的变量和地址是一样的,进程按照父进程为模板,父子并没有对变量进行任何的修改。

输出结果如下所示:

我们发现父子进程的地址是一样的,但是内容不一样。

变量内容不一样,所以父子进程输出的变量绝对不是同一个变量。地址却是一样的说明该地址不是物理地址。在Linux下,这种地址叫做虚拟地址。

我们用C/C++语言看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理

OS必须负责将虚拟地址转化成物理地址

子进程对全局数据修改,并不影响父进程!进程具有独立性

进程 = 内核数据结构 + 代码和数据

7. 进程地址空间

我么之前所说的程序地址空间是不准确的,准确的应该说成进程地址空间,我们可以用一下这幅图来理解:

同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到不同的物理地址

数据和代码真正只能在内存当中

8. 扩展

8.1 为什么有地址空间?

  1. 防止地址随意访问,保护物理内存与其他进程
  2. 将进程管理与内存管理进行解耦
  3. 可以让进程用统一的视角,看待自己的代码和数据

8.2 重新理解地址空间

我们的程序再被编译的时候,没有被加载到内存,请问我们的程序有没有地址呢?

虚拟地址这样的策略,不仅会影响OS,还要让我们的编译遵守这样的规则

源代码被编译的时候,就是按照虚拟地址的方式进行对代码和数据早就已经编号了对应的编制

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

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

相关文章

前端学习路线(2023版)超详细

一&#xff1a;前端开发基本功 俗话说的好“不积跬步&#xff0c;无以至千里”&#xff0c;学习也是一样的从简单的基础的知识点开始慢慢积累&#xff0c;首先就是掌握前端语言的基础知识3大部分&#xff08;HTML、CSS、页面制作工具&#xff09;其中包含了元素和属性、表单和图…

Adobe 中国

Adobe中国是Adobe公司在中国设立的分支机构&#xff0c;其总部位于上海。 Adobe中国的主要业务包括销售Adobe公司的软件产品、提供技术支持和服务、开展市场推广和宣传等工作。 作为全球领先的创意设计软件提供商&#xff0c;Adobe中国向中国用户提供了一系列功能强大的软件产…

webpack配置本地TypeScript编译环境和开启本地服务

目录 1.创建一个文件夹 2.初始化一个package.json文件对我们安装包进行记录 3.安装webpack 4.配置webpack.config.js文件 1.创建一个文件夹 2.初始化一个package.json文件对我们安装包进行记录 执行npm init&#xff0c;文件命名为ts_demo&#xff0c;然后一直回车。 3.安装…

【Spring6】| Spring IoC注解式开发

目录 一&#xff1a;Spring IoC注解式开发 1. 回顾注解 2. 声明Bean的四个注解 3. Spring注解的使用 4. 选择性实例化Bean 5. 负责注入的注解&#xff08;重点&#xff09; 5.1 Value 5.2 Autowired与Qualifier 5.3 Resource 6. 全注解式开发 一&#xff1a;Spring I…

开放式耳机的颠覆之作!南卡OE Pro新皇降临!佩戴和音质双重突破

千呼万唤的南卡OE Pro终于要在最近正式官宣上线&#xff0c;此消息一经放出&#xff0c;蓝牙耳机市场就已经沸腾。NANK南卡品牌作为国内的音频大牌&#xff0c;发展和潜力一直备受业内关注&#xff0c;这次要上线的南卡OE Pro更是南卡十余年来积累的声学技术结晶之一。 据透露…

ChatGPT惨遭围剿?多国封杀、近万人联名抵制……

最近&#xff0c;全世界燃起一股围剿ChatGPT的势头。由马斯克、图灵奖得主Bengio等千人联名的“暂停高级AI研发”的公开信&#xff0c;目前签名数量已上升至9000多人。除了业内大佬&#xff0c;欧盟各国和白宫也纷纷出手。 最早“动手”的是意大利&#xff0c;直接在全国上下封…

【Redis】Redis 是如何保证高可用的?(背诵版)

Redis 是如何保证高可用的&#xff1f;1. 说一下 Redis 是如何保证高可用的&#xff1f;2. 了解过主从复制么&#xff1f;2.1 Redis 主从复制主要的作用是什么?2.2 Redis 主从模式的拓扑结构&#xff1f;&#xff08;1&#xff09;一主一从结构&#xff08;2&#xff09;一主多…

客快物流大数据项目(一百一十一):Spring Boot项目部署

文章目录 Spring Boot项目部署 一、​​​​​​​​​​​​​​项目打包 二、运行 Spring Boot项目部署

Hadoop之Mapreduce序列化

目录 什么是序列化&#xff1a; 什么是反序列化&#xff1a; 为什么要序列化&#xff1a; Java的序列化&#xff1a; Hadoop序列化: 自定义序列化接口&#xff1a; 实现序列化的步骤&#xff1a; 先看源码进行简单分析&#xff1a; 序列化案例实操&#xff1a; 案例需…

【JavaEE】常见的锁策略都有哪些?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶在Java多线程中&#xff0c;常见的锁策略都有哪些&#xff1f;这些锁策略应该怎么理解&#xff1f; &#xff08;乐观锁vs悲观锁&#xff0c;轻量级锁vs重量级锁&#xff0c;自旋锁vs挂起等待…

Day919.生产就绪 -SpringBoot与K8s云原生微服务实践

生产就绪 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于生产就绪的内容。 互联网软件交互阶段 如上&#xff0c;3个阶段中的“”生产就绪”是什么&#xff1f; 什么是生产就绪 生产就绪是指在生产过程中所需的一切准备工作已经完成&#xff0c;可以开始生产的状…

MySQL视图 视图的作用、视图常用语法

视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图只保存了查询的SQL逻辑&#xff0c;不保存查询结果。 常…

Qt音视频开发27-ffmpeg视频旋转显示

一、前言 用手机或者平板拍摄的视频文件,很可能是旋转的,比如分辨率是1280x720,确是垂直的,相当于分辨率变成了720x1280,如果不做旋转处理的话,那脑袋必须歪着看才行,这样看起来太难受,所以一定要想办法解析到视频的旋转角度,然后根据这个角度重新绘制。在窗体那边也…

SpringBoot使用Spring Validation案例

简单使用 Java API规范(JSR303)定义了Bean校验的标准validation-api&#xff0c;但没有提供实现。hibernate validation是对这个规范的实现&#xff0c;并增加了校验注解如Email、Length等。 Spring Validation是对hibernate validation的二次封装&#xff0c;用于支持spring m…

Machine Learning-Ex4(吴恩达课后习题)Neural Networks Learning

目录 1. Neural Networks 1.1 Visualizing the data 1.2 Model representation 1.3 Feedforward and cost function 1.4 Regularized cost function 2. Backpropagation 2.1 Sigmoid gradient 2.2 Random initialization 2.3 Backpropagation 2.4 Gradient Checking…

工厂模式白话 - 3种都有哦

前言 工厂模式&#xff08;Factory Pattern&#xff09;里所谓的“工厂”和现实生活中的工厂一样 主要作用都是生产产品 像食品厂、服装厂、汽车厂生产吃的、穿的、开的 设计模式里的工厂则是生产对象 划分 工厂模式可分为简单工厂、工厂方法、抽象工厂3种 有啥不同呢&a…

RecvByteBufAllocator内存分配计算

虽然了解了整个内存池管理的细节&#xff0c;包括它的内存分配的具体逻辑&#xff0c;但是每次从NioSocketChannel中读取数据时&#xff0c;应该分配多少内存去读呢&#xff1f; 例如&#xff0c;客户端发送的数据为1KB , 应该分配多少内存去读呢&#xff1f; 例如&#xff1a;…

梳理ERP与CRM、MRP、PLM、APS、MES、WMS、SRM的关系

数字化转型中少不了ERP系统的存在&#xff0c;CRM、MRP、PLM、APS、MES、WMS、SRM这些系统都需要一起上吗&#xff1f; 如下图所示&#xff0c;是某企业IT系统集成架构流图。 先了解一下ERP是做什么的&#xff0c;ERP就是企业资源管理系统&#xff0c;从企业的价值链分析&…

在CSDN创作了6个月,我收获了什么?文末送书~

作者主页&#xff1a;阿玥的小东东主页&#xff01; 正在学习&#xff1a;python和C/C 期待大家的关注哦 目录 一次很好的机会&#xff0c;让我开始了CSDN之旅 首先来看看我的几位领路人 创作动力 1W粉丝 在CSDN我收获了什么&#xff1f; 很高的展现量 认证创作者身份 社…

构建自动过程:FinalBuilder 8.0 Crack

使用 FinalBuilder 自动化您的构建过程很简单。使用 FinalBuilder&#xff0c;您无需编辑 xml 或编写脚本。可视化定义和调试您的构建脚本&#xff0c;然后使用 Windows 调度程序安排它们&#xff0c;或将它们与 Continua CI、Jenkins 或任何其他 CI 服务器集成。 成千上万的软…