进程的地址空间

一、写个代码见一见地址空间

1、问题

在代码中我们在第五秒时会在子进程中改变全局变量 g_val 但是我们发现了一个奇怪的现象:在子进程中改变 g_val ,由于进程的独立性,所以子进程和父进程的值不一样是可以理解的,但是为什么变量的地址也是相同的?

这是因为程序中的各种数据其实是存放在虚拟地址中的,虚拟地址是一样的,但是实际上物理内存中的地址已经是不一样的。

所以地址空间也要被操作系统控制,也是内核数据结构,页表也是。

创建子进程时会把父进程的大部分内核数据都拷贝(浅拷贝)一份。

2、举例

那我们如果要改子进程中的数据怎么办呢?

为保证进程独立性,父进程数据不能修改,这就要发生写时拷贝,操作系统会另外开辟一段空间,把数据拷贝供子进程修改,这时候子进程的页表的实际地址就要发生改变,而虚拟地址不变,也就解释了开头的问题。

3、细节

(1)若父子进程不写入数据,未来的全局变量就默认被父子进程共享,代码共享。

(2)为什么不是深拷贝,而是浅拷贝,其实很多时候数据在父子进程中不会被修改,若都是深拷贝就会有很多空间的浪费。

二、理解地址空间

1、Linux中的地址空间

地址空间本质上就是struct结构体,里面定义很多属性表示边界的 start, end

看到上图的Linux源码中地址空间是 mm_struct

2、为什么要有虚拟地址空间

(1)连续地访问区域

将在物理内存中存放无序的数据变成在虚拟地址中存放有序的数据,让进程以统一的视角看待物理内存和自己运行的区域。以统一的,线性的方式连续访问各个区域。

(2)进程管理模块和内存管理模块的解耦

具体实现:你进程要空间?可以,你在你的页表填虚拟地址,但如果你不是马上要用空间,我就不先给你申请物理内存,等你要用了我再给你申请。

这样就可以提高运行效率。

(3)拦截非法请求

如果访问了非法地址,在操作系统查看页表时就可以拦截非法请求,保护了物理内存。

三、理解页表和写时拷贝

(1)我们提到过,当进程挂起时他的数据和代码会被唤出到磁盘中,对应的就是页表中某一个选项为0,表示物理内存中没有该数据了。

(2)页表中也存有地址空间的权限,例如常量区不可被写入,所以代码cahr* str = "hello"; *str = 'h';是不对的,就是在数据写入时操作系统发现了错误。

(3)操作系统发生错误的三种情况

a、是不是数据不在物理内存?这就是缺页中断。

b、是不是要写时拷贝?

c、都不是那就报错

四、理解虚拟地址

首先程序中就有地址。例如main函数中调用其他函数就需要函数地址,这就是虚拟地址,也叫逻辑地址。

所以地址空间和页表左侧的虚拟地址是直接从程序中读就可以,称为平坦模式。

所以为什么fork()函数返回两个id值,实质就是创建子进程时发生写时拷贝,对id进行写入,导致id值不同但是虚拟地址相同。

五、Linux2.6内核进程调度队列

在Linux中有nice值 [-20, 19] 的存在,优先级范围是 [60, 99] 共40个。

在操作系统的 runqueue 中存在一个queue[140] 存放 task_struct

而40个优先级对应的下标就是100~139

当有进程的优先级重复时就会被链入链表中。

runqueue中还有 bitmap[5] 的位图来表示[0, 139]中是否有进程,这样查找特定进程时间复杂度就是O(1)

*active指针指向的queue进程只出不进,*expired指针指向的queue进程只进不出,当操作系统遍历bitmap时发现活跃队列中的进程已经全部出队就会进行swap(active, expired)此时活跃队列中进程就可以再次只出不进,以此来完成进程的调度。这就是进程调度O(1)算法。

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

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

相关文章

20240718每日后端------------kafka VS RabbitMQ:选择正确的消息代理

目标 消息队列选型 Kafka VS RabbitMQ Kafka Apache Kafka 是一个开源分布式事件流平台,以其高吞吐量、容错性和实时数据处理能力而闻名。 Kafka 遵循发布-订阅模型,生产者将消息写入主题,消费者订阅这些主题以接收消息。 Kafka 将消息存储…

【C++11】线程

本篇文章更多的是熟悉一下C11的线程库接口,与linux的相关线程接口是非常相似的,更多的是将面向过程改为了面向对象。 并没有一些概念的讲解。 想知道线程的相关概念的可以看一看这篇文章及后续 在C11之前,涉及到多线程问题,都是和…

访问控制系列

目录 一、基本概念 1.客体与主体 2.引用监控器与引用验证机制 3.安全策略与安全模型 4.安全内核 5.可信计算基 二、访问矩阵 三、访问控制策略 1.主体属性 2.客体属性 3.授权者组成 4.访问控制粒度 5.主体、客体状态 6.历史记录和上下文环境 7.数据内容 8.决策…

使用TableConvert API将CSV转换为JSON数组

TableConvert API 是一款多功能工具,旨在简化不同数据格式之间的转换过程。通过访问370种不同的转换器,该API可以在包括CSV、Excel、HTML、JSON、Markdown等多种文件类型和结构之间实现无缝数据转换。 为什么选择TableConvert的CSV到JSON数组API&#x…

面试问题:react的Reconciler(调度器)为什么在做异步可中断不用原生Generator,自己做了一个Fiber

首先Generator也是有异步中断功能的但是能他是有传染性的,使用了Generator则需要上下文的其他函数也需要做主改变,这样心智负担比较重,就比如说我定义一个Generator方法,里面有ABC三个函数我分别在B的前面和C的前面放一个yield打断…

Linux: network: device事件注册机制 chatGPT; notify

ChatGPT 在 Linux 内核中,有关网络设备(net-device)的事件注册机制,允许用户在网络设备的状态发生变化(例如设备被删除、添加或修改)时接收通知。这主要通过 netdev 事件通知机制实现。具体来说,内核提供了一组用于注册和处理网络设备事件的 API。 以下是一些关键组件…

memcached 高性能内存对象缓存

memcached 高性能内存对象缓存 memcache是一款开源的高性能分布式内存对象缓存系统,常用于做大型动态web服务器的中间件缓存。 mamcached做web服务的中间缓存示意图 当web服务器接收到请求需要处理动态页面元素时,通常要去数据库调用数据,但…

【快速逆向一/无过程/有源码】《大学》在线投稿系统

逆向日期:2024.07.18 使用工具:Node.js 加密工具:Crypto-js标准库 文章全程已做去敏处理!!! 【需要做的可联系我】 【点赞 收藏 关注 】仅供学习,仅供学习, 本文为快速逆向&#x…

如果制作红星照耀中国思维导图?6个软件帮助你快速制作思维导图

如果制作红星照耀中国思维导图?6个软件帮助你快速制作思维导图 制作《红星照耀中国》思维导图可以帮助更好地理解和梳理书中的重要信息和内容。以下是六款推荐的思维导图软件及其特点和使用方法,帮助你快速制作高质量的思维导图。 迅捷画图 特点与功…

Milvus核心组件(2)---- etcd 详解

目录 背景 etcd 简介 1. 基本概念 2. 数据存储特性 3. KVS的操作 4. 租约(Lease)机制 5. 实际应用场景 Milvus 下的 etcd 服务及存储结构 etcd 服务 端口 存储位置 安全连接信息 嵌入式方式运行 etcd 文件存储结构 解析etcd 文件 连接 etcd server 注意事项…

n2. Web相关知识和工具

Web相关知识和工具 1. http协议相关基础知识2. http协议状态码3. Web相关工具2.1 links2.2 wget2.3 curl2.4 httpie 4. httpd的压力测试工具 1. http协议相关基础知识 URI: Uniform Resource Identifier 统一资源标识,分为URL 和 URN URN:U…

Python基础语法篇(下)+ 数据可视化

Python基础语法(下) 数据可视化 一、函数(一)函数的定义(二)函数的调用和传参 二、文件操作(一)文件读取和写入(二)文件对象及方法(三&#xff09…

【数学建模】——【线性规划】及其在资源优化中的应用

目录 线性规划问题的两类主要应用: 线性规划的数学模型的三要素: 线性规划的一般步骤: 例1: 人数选择 例2 :任务分配问题 例3: 饮食问题 线性规划模型 线性规划的模型一般可表示为 线性规划的模型标准型&…

达梦数据库的系统视图v$sqltext

达梦数据库的系统视图v$sqltext 在达梦数据库(DM Database)中,V$SQLTEXT 是一个系统视图,用于显示当前正在执行或最近执行的SQL语句的文本信息。这个视图对于监控和分析数据库中的SQL活动非常有用,尤其是在需要调试性…

【MySQL篇】Percona XtraBackup工具备份指南:常用备份命令详解与实践(第二篇,总共五篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

银河麒麟搭建ftp服务器

1.先 查看系统架构,我常遇到的一般银河麒麟是arrch64的 lscpu uname -a cat /etc/os-release 去下载对应版本的vsftp.rpm包和ftp包 Index of /NS/ (cs2c.com.cn) 1.安装rpm rpm -ivh *.rpm --nodeps --force #强制安装 2.修改配置文件 vi /etc/vsftpd/vsftpd.co…

Qt Android Native Error: JNI DETECTED ERROR IN APPLICATION: java_object == null

开发的qt android程序在低版本上运行正常&#xff0c;在高版本上启动时崩溃&#xff0c;报如下错误 W java.lang.RuntimeException: Cant create handler inside thread Thread[qtMainLoopThread,5,main] that has not called Looper.prepare()at android.os.Handler.<ini…

如何使用Python调用颜值评分接口

引言 在当今社会&#xff0c;人工智能技术被应用于各个领域&#xff0c;包括图像识别和分析。今天&#xff0c;我们将利用Python来调用小思框架颜值评分接口&#xff0c;该接口可以接收一张人脸图片&#xff0c;并返回一个表示颜值水平的分数。 接口功能与参数 方法URL参数描…

PiT : 基于池化层Pooling layer的Vision Transformer

CNN的降维原理;随着深度的增加,传统CNN的通道维数增加,空间维数减少。经验表明,这样的空间降维对变压器结构也是有益的,并在原有的ViT模型的基础上提出了一种新的基于池的视觉变压器(PiT)。 1. 引言 ViT与卷积神经网络(CNN)有很大的不同。将输入图像分成1616小块馈送到变压…

C++ 匹配并提取包括加中括号的日期时间的正则表达式

在C中&#xff0c;你可以使用std::regex库来匹配包含日期和时间的字符串。以下是一个简单的例子&#xff0c;它展示了如何使用正则表达式来匹配形如[YYYY-MM-DD HH:MM:SS]的字符串。include <iostream> #include <string> #include <regex> int main() { …