进程的地址空间

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

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,一经查实,立即删除!

相关文章

【C++11】线程

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

访问控制系列

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

memcached 高性能内存对象缓存

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

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

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

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

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

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…

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

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

LabVIEW软件开发的雷区在哪里?

在LabVIEW软件开发中,有几个需要注意的雷区,以避免常见的错误和提高开发效率: 1. 不良的代码结构 雷区:混乱的代码结构和不清晰的程序逻辑。 后果:导致难以维护和调试的代码,增加了错误和故障的风险。 …

Web3时代的教育技术革新:智能合约在学习管理中的应用

随着区块链技术的发展和普及,Web3时代正在为教育技术带来前所未有的革新和机遇。智能合约作为区块链技术的核心应用之一,不仅在金融和供应链管理等领域展示了其巨大的潜力,也在教育领域中逐渐探索和应用。本文将探讨智能合约在学习管理中的具…

【C++】前缀和:和为K的子数组

1.题目 2.算法 需要借助哈希表(查找效率很高)。 如果一个区间和为sum,如果它的前缀和为sum-k,那么后缀和一定是K。 3.代码

类与对象(3)

对于类的构造函数我们已经有了初步的了解,这里我们对其拷贝构造函数进行讲解: 目录 拷贝构造函数: 1.拷贝构造函数的作用: 2.系统生成拷贝构造函数的缺陷 3.深拷贝的实现 侧面体现 拷贝构造函数: 这里我们将拷贝…

小程序-模板与配置

一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 3.事件传参与数据同步 事件传参 (以下为错误示例) 以上两者的…

Java语言程序设计基础篇_编程练习题**14.29(游戏:豆机)

第十四章第二十九题 **14.29 (游戏:豆机) 请写一个程序,显示编程练习题 7.21 中介绍的豆机,如图 14-52c 所示 代码展示 package chapter_14;import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layou…

NFS存储、API资源对象StorageClass、Ceph存储-搭建ceph集群和Ceph存储-在k8s里使用ceph(2024-07-16)

一、NFS存储 注意:在做本章节示例时,需要拿单独一台机器来部署NFS,具体步骤略。NFS作为常用的网络文件系统,在多机之间共享文件的场景下用途广泛,毕竟NFS配置方 便,而且稳定可靠。NFS同样也有一些缺点&…

Postgresql主键自增的方法

Postgresql主键自增的方法 一.方法(一) 使用 serial PRIMARY KEY 插入数据 二.方法(二) 🎈边走、边悟🎈迟早会好 一.方法(一) 使用 serial PRIMARY KEY 建表语句如下&#xf…

住宅IP解析:动态住宅IP和静态住宅IP区别详解

在互联网连接的世界中,IP地址是我们识别和访问网络资源的关键。住宅IP地址,特别是动态住宅IP和静态住宅IP,是两种不同类型的IP分配方式,它们在使用和功能上存在显著差异。 1. IP地址的稳定性 动态住宅IP:这种IP地址是…