【Linux】进程概念二

文章目录

  • 进程概念二
    • 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,还要让我们的编译遵守这样的规则

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何安装nvm(nvm 安装教程)

如何安装nvm(nvm 安装教程) 一、nvm是什么? nvm是一个node的版本管理工具,可以简单操作node版本的切换、安装、查看等等,与npm不同的是,npm是依赖包的管理工具。 二、安装nvm 1.nvm下载地址 https://github.com/coreybutler/nvm-windows/releases提示:1.nvm-setup.z…

功能测试转型测试开发年薪27W,又一名功能测试摆脱点点点,进了大厂

咱们直接开门见山&#xff0c;没错我的粉丝向我投来了喜报&#xff0c;从功能测试转型测试开发&#xff0c;进入大厂&#xff0c;摆脱最初级的点点点功能测试&#xff0c;拿到高薪&#xff0c;遗憾的是&#xff0c;这名粉丝因为个人原因没有经过指导就去面试了&#xff0c;否则…

CCM调试的理论依据

前言 很久之前在网上看到一些CCM的调试总结&#xff0c;但是没有理论依据&#xff0c;经过我本人的推理&#xff0c;以及和结果比对&#xff0c;这里总结一个我称之为色相环补色原理的调试理论。 CCM理论&#xff1a; CMOS sensor 使用颜色滤波阵列&#xff08;Color Filter…

YOLOV8改进:如何增加注意力模块?(以CBAM模块为例)

YOLOV8改进&#xff1a;如何增加注意力模块&#xff1f;&#xff08;以CBAM模块为例&#xff09;前言YOLOV8nn文件夹modules.pytask.pymodels文件夹总结前言 因为毕设用到了YOLO&#xff0c;鉴于最近V8刚出&#xff0c;因此考虑将注意力机制加入到v8中。 YOLOV8 代码地址&am…

蓝桥杯每日一真题——[蓝桥杯 2021 省 B] 杨辉三角形(二分+规律)

文章目录[蓝桥杯 2021 省 B] 杨辉三角形题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路&#xff1a;全部代码&#xff1a;[蓝桥杯 2021 省 B] 杨辉三角形 题目描述 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列&…

配置Maven环境变量

我们现在进行项目开发时&#xff0c;项目中一般都会有依赖包的存在&#xff0c;而这些依赖包一般都是利用Maven进行下载管理的。 一. 下载&安装 下载地址 maven下载地址如下&#xff0c;各位请选择对应系统的maven版本进行下载。 https://maven.apache.org/download.cgi…

做一个前端网页送给女朋友~轮播图+纪念日

文章目录1. 轮播图框架2. 轮播图大盒子实现1. 盒子及图片的可视化2. 将图片重叠起来并放入轮播图盒子中...相对定位与绝对定位3. 添加左右按钮4. 点击按钮跳转图片5. 鼠标离开图片轮播图按钮隐藏6. 添加小圆点按钮7. 点击小圆点跳转图片并且该小圆点变色8. 自动轮播9. 最后一步…

SoC设计流程

此为一个学习记录文&#xff0c;内容可能从书上《SoC设计方法与实现&#xff0c;郭炜等电子工业出版社》来&#xff0c;也可能从网络来。 目录 软、硬件协同设计&#xff1a; 基于标准单元的SoC设计流程&#xff1a; 软、硬件协同设计&#xff1a; SoC 通常被称作系统级芯片…

EasyExcel导入Excel文件,并对文件内容作

首页是pom文件导入EasyExcel的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency> mysql中添加三个字段做测试 自定义异常类 package com.exampl…

ABC278 F - Shiritori

不懂博弈和状压DP&#xff0c;今晚加训状压DP&#xff01;博弈太难了&#xff0c;东西太多了&#xff0c;等蓝桥杯打完再说QwQF - Shiritori (atcoder.jp)题意&#xff1a;思路&#xff1a;注意到数据范围是到16&#xff0c;因此可以考虑状压DP状态设计&#xff1a;&#xff08…

Java-Collections and Lambda

Java SE API know how 集合API 根据算法访选择合适集合 linkedlist不适合搜索 随机访问数据用hashmap 数据保持有序使用treemap 通过索引访问使用数组集合 同步和非同步 访问性能统计 与简单的非同步访问相比&#xff0c;使用任何数据保护技术都会有较小的损失 设置集合…

AI绘画关键词网站推荐 :轻松获取百万个提示词!完全免费

一、lexica.art 该网站拥有数百万Stable Diffusion案例的文字描述和图片&#xff0c;可以为大家提供足够的创作灵感。 使用上也很简单&#xff0c;只要在搜索框输入简单的关键词或上传图片&#xff0c;就能为你提供大量风格不同的照片。点击照片就能看到完整的AI关键词&#…

利用客户支持建立忠诚度和竞争优势

客户支持可以极大地改变您的业务;最细微、最微妙的差异都会使拥有一次性客户和拥有终身客户之间产生差异。在这篇博文中&#xff0c;我们将揭示客户对企业的忠诚度的三种核心类型&#xff0c;以及如何利用强大的客户支持工具和原则来提高理想的忠诚度并获得决定性的竞争优势。一…

11.12安全进阶:SSH实验配置指导

实验拓扑 实验需求 完成PC及交换机的配置,使得PC能够通过SSH的方式登录到交换机。 实验步骤及配置 交换机完成基础配置 [SW] interface Vlanif 1 [SW-Vlanif1] ip address 192.168.1.100 24简单起见,我们就直接使用VLAN1与PC对接,因此将交换机的IP地址配置在Vlanif1 交换机…

第16天-性能压测:压力测试,性能监控,优化QPS,Nginx动静分离

1.性能监控 1.1.JVM架构 运行时数据区&#xff1a; 方法区&#xff1a;最重要的内存区域&#xff0c;多线程共享&#xff0c;保存了类的信息&#xff08;名称、成员、接口、父类&#xff09;&#xff0c;反射机制是重要的组成部分&#xff0c;动态进行类操作的实现&#xff1b;…

[排序算法]堆排序

参考&#xff1a;《漫画算法-小灰的算法之旅》 目录 一、堆排序过程 二、堆排序的代码实现 三、时间复杂度和空间复杂度 四、从宏观上看&#xff0c;堆排序和快速排序相比&#xff0c;有什么区别和联系呢 回顾二叉堆&#xff1a; 1.最大堆的堆顶是整个堆中的最大元素。 2…

基于SpringBoot的外卖项目(详细开发过程)

基于SpringBootMyBatisPlus的外卖项目1、软件开发整体介绍软件开发流程角色分工2、外卖项目介绍项目介绍产品展示后台系统管理移动端技术选型功能结构角色3、开发环境的搭建开发环境说明建库建表Maven项目搭建项目的目录结构pom.xmlapplication.ymlReggieApplication启动类配置…

[JAVA]继承

目录 1.继承的概念 2.继承的语法 3.父类成员访问 3.1子类中访问父类成员变量 3.2子类中访问父类成员方法 4.super关键字 5.子类构造方法 6.继承方式 7.final关键字和类的关系 面向对象思想中提出了继承的概念&#xff0c;专门用来进行共性抽取&#xff0c;实现代码复…

2023年顶级编程语言趋势

对于开发人员和软件工程师来说&#xff0c;选择更优秀的编程语言使编写可以在任何地方运行的软件变得更加容易&#xff0c;工作效率更高。从 Java 的缓慢衰落到 MATLAB 的惊人流行&#xff0c;对当今最流行的编程语言的分析&#xff0c;可以帮助你了解最新趋势并响应最新趋势。…

总结:K8S运维常用命令

一、部署./kubectl apply -f biz-healing-pod.yaml 二、查看部署的资源1、podkubectl get pod -A&#xff1a;获取所有pod没有IP&#xff1f;用-o wide参数看详细信息&#xff1a;./kubectl get pod -n deepflow -o wide2、service查看hubble-manager命名空间下有哪些service/d…