当前位置: 首页 > news >正文

【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){//childprintf("I am child, pid : %d\n", getpid());sleep(10);}else{//parentprintf("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,还要让我们的编译遵守这样的规则

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

相关文章:

【Linux】进程概念二

文章目录进程概念二1. 进程状态2. 进程状态查看3. 僵尸进程3.1 僵尸进程的危害4. 孤儿进程5. 环境变量5.1 常见环境变量5.2 查看环境变量的方法5.3 测试PATH5.4 环境变量相关的命令5.5 环境变量的组织方式5.6 通过代码获取环境变量6. 程序地址空间7. 进程地址空间8. 扩展8.1 为…...

如何用C语言实现渣男通讯录

注意&#xff1a;纯属玩笑&#xff0c;博大家一乐&#xff0c;切勿当真&#x1f4d6;首先我们要知道一个渣男通讯录有哪些信息要包含哪些功能1.你的通讯录要装多少个女朋友你得规定吧&#xff1b;2.每个女朋友的姓名&#xff0c;年龄&#xff0c;电话&#xff0c;爱好这些要有吧…...

【从零开始的C语言】操作符详解

文章目录前言一、操作符分类二、算术操作符三、移位操作符3.1 左移3.2 右移四、位操作符&#xff08;重要&#xff09;五、赋值操作符六、单目操作符七、关系操作符八、逻辑操作符九、条件操作符十、逗号表达式前言 本篇文章开始&#xff0c;我将开设《从零开始的C语言》专栏&…...

黑马在线教育数仓实战1

1. 教育项目的架构说明 项目的架构: 基于cloudera manager大数据统一管理平台, 在此平台之上构建大数据相关的软件(zookeeper,HDFS,YARN,HIVE,OOZIE,SQOOP,HUE...), 除此以外, 还使用FINEBI实现数据报表展示 各个软件相关作用: zookeeper: 集群管理工具, 主要服务于…...

python中pandas模块数据处理小案例

内容目录1. 添加随机日期2. 聚合求和3.聚合求和排序4. 聚合求和排序取前十5. 聚合取极值6. 重新赋值7. 按条件赋值pandas作为数据处理的得力工具&#xff0c;简便了数据开发过程&#xff0c;之前串联了pandas的使用方法&#xff0c;现在用几个小案例巩固一下常用的pandas方法。…...

从 X 入门Pytorch——Tensor的自动微分、计算图,常见的with torch.no_grad()机制

这里写目录标题1 Pytorch计算图和自动微分2 将单个数据从计算图中剥离 .detach3 使用with torch.go_grad(): 包含的代码段不会计算微分1 Pytorch计算图和自动微分 从功能上理解&#xff1a; 计算图就是类似于数据结构中的无环有向图&#xff0c;Pytorch中的计算图就是为了记录…...

三十七、实战演练之接口自动化平台的文件上传

上传文件功能 上传文件功能主要针对需要测试上传文件的接口。原理是&#xff0c;把要测试上传的文件先上传到测试平台&#xff0c;然后把路径写入 用例中&#xff0c;后台真正测试时再将其进行上传。 一、上传文件模型 在testplans/models.py 模块中编写如下模型&#xff1a;…...

菜鸟刷题Day1

菜鸟刷题Day1 一.自守数&#xff1a;自守数_牛客题霸_牛客网 (nowcoder.com) 描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff1a;25^2 625&#xff0c;76^2 5776&#xff0c;9376^2 87909376。请求出n(包括n)以内的自守数的个数 解题思路&#x…...

cjson文件格式介绍

cjson是一种轻量级的JSON解析库&#xff0c;它支持将JSON格式的数据转换为C语言中的数据结构&#xff0c;同时也支持将C语言中的数据结构转换为JSON格式的数据。cjson的文件格式是指在使用cjson库时&#xff0c;将JSON格式的数据存储在文件中&#xff0c;然后通过cjson库读取文…...

【Nginx二】——Nginx常用命令 配置文件

Nginx常用命令 配置文件常用命令启动和重启 Nginx配置文件maineventshttp常用命令 安装完成nginx后&#xff0c;输入 nginx -&#xff1f;查询nginx命令行参数 nginx version: nginx/1.22.1 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix][-e filename] [-c filename] [-…...

3月最新!AIGC公司生态地图;开发者实用ChatGPT工具清单;上手必会的SD绘图教程;字幕组全自动化流程大公开 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『光年之外诚邀产品经理加入』古典产品经理的复兴&#xff01; 光年之外创始人王慧文在社交平台发帖&#xff0c;公布联合创始人团队基…...

python - 递归函数

递归函数 什么是递归 在函数内部&#xff0c;可以调用其他函数。如果一个函数在内部调用自身本身&#xff0c;这个函数就是递归函数 递归函数必须有一个明确的结束条件每进入更深一层的递归时&#xff0c;问题规模相对于上一次递归都应减少相邻两次重复之间有紧密的联系&…...

ring_log环形日志-6M缓冲区_proc接口

文章目录log_tools.clog.cspin_lockseq_putsseq_readseq_writesingle_openmakefiletest.sh测试&#xff1a;运行./test.sh读取日志插入日志echo cat测试参考&#xff1a;log_tools.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #includ…...

Linux内核进程管理几种CPU调度策略

CPU调度我们知道&#xff0c;程序需要获得CPU的资源才能被调度和执行&#xff0c;那么当一个进程由于某种原因放弃CPU然后进入阻塞状态&#xff0c;下一个获得CPU资源去被调度执行的进程会是谁呢&#xff1f;下图中&#xff0c;进程1因为阻塞放弃CPU资源&#xff0c;此时&#…...

SpringBoot整合Flink(施耐德PLC物联网信息采集)

SpringBoot整合Flink&#xff08;施耐德PLC物联网信息采集&#xff09;Linux环境安装kafka前情&#xff1a;施耐德PLC设备&#xff08;TM200C16R&#xff09;设置好信息采集程序&#xff0c;连接局域网&#xff0c;SpringBoot订阅MQTT主题&#xff0c;消息转至kafka&#xff0c…...

DFS(深度优先搜索)和BFS(宽度优先搜索)

目录 DFS&#xff08;深度优先搜索&#xff09; 全排列的DFS解法 利用DFS递归构建二进制串和递归树的结构剖析 DFS--剪枝 DFS例题--整数划分 BFS(宽度优先搜索) 全排列的BFS解法 DFS&#xff08;深度优先搜索&#xff09; 深度优先搜索&#xff08;Depth First Search&…...

Redis缓存穿透、击穿、雪崩问题及解决方法

系列文章目录 Spring Cache的使用–快速上手篇 分页查询–Java项目实战篇 全局异常处理–Java实战项目篇 完善登录功能–过滤器的使用 上述只是部分文章&#xff0c;对该系列文章感兴趣的可以查看我的主页哦 文章目录系列文章目录前言一、缓存穿透1.1 问题引入1.2 解决方法1.…...

HAL库 STM32 串口通信

一、实验条件将STM32的PA9复用为串口1的TX&#xff0c;PA10复用为串口1的RX。STM32芯片的输出TX和接收RX与CH340的接收RX和发送TX相连&#xff08;收发交叉且PCB上默认没有相连&#xff0c;所以需要用P3跳线帽进行手动连接&#xff09;&#xff0c;CH340的另一端通过USB口引出与…...

2023-第十四届蓝桥杯冲刺计划!

&#x1f4ac;前言 &#x1f4a1;本文以目录形式列举大纲,可根据题目点击跳转 &#x1f308;冲刺阶段目的&#xff1a;把握高频重点,结合基础算法和常考题型总结,用真题进行模拟练习 根据自己的能力熟练目前已掌握的算法&#xff0c;不会的还可以暴力 ⏳最后三个星期大家一起冲…...

内网渗透基础知识

一、内网概述 内网也指局域网&#xff0c;是指在某一区域内又多台计算机互联成的计算机组。一般是方圆几千米内&#xff0c;局域网可以实现文件管理&#xff0c;应用软件共享&#xff0c;打印机共享&#xff0c;工作组内的历程安排&#xff0c;电子邮件和传真通信服务等功能。…...

鸟哥的Linux私房菜 正则表示法与文件格式化处理

第十一章、正则表示法与文件格式化处理 https://linux.vbird.org/linux_basic/centos7/0330regularex.php 简体版 http://cn.linux.vbird.org/linux_basic/0330regularex.php 11.2.2 grep的一些高级选项 例题一、搜索特定字符串 例题二、利用中括号 [] 来搜寻集合字符 例题四…...

1630.等差子数组

1630. 等差子数组 难度中等 如果一个数列由至少两个元素组成&#xff0c;且每两个连续元素之间的差值都相同&#xff0c;那么这个序列就是 等差数列 。更正式地&#xff0c;数列 s 是等差数列&#xff0c;只需要满足&#xff1a;对于每个有效的 i &#xff0c; s[i1] - s[i] …...

CSS 属性计算过程

CSS 属性计算过程 你是否了解 CSS 的属性计算过程呢&#xff1f; 有的同学可能会讲&#xff0c;CSS属性我倒是知道&#xff0c;例如&#xff1a; p{color : red; }上面的 CSS 代码中&#xff0c;p 是元素选择器&#xff0c;color 就是其中的一个 CSS 属性。 但是要说 CSS 属…...

ThinkPHP02:路由

ThinkPHP02&#xff1a;路由一、路由定义二、变量规则三、路由地址四、路由参数五、路由分组六、MISS七、资源路由八、注解路由九、URL生成一、路由定义 路由默认开启&#xff0c;在 config/app.php 中可以关闭路由。 路由配置在 config/route.php 中&#xff0c;路由定义在 r…...

制作简单进销存管理系统(C#)

实验三&#xff1a;制作简单进销存管理系统 任务要求&#xff1a; 在进销存管理系统中&#xff0c;商品的库存信息有很多种类&#xff0c;比如商品型号、商品名称、商品库存量等。在面向对象编程中&#xff0c;这些商品的信息可以存储到属性中&#xff0c;然后当需要使用这些…...

css总结9(过渡和2D变换)

目录 过渡 2D变换 3D变换 过渡 属性结构图 过渡补充 ### 过渡多个元素样式属性 transition:style1 duration , style2 duration,...; ### 过渡所有属性 transition: all duration; 简单示例 ### 移入时改变长度且加入过渡效果 div { width:100px; height:100px; …...

SpringBoot 结合RabbitMQ与Redis实现商品的并发下单【SpringBoot系列12】

SpringCloud 大型系列课程正在制作中&#xff0c;欢迎大家关注与提意见。 程序员每天的CV 与 板砖&#xff0c;也要知其所以然&#xff0c;本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 1 项目准备 SpringBoot 整合 RabbitMQ 消息队…...

【python进阶】序列切片还能这么用?切片的强大比你了解的多太多

&#x1f4da;引言 &#x1f64b;‍♂️作者简介&#xff1a;生鱼同学&#xff0c;大数据科学与技术专业硕士在读&#x1f468;‍&#x1f393;&#xff0c;曾获得华为杯数学建模国家二等奖&#x1f3c6;&#xff0c;MathorCup 数学建模竞赛国家二等奖&#x1f3c5;&#xff0c…...

[数据结构]直接插入排序、希尔排序

文章目录排序的概念和运用排序的概念排序运用常见的排序算法常见的排序算法直接插入排序希尔排序性能对比排序的概念和运用 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操…...

CNN、LeNet、AlexNet、VGG、GoogLeNet、RCNN、Fast RCNN、Faster RCNN、YOLO、YOLOv2、SSD等的关系

卷积神经网络的现状1943年美国数学家提出人工智能1949年心理学家建立神经元模型1957年弗兰克提出 感知器人工神经网络模型1980年建立多层感知器模型1984日本学者提出卷积神经网络原始模型神经感知机1998年提出LeNet-5卷积神经网络&#xff0c;并发展了其在音符和字符上的优势20…...