Linux进程创建:fork()与写时拷贝揭秘
进程控制进程创建Linux创建进程通过fork()函数调用!在之前的学习已经提到了这个知识点父进程在主函数中调用fork函数此时os就在创建了一个子进程此时父子进程就开始并发调度分流运行fork函数返回 子进程返回0父进程返回子进程PID若子进程创建失败返回-11)我们知道进程 内核数据结构数据所以创建子进程就要为子进程分配对应的数据结构和数据2)将父进程的PCB、mm_struct、页表拷贝给子进程个别数据进行修改3)将子进程添加到系统进程列表中 并且可以将子进程添加到进程调度队列我们知道父子进程数据默认共享直到进程某一方开始对某个数据进程修改时OS会使用写时拷贝来保证进程的独立性我们知道进程具有独立性那一个进程的代码是另一款OS呢那么就可以在LinuxOS上运行其他的OS这并不会有影响因为进程就有独立性这就是内核级虚拟机的原理写时拷贝子进程因为拷贝了父进程的内核数据结果所以父子进程在默认情况下是冰箱数据和代码的父子进程的虚拟地址空间和页表都相同所以都指向同一块物理地址所以共享我们知道页表也有权限字段控制用户使用虚拟地址访问物理内存!我们知道代码段数据不能呗修改所以在页表权限部分设置代码区的映射访问权限设为只读状态所以当用户尝试通过虚拟地址修改代码区数据的时候OS不运行通过地址映射那么为什么图中数据区的映射权限也为只读当只有父进程一个时候数据区的映射权限是为读写的但是当创建子进程有了多个子进程的时候会父子进程的数据区映射访问权限都设为只读当父子进程其中一个进程尝试修改数据区数据OS会发现访问的数据是合法的虚拟地址和物理地址都有OS又通过mm_struct知道访问的是数据区的数据但是发现数据段是只读的OS就会报错但是这种报错并不是真的出错而是O检查到用户要讲一个只读的区域写入而且这个区域是数据区这个时候OS就会启动写时拷贝(COW)所以处于共享状态父子进程是通过让用户修改只读的数据区页表向OS报错从而进行写时拷贝机制所以查页表报错机制也有多种情况1、地址不存在2、缺页中断访问的物理内存块不存在要加载3、访问的物理内存块存在但是全是是只读的为什么要写时拷贝我们知道进程具有独立性那如果我们创建子进程的时候直接把代码和数据全部拷贝一份给子进程可以吗理论上是可以的但是要考虑现实问题拷贝全部的代码和数据拷贝的时间需要考虑吧再说了整个程序代码不可能被修改数据也可能不会全部被修改数据中也有只读的数据所以如果全部都拷贝必然会产生内存浪费所以写时拷贝是OS内最精细的内存管理操作对不修改的数据不进行拷贝只对修改的数据进行拷贝减少创建子进程的成本时间减少内存浪费fork常规用法一个父进程希望复制自己使父子进程同时执行不同的代码段。通过创建子进程让父子进程分流运行代码后面的部分实现父进程代码的一部分功能例如父进程等待客户端请求生成子进程来处理请求一个进程要执行一个不同的程序例如子进程从fork返回后调用exec函数其实我们平时调用的指令就是通过bash父进程创建出来的子进程来完成的功能fork调用失败的原因fork创建子进程失败进程 内核数据结构 数据所以要么就是OS创建内核数据结构创建失败PCB、虚拟地址空间、页表的物理地址申请失败了这些东西说白了就是数据结构对象开辟还是需要空间的要么就是加载数据到内存失败了这两者失败的原因指向同样的方向——内存空间不够了所以OS为了减少内存不足的情况OS一般会限制进程数量并且会限制用户调用进程的数量系统中有太多的进程实际用户的进程数超过了限制

相关新闻

Windows用户文件夹移动后出现两个文件夹的注册表原理与修复指南

Windows用户文件夹移动后出现两个文件夹的注册表原理与修复指南

1. 问题场景:一个看似简单却令人困惑的“合并”现象 你有没有遇到过这样的场景?在Windows系统里,为了整理磁盘空间,或者纯粹是个人习惯,想把“桌面”或者“文档”文件夹从默认的C盘挪到D盘。这个操作听起来再简单不过了…

2026/11/11 22:17:54 阅读更多 →
监控视角非机动车违规交通行为检测摩托车自行车违章行为检测数据集VOC+YOLO格式5861张9类别

监控视角非机动车违规交通行为检测摩托车自行车违章行为检测数据集VOC+YOLO格式5861张9类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):5861 标注数量(xml文件个数):5861 标注数量(txt文件个数):5861 …

2026/11/3 1:59:02 阅读更多 →
LizzieYzy围棋AI分析助手:三步打造你的职业级围棋教练

LizzieYzy围棋AI分析助手:三步打造你的职业级围棋教练

LizzieYzy围棋AI分析助手:三步打造你的职业级围棋教练 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy 你是否曾经在复盘围棋对局时感到迷茫?面对复杂的棋局变化,…

2026/11/8 14:35:11 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/12 5:00:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/12 5:13:20 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/12 5:13:20 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/12 5:13:20 阅读更多 →

日新闻

周新闻

月新闻