进程【Linux系统编程】
一、先谈硬件——冯诺依曼体系结构
存储器:内存(硬盘是外存)
输入设备:鼠标、键盘、摄像头、话筒、磁盘、网卡……
输出设备:显示器、播放器硬件、磁盘、网卡……
输入输出设备是外部设备,简称外设。
中央处理器(CPU):
运算器:对我们的数据进行计算任务(算数运算、逻辑运算)
控制器:对我们的计算硬件流程进行一定的控制。
以上每一个部分都是独立的个体,也就是说,各个硬件单元必须用“线”链接起来。
“线”分两类:1、系统总线(CPU和内存之间) 2、IO总线(内存和外设之间)
不考虑缓存的情况,CPU只能对内存进行读写,不能访问外设。
所有设备都只能直接和内存打交道。
二、再谈软件——操作系统(Operator System)

操作系统是一款进行管理的软件。
why?
1、操作系统帮助用户管理好下面的软硬件资源(手段)。
2、为了给用户提供一个良好的(稳定、高效、安全)运行环境(目的)。
how?
先描述再组织。
操作系统里面会有各种数据,但操作系统不相信任何用户!
操作系统为了保证自己的数据安全,也为了保证给用户能够提供服务,操作系统以接口的方式给用户提供调用的入口,来获取系统内部的数据。
接口是操作系统提供的用C实现的,自己内部的函数调用——系统调用。
所有访问操作系统的行为,都只能通过系统调用完成。
操作系统的核心功能:内存管理、进程管理、文件管理、驱动管理。
三、再谈进程
一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程。
操作系统如何将进程管理起来?先描述,再组织。
任何一个进程,加载到内存时,形成真正的进程时,操作系统要先创建进程属性的结构体对象------PCB(process control block:进程控制块)
进程 = 内核PCB数据结构对象 + 你自己的代码和数据
描述进程-PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
task_struct内容分类
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
怎么组织
在Linux中是如何组织进程的,Linux内核中,最基本的组织进程task_struct的方式,是采用双向链表组织的。
查看进程
在Linux中,ps axj 指令可查到当前正在运行的进程。
ls /proc 查看当前系统中所有进程
终止一个进程:kill -9 PID
![]()
怎么获取PID,系统调用接口:getpid
PPID:getppid
当我们每次登录Xshell时,系统会为我们创建一个bash进程即创建一个命令行解释进程,我们在对话框中输入的指令都是bash进程的子进程 。
fork:创建一个子进程
.\指令层面创建进程
fork()代码层面创建进程。
当我们调用fork()函数时,它会创建一个子进程,并给子进程返回0,给父进程返回子进程的pid,然后分两个执行流,id>0的进程是老的进程。
1、为什么fork()要给子进程返回0,给父进程返回子进程的pid?
返回不同的返回值,是为了区分让不同的执行流,执行不同的代码块!
一般来说,fork()之后的代码父子共享。
子进程只有一个父进程,它只需要通过getppid就可以确定父进程,但是父进程可能有多个子进程,所以它需要拿到子进程的pid来确定子进程。
2、一个函数是如何做到两个返回值?如何理解?
任何平台,进程在运行时,是具有独立性的。
数据层面的写时拷贝:在父子进程刚创建时,数据和代码确实是共享的,但是,当子进程要修改数据时,操作系统会另外在拷贝一份它要改的数据来给子进程更改。
4、fork()函数在干什么?干了什么?
5、如果父子进程创建好后,谁先运行?
谁先运行,由调度器决定,不确定。
进程状态
1、一般操作系统学科中的:运行、阻塞、挂起
1、运行状态 R(在CPU上的和在运行队列中的都叫运行态)
一个进程把自己放到cpu上运行,并不是要运行完才把自己放下来。
每个进程都有一个 时间片的概念,在一个时间段内,所有进程代码都会被执行,并发执行。
所以,我们的代码中一定会存在大量的把进程从CPU上拿下来或者放上去的动作------进程切换。
2、阻塞状态
每一个设备都有一个等待队列(系统里有很多等待队列,进程也有等待队列),进程想等那个设备,如果状态没有就绪,是不可读的,此时,此时,这个进程就自动把自己的PCB链入该设备的等待队列里,如果已经可读了,这个进程就把自己放运行队列里。
3、阻塞挂起状态
如果操作系统中的内存资源严重不足了,就会在保证正常运行的情况下,省出来内存资源。
会阻塞状态的进程的PCB保留,将代码和数据放到外设中(换出),此时的状态就叫挂起,当下次资源就绪,把这个进程要放入运行队列时,再把代码和数据从新换入进来。
电脑中除了C\D\E盘这些分区,还有一个swap(交换分区)。
2、具体Linux状态是如何维护的?
R(running)运行状态 R+:带+号表示前台运行。
S(sleeping)阻塞状态 (浅度睡眠,可以被唤醒,随时响应外部变化)
D(disk sleep)阻塞状态 (深度睡眠 该状态下进程不可被kill,不响应操作系统的任何请求)
T(stopped)暂停状态
t(tracing stopped)暂停状态 打断点时,到断点处会变为t状态
kill -19 PID (发19号信号,让目标进程处于stop状态)
X(dead):终止态,资源被回收后,才会变成X状态
Z(zombie僵尸):进程一般退出时,如果父进程没有主动回收子进程信息,子进程会一直让自己处于Z状态,进程的相关资源尤其是task_struck结构体不能被释放。
如果父进程一直不回收这个进程的资源,那么就会一直占用资源,导致内存泄露。
孤儿进程:如果父进程先挂了,子进程的PPID就变成了1(1号进程就是操作系统)
进程优先级
PRI:优先级,一个整型数组,数字越小,优先级越高。
NI:nice值,优先级修正数据
PRI(new) = PRI(old)(这个值是80)+nice
程序(进程)地址空间

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 0;}else if(id == 0){ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取g_val=100;printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);}else{ //parentsleep(3);printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);}sleep(1);return 0;
}
//与环境相关,观察现象即可
child[3046]: 100 : 0x80497e8
parent[3045]: 0 : 0x80497e8
父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:
变量内容不一样,所以父子进程输出的变量绝对不是同一个变量
但地址值是一样的,说明,该地址绝对不是物理地址!
在Linux地址下,这种地址叫做 虚拟地址
我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理。


当创建子进程时,子进程为什么能继承父进程的环境变量呢?
当子进程启动时,父进程已经将环境变量信息加载了,当你创建子进程时,父进程里的数据必定有页表进程虚拟地址到物理地址的映射,当子进程创建页表时,子进程也自然会将父进程的环境变量信息继承下来。
相关文章:
进程【Linux系统编程】
一、先谈硬件——冯诺依曼体系结构 存储器:内存(硬盘是外存) 输入设备:鼠标、键盘、摄像头、话筒、磁盘、网卡…… 输出设备:显示器、播放器硬件、磁盘、网卡…… 输入输出设备是外部设备,简称外设。 中央…...
【Edabit 算法 ★☆☆☆☆☆】【分钟转秒数】Convert Minutes into Seconds
【Edabit 算法 ★☆☆☆☆☆】【分钟转秒数】Convert Minutes into Seconds math numbers Instructions Write a function that takes an integer minutes and converts it to seconds. Examples convert(5) // 300 convert(3) // 180 convert(2) // 120Notes Don’t forge…...
Django实现音乐网站 ⒇
使用Python Django框架做一个音乐网站, 本篇音乐播放器-添加播放音乐功能实现。 目录 创建播放器数据表 设置表结构 执行创建表 命令 执行 数据表结构 添加单个歌曲 创建路由 加入播放器视图 模板处理 基类方法 子页面调用 优化弹窗 加入layui文件 基…...
C++类对象所占内存空间大小分析
前言 类占内存空间是只类实例化后占用内存空间的大小,类本身是不会占内存空间的。用 sizeof 计算类的大小时,实际上是计算该类实例化后对象的大小。空类占用1字节原因:C要求每个实例在内存中都有一个唯一地址,为了达到这个目的&am…...
绿肥红瘦专栏数据的爬取
前言 要想爬专栏,先得爬用户。要想爬用户,三个header参数挡住了去路:x-zst-81,x-zse-93,x-zse-96,经过搜索x-zse-96,定位到设置该字段的位置: 这个t2是固定的值,t0来自于…...
centos或aws linux部署java应用,环境搭建shell
目录 设置root密码开启密码登录安装docker安装nginx设置nginx自启动nginx配置https配置http集群tcp集群 安装docker设置docker自启动修改docker基础配置创建docker网关docker安装mysql单机版本主从版本 docker安装redis设置密码:不要密码: docker安装rab…...
2023年中国车用冲压模具行业特征、竞争现状及行业市场规模分析[图]
汽车冲压件模具具有尺寸大、型面复杂、精度要求高等特点,属于技术密集型产品。汽车冲压模具能快速精密地把材料直接加工成零件或半成品并通过焊接、铆接、拼装等工艺装配成零部件,冲压模具的设计开发和加工能力对汽车冲压零部件产品总制造成本、质量及性…...
基于Pytorch的CNN手写数字识别
作为深度学习小白,我想把自己学习的过程记录下来,作为实践部分,我会写一个通用框架,并会不断完善这个框架,作为自己的入门学习。因此略过环境搭建和基础知识的步骤,直接从代码实战开始。 一.下载数据集并加…...
Java设计模式之观察者模式(Observer Pattern)
观察者模式(Observer Pattern)是一种常用的软件设计模式,它用于在对象之间建立一种一对多的依赖关系,当一个对象的状态发生变化时,它的所有依赖对象都会得到通知并自动更新。观察者模式属于行为型模式。 在观察者模式…...
最优化:建模、算法与理论(最优性理论2
5.7 约束优化最优性理论应用实例 5.7.1 仿射空间的投影问题 考虑优化问题 min x ∈ R n 1 2 ∣ ∣ x − y ∣ ∣ 2 2 , s . t . A x b \min_{x{\in}R^n}\frac{1}{2}||x-y||_2^2,\\ s.t.{\quad}Axb x∈Rnmin21∣∣x−y∣∣22,s.t.Axb 其中 A ∈ R m n , b ∈ R m …...
redis一主一从搭建
1.复制一份redis.conf并将6380都改成6379 [redist3-dtpoc-dtpoc-web06 conf]$ cp redis.conf redis_6380.conf [redist3-dtpoc-dtpoc-web06 conf]$ vi redis_6380.conf port 6380 daemonize yes pidfile "/home/redis/redis/logs/redis_6380.pid" logfile "/hom…...
【MySql】8- 实践篇(六)
文章目录 1. MySql保证主备一致1.1 MySQL 主备的基本原理1.2 binlog 的三种格式对比1.3 循环复制问题 2. MySql保证高可用2.1 主备延迟2.2 主备延迟的来源2.3 可靠性优先策略2.4 可用性优先策略 3. 备库为何会延迟很久-备库并行复制能力3.1 MySQL 5.6 版本的并行复制策略3.2 Ma…...
Spring篇---第七篇
系列文章目录 文章目录 系列文章目录一、说说事务的传播级别二、Spring 事务实现方式三、Spring框架的事务管理有哪些优点一、说说事务的传播级别 Spring事务定义了7种传播机制: PROPAGATION_REQUIRED:默认的Spring事物传播级别,若当前存在事务,则加入该事务,若 不存在事务…...
2023年中国轮胎模具需求量、竞争格局及行业市场规模分析[图]
轮胎模具是轮胎生产线中的硫化成形装备,是高技术含量、高精度及高附加值的个性化模具产品,尤其是轮胎的花纹、图案、字体以及其他外观特征的成形都依赖于轮胎模具,因此其制造技术难度较高。其主要功能是通过所成型材料(主要是橡塑…...
集成学习方法(随机森林和AdaBoost)
释义 集成学习很好的避免了单一学习模型带来的过拟合问题 根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类: Bagging(个体学习器间不存在强依赖关系、可同时生成的并行化方法) 流行版本:随机森林(random forest)Boosting(个体…...
PeopleCode中Date函数的用法
语法 Date(date_num) 描述 The Date function takes a number in the form YYYYMMDD and returns a corresponding Date value. If the date is invalid, Date displays an error message. Date函数输入是一个形如“YYYYMMDD”的数字,返回一个相应的Date类型的值…...
解决 el-tree setChecked 方法偶尔失效的方法
目前在大多数公司中,菜单的权限控制都是不可或缺的功能 在和后端配合做权限控制的时候不可避免的会用到 el-tree 然而这个组件本身带的坑不少 我们需要回显对应角色拥有的菜单,在不严格的模式下,父节点的选中会连带子节点的选中 如果 &a…...
重磅发布!RflySim Cloud 智能算法云仿真平台亮相,助力大规模集群算法高效训练
RflySim Cloud智能算法云仿真平台(以下简称RflySim Cloud平台)是由卓翼智能及飞思实验室为无人平台集群算法验证、大规模博弈对抗仿真、人工智能模型训练等前沿研究领域研发的平台。主要由环境仿真模块、物理效应计算模块、多智能体仿真模块、分布式网络…...
C++ 01.学习C++的意义-狄泰软件学院
一些历史 UNIX操作系统诞生之初是用汇编语言编写的随着UNIX系统的发展,汇编语言的开发效率成为瓶颈,所以需要一个新的语言替代汇编语言1971年通过对B语言改良,使其能直接产生机器代码,C语言诞生UNIX使用C语言重写,同时…...
微软正式发布开源应用平台 Radius平台
“ 10 月 18 日,微软 Azure 孵化团队正式发布开源应用平台 Radius,该平台将应用程序置于每个开发阶段的中心,重新定义应用程序的构建、管理与理解方式。” 简单的概括就是,它和Kubernetes不一样,Radius将应用程序放在每…...
WaveTools鸣潮工具箱:终极指南带你免费解锁120帧游戏体验
WaveTools鸣潮工具箱:终极指南带你免费解锁120帧游戏体验 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 想要在《鸣潮》中获得丝滑流畅的120帧游戏体验吗?被游戏默认帧率限制困扰已…...
2026届最火的六大AI学术助手推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 可被知网 AIGC 检测系统识别的,是学术文本里由生成式人工智能撰写的内容…...
保姆级避坑指南:在Windows 11上用Anaconda为PyTorch 1.11.0创建Python 3.8虚拟环境,并搞定GPU加速(torchvision 0.12.0+cu113)
Windows 11下Anaconda环境配置与PyTorch 1.11.0 GPU加速全攻略 刚接触深度学习的开发者往往会在环境配置阶段遇到各种"玄学问题"。本文将手把手带你完成从零开始的完整配置流程,重点解决那些官方文档没告诉你、但实际工作中一定会遇到的坑。 1. 环境准备&…...
从农历生日到公历提醒:基于sxtwl和Flask,手把手教你搭建个人农历纪念日提醒系统
打造智能农历纪念日管家:用Python和Flask实现自动提醒系统 每逢家人农历生日临近,总有人手忙脚乱翻看日历换算日期?传统节日当天才临时准备礼物?现在,用30行核心代码就能打造专属的智能提醒系统。本文将带你从零构建一…...
Cadence Virtuoso仿真报错‘No convergence’?别慌,手把手教你调大reltol和减小gmin
Cadence Virtuoso仿真报错‘No convergence’的实战解决指南 第一次在Cadence Virtuoso中看到"No convergence"的红色报错时,那种手足无措的感觉我至今记忆犹新。屏幕上密密麻麻的"update too large"和"residue too large"警告&#…...
从服务器到攒机:聊聊FRU(现场可更换单元)的前世今生与技术原理
从服务器到攒机:FRU技术的演进与硬件管理革命 在数据中心机房里,一台服务器突然亮起故障指示灯。工程师无需拆机就能通过远程控制台精准定位故障电源模块的序列号、生产批次和保修状态——这背后正是FRU(现场可更换单元)技术创造的…...
从《辐射》游戏到精准放疗:聊聊DRR技术如何悄悄改变我们的医疗体验
从《辐射》游戏到精准放疗:聊聊DRR技术如何悄悄改变我们的医疗体验 还记得《辐射》系列游戏中那个标志性的Pip-Boy设备吗?主角只需抬起手腕,就能瞬间扫描周围环境并生成全息影像。这种科幻场景如今已在医疗领域以更精密的形式实现——DRR&…...
AI 间接提示注入攻击成首要安全风险,企业与个人如何应对?
ZDNET 要点总结恶意的网页提示能在未输入信息时利用 AI,间接提示注入已成为大型语言模型(LLM)首要安全风险。别以为 AI 聊天机器人完全安全或无所不知。人工智能(AI)及其对企业和消费者的益处是今年会议和峰会热门话题…...
7个实战技巧:如何快速掌握DINOv2视觉Transformer的完整指南
7个实战技巧:如何快速掌握DINOv2视觉Transformer的完整指南 【免费下载链接】dinov2 PyTorch code and models for the DINOv2 self-supervised learning method. 项目地址: https://gitcode.com/GitHub_Trending/di/dinov2 DINOv2是Meta AI推出的革命性自监…...
Elasticsearch架构核心:Node节点详解与角色功能全解析
Elasticsearch架构核心:Node节点详解与角色功能全解析一、前言二、什么是 Elasticsearch Node(节点)?1. 官方定义2. 通俗理解3. 节点核心特点三、节点角色与功能流程图四、Elasticsearch 节点的 5 种核心角色与功能1. 主节点&…...














