进程概念~
进程概念
(冯诺依曼体系结构,操作系统,进程概念,进程状态,环境变量,程序地址空间)
冯诺依曼体系结构:(计算机硬件体系结构)
输入设备,输出设备,存储器,运算器&控制器(CPU)
CPU想要处理数据,要从内存中取出进行处理–CPU执行的一个程序,首先要把程序从硬盘加载到内存
操作系统:
本质:一个软件程序
功能:对计算机进行软硬件管理
目的:让计算机更好用
完整的操作系统:内核+外部应用(linux内核)
各个操作系统厂商,根据linux内核进行定制化开发,然后加上自己封装的应用,组成自己的操作系统(Redhat,Debian…)
操作系统如何管理硬件
用户
库函数
系统调用接口
操作系统
硬件驱动
硬件
自上而下,由操作系统进行串联,
进程:
运行中的程序,是程序运行过程的动态描述,这写描述在pcb-进程控制块中,在linux下是一个task_struct结构体
操作系统管理和调度程序的运行是通过pcb来实现
pcb描述的信息:标识符(进程ID),内存指针(程序数据在内存中的地址),程序计数器,上下文数据(切换cpu寄存器中的数据会保存下来,这是其一),进程状态,io信息,…
进程状态:
状态标记了当前进程该如何被操作系统进行调度管理(标识一个进程什么状态该做什莫事)
课本上:
就绪–准备好了,拿到时间片就能运行
运行–CPU在处理,获得CPU
阻塞–因为某些特殊原因,暂时不能运行,满足某种条件后,被置为就绪状态,拿到时间片可以运行
linux下进程状态:
查看进程:ps -aux | grep name 查看进程状态 ps -ef | grep name 查看进程的父进程
进程的六种状态
运行态–R:正在被执行,以及拿到时间片就能执行的进程,正在运行或在运行队列中等待
可中断休眠–S:(因为某种运行条件不足,暂时不能被调度运行的进程,sleep(3)),可以被kill -9 pid杀死
不可中断休眠态–D:无法被中断阻塞,只能等待阻塞的唤醒条件才能被调度执行,不可被kill
停止态–T:什么都不做,但还活着,可以被调度(与休眠不同,休眠是阻塞)
僵尸态–Z:进程退出运行,但是资源没有被完全释放,等待处理,pcb中还保存其信息
创建子进程:pid_t fork(void);–通过赋值调用进程(父进程)来创建一个新的进程(子进程)
返回值:在父进程中返回值是子进程的pid(大于0);在子进程中返回0;出错返回-1;
在在系统的角度进程就是pcb,咋linux下是task_struct 结构体
创建一个进程就是创建了一个task_struct 结构体,也就是创建了pcb
fork创建就是复制了父进程中大部分数据
它们都是进程,平等关系,不是子集关系
#include<stdio.h>
#include<unistd.h>
int main()
{printf("hello\n");//如果没有换行就不会清空缓冲区,那么下面fork子进程,子进程会把缓冲区内容一块复制,就会出现和父进程一样的输出hellobye,有'\n'则只有bye会输出两次pid_t child=fork();printf("bye\n");return 0;
}
僵尸进程:子进程先于父进程退出,为了保存退出原因,退出后没有完全释放资源成为僵尸进程
危害:资源泄露
避免:进程等待(等待子进程退出,获取退出子进程的返回值,释放子进程资源,避免产生僵尸进程)
僵尸进程存在的原因就是为了保存子进程退出原因给父进程看,只要父进程获取了退出原因,资源就会被释放
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{int ret=fork();if(ret==0){printf("child--%d\n",getpid());sleep(5);//子进程休眠五秒后退出,但是父进程没有接受其返回值,所以成为僵尸进程}else {printf("parent--%d\n",getpid());sleep(30);//让父进程休眠更长时间}return 0;
}
用ps查看进程

程序运行结果:

孤儿进程:父进程先于子进程退出,子进程成为孤儿进程
特性:运行在后台,父进程成为1号进程(以前叫init进程,现在是systemd)
fork创建子进程,父子进程的运行顺序是不一定的,在操作系统中,进程按照异步方式运行,按各自独立的、不可预知的速度向前推进
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{int ret=fork();if(ret==0){printf("我是子进程:pid=%d\n",getpid());sleep(10);}else {printf("父进程:pid=%d,3秒后退出\n",getpid());sleep(3);exit(0);}while(1){sleep(1);}return 0;
}
子进程的ppid为1,状态为

1号进程systemd

孤儿进程会成为僵尸进程吗?—不会变成僵尸进程,会被1号进程收养
环境变量:保存当前程序运行环境参数的变量
优点:即时生效;让运行环境配置更加灵活;通过环境变量可以给运行的程序传递数据
终端shell有两种变量:环境变量(有继承性)、普通变量(无)
接口:char* getenv(char* name);
指令:env 查看所有环境变量 ; set 查看所有变量 ; echo 打印指定内容到终端
export 声明一个变量为环境变量 ; unset 删除变量
在程序中访问环境变量:
1.getenv接口;
2.main函数第三个参数 main(int agrc,char* argv[],char* env[])
3.全局变量:extern char**environ;
并发:独木桥,多个人,一次走一个,轮换着走
并行:更宽的桥,可以多个人同时一起走
程序地址空间:操作系统为每个进程描述的一个虚拟地址空间
内存地址:对存储区域的编号(以字节为单位)
程序地址空间更应称作:进程地址空间(运行起来的程序才会占据内存)
在一个进程中,所访问到的所有变量地址都是一个虚拟地址,(并不是真正的物理地址存储),虚拟地址经页表映射得到物理地址,从而访问物理内存
虚拟地址空间是一个结构体:linux下是mm_struct
系统通过mm_struct结构体向每个描述了一个虚拟的、连续的、完整的、线性的地址空间。
好处:1.每个进程都要一个完整独立的虚拟地址空间,贼地址可以随便使用,不用担心冲突(地址管理更加方便)
2.通过页表映射可以随机存储在物理地址的任意位置,实现数据离散式存储,提高内存利用率
3.在进行页表映射后可以进行访问权限的控制
内存管理方式:
分段式内存管理:将一整个的地址空间划分为多个段(代码段,数据段,栈区,堆区…)
作用:更加利于编译器对于地址的管理
段表:是一种数据结构,其中描述的信息,段号,物理内存的一个起始地址
虚拟内存地址:
| 段号 | 偏移量 |
|---|
通过段号找到段表项,得到一块物理内存的起始地址,起始地址+偏移量=实际物理地址
分页式内存管理:将一整的地址空间划分为大量的小分页page(当前一般默认4k字节一页)
作用:实现数据的离散存储,提高内存利用率
页表:页号,物理内存地址起始,缺页中断位,访问权限位…
虚拟地址组成:页号+页内偏移
通过虚拟地址中的页号直到对应的页表项,得到了一个物理内存块的起始地址,加上页内偏移就是实际的访问位置,不同的地方在于应用方向不同,分段式利于地址管理,分页式更倾向于碎片化管理,提高内存利用率和内存访问控制
访问权限位:标记当前地址能够进行什么样的操作
比如:0号地址(NULL)不可读不可写,对其进行解引用或修改,会造成内存访问错误,程序崩溃
比如:const修饰的常变量,只读;代码段的所有地址都是只读
缺页中断:当进程要访问一块内存时经过页表映射法先缺页中断为被置位(意思是这个地址原先的数据现在不在内存中),则会触发缺页中断。
内存交换:一个程序运行就要占据大量内存,内存有限,耗尽时就无法进行任何操作,内存交换就是将内存中的某些数据从内存中移出,放到硬盘,腾出内存空间
当访问数据刚好是刚被移出的数据,就会发生缺页中断,而当发生缺页中断时,内存就又要重新进行内存置换。频繁的置换和缺页中断,会造成性能大大降低,硬盘吞吐量太小
内存置换算法:
LRU–最久未使用 ;LFU–最少使用
交换分区的大小一般是内存的两倍,无具体大小。
相关文章:
进程概念~
进程概念 (冯诺依曼体系结构,操作系统,进程概念,进程状态,环境变量,程序地址空间) 冯诺依曼体系结构:(计算机硬件体系结构) 输入设备,输出设备&a…...
三天吃透Java基础八股文
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
YOLOv8训练自己的数据集(超详细)
一、准备深度学习环境本人的笔记本电脑系统是:Windows10YOLO系列最新版本的YOLOv8已经发布了,详细介绍可以参考我前面写的博客,目前ultralytics已经发布了部分代码以及说明,可以在github上下载YOLOv8代码,代码文件夹中…...
【洛谷 P1088】[NOIP2004 普及组] 火星人 题解(全排列+向量)
[NOIP2004 普及组] 火星人 题目描述 人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学…...
基于混合蛙跳算法优化SVM的滚动轴承故障诊断python实现
1.混合蛙跳算法(SFLA)原理 混合蛙跳算法(SFLA)是一种受自然生物模仿启示而产生的基于群体的协同搜索方法,由局部搜索和全局信息交换两部分组成。 混合蛙跳算法中,每个青蛙的位置代表了一个可行解。青蛙在沼泽中跳跃,沼泽在离散的地方有很多石头,青蛙可以跳过这些石头来找…...
如何让AI帮你干活-娱乐(2)
背景:好容易完成朋友的任务,帮忙给小朋友绘画比赛生成一些创意参考图片。他给我个挑战更高的问题,是否可以帮他用AI生成一些视频。这个乍一听以现在AI技术根本不太可能完成。奈何他各种坚持,无奈被迫营业。苦脸接受了这个不可能完…...
文件异步多备常用方案
业务需求上经常存在需要对同一个文件进行双上传,上传到不同云存储桶,以防出现某一个云厂商因各种意外导致自身服务出现不可用的情况,当然,还有其他措施可以避免,现在只针对通过程序业务代码而双写存储的这个场景。 业务…...
java面试八股文之------Redis夺命连环25问
java面试八股文之------Redis夺命连环25问👨🎓1.为什么redis这么快👨🎓2.redis的应用场景,为什么要用👨🎓3.redis6.0之前为什么一直不使用多线程,6.0为甚么又使用多线程了&…...
【数据结构】AVL平衡二叉树底层原理以及二叉树的演进之多叉树
1.AVL平衡二叉树底层原理 背景 二叉查找树左右子树极度不平衡,退化成为链表时候,相当于全表扫描,时间复杂度就变为了O(n) 插入速度没影响,但是查询速度变慢,比单链表都慢,每次都要判断左右子树是否为空 需…...
K8S篇-安装nfs插件
前言 有关k8s的搭建可以参考:http://t.csdn.cn/H84Zu 有关过程中使用到的nfs相关的nas,可以参考: http://t.csdn.cn/ACfoT http://t.csdn.cn/tPotK http://t.csdn.cn/JIn27 安装nfs存储插件 NFS-Subdir-External-Provisioner是一个自动配置…...
xmu 离散数学 卢杨班作业详解【4-7章】
文章目录第四章 二元关系和函数4.6.2911121618.120.222.1232834第五章 代数系统的一般概念2判断二元运算是否封闭348111214第六章 几个典型的代数系统1.5.6.7.11.12151618第七章 图的基本概念12479111215第四章 二元关系和函数 4. A{1,2,3} 恒等关系 IA{<1,1>,<2,2…...
多重背包问题中的二进制状态压缩
1.多重背包问题 经典的多重背包问题和01背包问题的相似之处在于二者的一维遍历顺序都是从右侧往左侧遍历。 同时多重背包的一维写法不比二维写法降低时间复杂度。 2.多重背包标准写法:(平铺展开形式) class Solution {public int maxValue(int N, int C, int[] s…...
汇编语言程序设计(四)之汇编指令
系列文章 汇编语言程序设计(一) 汇编语言程序设计(二)之寄存器 汇编语言程序设计(三)之汇编程序 汇编指令 1. 数据传输指令 指令包括:MOV、XCHG、XLAT、LEA、LDS、LES、PUSH、POP、PUSHF、LA…...
Vant2 源码分析之 vant-sticky
前言 原打算借鉴 vant-sticky 源码,实现业务需求的某个功能,第一眼看以为看懂了,拿来用的时候,才发现一知半解。看第二遍时,对不起,是我肤浅了。这里侧重分析实现原理,其他部分不拓展开来&…...
【自然语言处理】【大模型】大语言模型BLOOM推理工具测试
相关博客 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语言处理】【大模型】GLM-130B:一个开源双语预训练语言模型 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍 【自然语言处理】【大模型】BLOOM:一个176B参数…...
云桌面技术初识:VDI,IDV,VOI,RDS
VDI(Virtual Desktop Infrastucture,虚拟桌面架构),俗称虚拟云桌面 VDI构架采用的“集中存储、集中运算”构架,所有的桌面以虚拟机的方式运行在服务器硬件虚拟化层上,桌面以图像传输的方式发送到客户端。 …...
基于本地centos构建gdal2.4.4镜像
1.前言 基于基础镜像构建gdal环境一般特别大,一般少则1.6G,多则2G甚至更大,这对于镜像的迁移造成了极大的不便。究其原因在于容器中有大量的源码文件以及编译中间过程文件,还要大量编译需要的yum库。本文主要通过在centos系统上先…...
生产环境线程问题排查
线程状态的解读RUNNABLE线程处于运行状态,不一定消耗CPU。例如,线程从网络读取数据,大多数时间是挂起的,只有数据到达时才会重新唤起进入执行状态。只有Java代码显式调用sleep或wait方法时,虚拟机才可以精准获取到线程…...
Day908.joinsnljdist和group问题和备库自增主键问题 -MySQL实战
join&snlj&dist和group问题和备库自增主键问题 Hi,我是阿昌,今天学习记录的是关于join&snlj&dist和group问题和备库自增主键问题的内容。 一、join 的写法 join 语句怎么优化?中,在介绍 join 执行顺序的时候&am…...
算法 - 剑指Offer 丑数
题目 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 解题思路 这题我使用最简单方法去做, 首先我们可以获取所有2n,3n,5*n的丑数,只是我们这里暂时无法排序,并且可能…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
