进程概念~
进程概念
(冯诺依曼体系结构,操作系统,进程概念,进程状态,环境变量,程序地址空间)
冯诺依曼体系结构:(计算机硬件体系结构)
输入设备,输出设备,存储器,运算器&控制器(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的丑数,只是我们这里暂时无法排序,并且可能…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...