Linux 进程控制

进程地址空间的收尾

task_struct有一个结构体成员叫mm_struct,也就是进程地址空间。

为什么要有进程地址空间:进程内存地址管理,保护物理内存,进行权限审查,从无序变有序,让我们从统一的视角看待进程代码和数据。

mm_struct里面有这些东西。

这些起始和结束划分了很多区域。也就是我们用户区的那3个G的空间:

vm_area_struct里面有自己的成员

其中vm_mm是一个指向自己的指针。

startend指定了一段范围。

也就是内核区那1个G的空间:

进程控制

fork()创建进程

fork有返回值,返回值的本质就是写入。

所以父进程要创建一个变量 pid id=fork()。

返回时就是向该变量进行写入。

子进程和父进程同享这一个变量,为了子进程修改该变量时不影响父进程,因此就有了写实拷贝。

因此父子进程的该变量值不同,但是逻辑地址相同。

这在上文已经讲过,过了。

创建子进程之后会做什么事情

写实拷贝

 数据区本身是可读写的,但是在fork()创建完子进程之后变为只读了。

原因

子进程要写入就要产生写实拷贝,写实拷贝就要重新开辟一块空间,然后进行拷贝,修改页表

这些工作都要操作系统来做。但是操作系统要怎么介入进来呢?

此时子进程正在写入,操作系统会先在要创建子进程时把父进程的数据区变为只读权限,这时候创建完子进程之后复制父进程的代码区,子进程也为只读权限。

这个工作是操作系统完成的,用户是看不见的,也就是用户是不知道的,那么用户就有修改子进程的可能。

 

因为页表此刻是只读权限,用户写入就会因为页表转换而报错。

操作系统此时就会过来,因为有人对只读数据区写入,操作系统此刻会介入,因为父子进程共享一块空间,所以子进程的修改就会影响父进程,为了不影响父进程,操作系统会给子进程重新开一块空间。

页表转换出错的两种可能

第一种就是写入数据,正好地址落在了code starth ~code end之间,也就是代码区,这些区本身就只能读,这时候非要写就会报错。

第二种情况就是地址落在了数据区,这些区平时本身就有读写权限,此刻却只有读权限,这时候用户写入不是错误,而是操作系统为了介入的一种策略机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序_小结

排序篇(六)----排序小结\n排序算法复杂度及稳定性分析\n直接插入排序的算法复杂度:\n\n最好情况下,当数组已经有序时,直接插入排序的时间复杂度为O(n),其中n是数组的大小。\n最坏情况下,当数组逆序排列时,直…

ModuleNotFoundError: No module named ‘torchvision.models.utils‘

如图报错:No module named torchvision.models.utils解决方案:由于当前python环境高版本的torch, 代码用的是低版本的语法 将 from torchvision.models.utils import load_state_dict_from_url换成 from torch.hub import load_state_dict_fr…

Python编程题集(第一部分基本语法基础)

Demo01 摄氏温度转化为华氏温度 题目描述: 输入一个摄氏温度的值,将它转变为华氏温度,并将结果输出 转换的公式为如下:fahrenheit (9 / 5 ) * celsius 32 输入输出描述 输入一个值表示摄氏温度celsius 输出华氏温度fahren…

数据结构与算法—插入排序选择排序

目录 一、排序的概念 二、插入排序 1、直接插入排序 直接插入排序的特性总结: 2、希尔排序 希尔排序的特性总结: 三、选择排序 1、直接选择排序 时间复杂度 2、堆排序—排升序(建大堆) 向下调整函数 堆排序函数 四、交换排序 1、冒泡排…

CF1866M Mighty Rock Tower

CF题面 luogu题面 期望题。 题目大意:一个人在搭积木,每次堆叠可能成功或失败,失败可能导致其下面连续的若干块掉落。给定搭每一块时失败的概率,求堆叠完成的期望次数。 具体的,假设当前正在堆叠第 i 块,…

Elasticsearch:RAG vs Fine-tunning (大语言模型微调)

如果你对 RAG 还不是很熟悉的话,请阅读之前的文章 “Elasticsearch:什么是检索增强生成 - RAG?”。你可以阅读文章 “Elasticsearch:在你的数据上训练大型语言模型 (LLM)” 来了解更多关于如何训练你的模型。在今天的文章中&#…

数据结构大体体系

逻辑结构 线性结构线性表一串珠子用线连起来,这就是典型的“线性存储结构”。每颗珠子之间的关系结构也很简单,包括头尾的话,它们最少有一个关系对象,而中间的珠子无论前后都只有一个关系对象,即 one-to-one栈队列字符…

<Linux>Linux高级技巧和命令(自用)

《Linux高级技巧和命令(自用)》 1 技巧1.1 清空文件1.2 快速生成大文件1.3 安全擦除硬盘数据1.4 快速制作系统盘1.5 查看某个进程的部分参数1.6 时间戳转换1.7 查看ASCII码1.8 删除乱码文件1.9 批量下载网页资源1.10 历史命令 1 技巧 1.1 清空文件 $ &…

自动驾驶高效预训练--降低落地成本的新思路(AD-PT)

自动驾驶高效预训练--降低落地成本的新思路 1. 之前的方法2. 主要工作——面向自动驾驶的点云预训练2.1. 数据准备 出发点:通过预训练的方式,可以利用大量无标注数据进一步提升3D检测 https://arxiv.org/pdf/2306.00612.pdf 1. 之前的方法 1.基于对比学…

19、Flink 的Table API 和 SQL 中的内置函数及示例(1)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

项目管理之如何召开项目时间箱启动会议

时间箱启动会议是项目管理中至关重要的一环,它帮助项目团队明确目标、分配任务、制定计划,并为项目的顺利实施提供指导和支持。下边为大家介绍有关如何召开时间箱启动会议的一些建议: 确定会议目标 在召开时间箱启动会议前,首先…

Tomcat,jdk下载配置(发布项目)

Tomcat,jdk下载, 远程连接 启动以下服务 高级设置 允许别人连接进来 网上搜索jdk下载即可 双击下一步即可 下一步 输入java,看有没有安装成功 这是安装成功的 Tomcat就可以安装了 和以上操作一样,在网上下载安装包,…

APP开发:用途与未来前景|软件定制开发|网站小程序建设

APP开发:用途与未来前景|软件定制开发|网站小程序建设 APP开发已成为现代科技趋势的一部分,无论是日常生活还是商业领域,都有它的身影。通过开发APP,我们可以将想法、功能和内容转化为直观、易用的移动设备应用程序,满…

java的反应式流

Java的反应式流是一种新的编程模型,它在异步和事件驱动的环境下工作。反应式流的目的是为了解决传统的单线程或者多线程编程模型在高并发和大流量情况下的性能瓶颈。 反应式流的核心是Observable和Observer,Observable表示一个数据流,而Obse…

一、配置环境

一、配置Java环境 确保安装了Java开发工具包(JDK),并且设置了JAVA_HOME环境变量。 二、配置FFmpeg环境 如果使用了FFmpeg相关的功能,需要确保系统中已经安装了FFmpeg,并且设置了FFMPEG_HOME环境变量。 ffmpeg安装教…

Unity json反序列化为 字典存储

当在Unity游戏中需要加载和管理游戏数据,通常使用JSON文件是一种常见的方法。在本篇博客中,我们将深入探讨如何使用C#和Unity的JSON反序列化功能来实现这一目标。我们可以使用Unity的JsonUtility来反序列化JSON数据并将其映射到自定义的C#数据结构中。 …

【CSDN 每日一练 ★☆☆】【链表】删除排序链表中的重复元素

【CSDN 每日一练 ★☆☆】【链表】删除排序链表中的重复元素 链表 递归 题目 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。 返回同样按升序排列的结果链表。 示例 示例 1&am…

ActiveMq学习⑨__基于zookeeper和LevelDB搭建ActiveMQ集群

引入消息中间件后如何保证其高可用? 基于zookeeper和LevelDB搭建ActiveMQ集群。集群仅提供主备方式的高可用集群功能,避免单点故障。 http://activemq.apache.org/masterslave LevelDB,5.6版本之后推出了LecelDB的持久化引擎,它使…

基于Qt QProcess获取linux启动的程序、QScreen 截屏、GIF动画实现

在Linux中,可以使用QProcess类来获取已启动的程序。以下是一个示例代码: #include <QCoreApplication>#include <QProcess>int main(int argc, char *argv[]){QCoreApplication a(argc, argv); // 创建一个QProcess对象 QProcess process; // 设置执行…

kubernetes集群编排——k8s调度

nodename vim nodename.yaml apiVersion: v1 kind: Pod metadata:name: nginxlabels:app: nginxspec:containers:- name: nginximage: nginxnodeName: k8s2 nodeName: k8s2 #找不到节点pod会出现pending&#xff0c;优先级最高 kubectl apply -f nodename.yamlkubectl get pod …