"字符串地址:%p\n", ps); //%p 专门用来打印地址信息 return 0; } 利用前面学习的 fork 函数创建子进程,使得子进程和父进程共同使用一个变量 #include <stdio.h...原因: 当子进程尝试修改共享值时,发生 写时拷贝 机制 语言层面的程序空间地址不是真实物理地址 一般将此地址称为 虚拟地址 或 线性地址 结论: 语言层面的地址都是虚拟地址,用户无法看到真实的物理地址,...进程地址空间 下面来好好谈谈 进程地址空间 (虚拟地址) ️虚拟地址 在早期程序中,是没有虚拟地址空间的,对于数据的写入和读取,是直接在物理地址上进行的,程序与物理空间直接打交道,存在以下问题: 假设存在野指针问题...,大佬们提出了 虚拟地址空间 这个概念,有了 虚拟空间 后,当进程创建时,系统会为其分配属于自己的 虚拟空间,需要使用内存时,通过 寻址 的方式,使用物理地址上的空间即可 多个进程互不影响,动态使用,做到...可以让进程以统一的视角看待自己的代码和数据 ---- 总结 以上就是本篇关于 Linux进程学习【进程地址】的全部内容了,我们从一个有趣的小问题切入,见识到了 虚拟地址空间 与 物理地址空间 的奇妙关系
本篇主要内容: 了解程序地址空间 理解进程地址空间 探究页表和虚拟地址空间 1....进程地址空间 我们现在来深入的了解一下为什么相同的的地址为什么会有不同的值? 首先引入一个概念:每一个进程运行之后,都会有一个进程地址空间的存在,在系统层面都要有自己的页表映射结构!...而我们观察进程地址空间,发现里面是一堆的地址划分。...其实在这个时候操作系统会将你的这个访问暂停,然后进行一下操作: 操作系统会将你的可执行程序重新开辟空间 把对应可执行程序需要执行的这个虚拟地址对应的代码加载到内存里 把对应的虚拟地址填充到页表 把标志位改为...二、存在虚拟地址空间,可以有效的进行进程访问内存的安全检查 三、将进程管理和内存管理进行解耦 四、保证进程的独立性 通过页表让进程虽然虚拟地址一样但是映射到不同的物理内存处,从而实现进程的独立性
大家在学习语言阶段应该都听到过内存的概念,那么大家脑子里的固态思维就有这样一张图: 堆用于存储动态内存开辟,栈用来存放临时变量,全局变量的区域存放临时变量,常量区存储常量字符串等具有常量性质的代码...其实进程地址空间只是一个比较抽象的存在,它本质上是一种将各个区域划分的内核数据结构,分别与各自的特定进程关联起来,并且各个进程都有自己私有的一份进程地址空间 所以大家还得记住,大家印象当中的那张图不是真实的内存...为什么要有进程地址空间? 大家可能会有疑惑,为什么我要平白无故地创造出一个进程地址空间呢?这不是在在误导我们吗?...我们知道进程有几个特性分别为: 竞争性,独立性,并发性和并行性 我们假设一种情况: 如果没有进程地址空间的存在,直接让给进程将地址然后传递命令给CPU,如果给出的这个地址是个错误的地址呢?...写时拷贝支撑了进程地址空间的存在,保证了进程的正常运行!
✈️什么是进程地址空间 每一个进程都存在一个进程地址空间,且 在32位平台下范围为 [0, 4GB]; 在详细说明进程地址空间之前,我们先说个故事: 有一天,阿熊敲代码敲到很晚,并且第二天早上还有课...虚拟地址空间本质上就是一种数据结构! task_struct 指向某一个进程地址空间,而进程地址空间以链式结构存储,于是操作系统对进程地址空间的管理,变为对该链表的增删查改!...阿熊其实意识到了事情的不对,于是在程序里埋了“雷”,谁知道甲方催的急,阿熊的代码还没被测试部门 检测完项目就已经交接了。阿熊等着看领导的好戏如何上演,阿熊已经想到领导难堪的样子了。...要想更好了解进程地址空间,我们有必要深入学习进程地址空间的属性。 ...进程地址空间本质上也是一种数据结构,并且彼此是链式连接的,于是 操作系统对进程地址空间的管理变为了对链表的增删查改! 我们了解了进程地址空间中一定存在许多的地址划分,用来区分各个地址区域。
文章目录 一.感性理解进程地址空间 二.理性认识进程地址空间 1.虚拟和物理地址空间 2.虚拟地址和物理地址联系 a.页表映射 b.写时拷贝 三.为什么要存在进程地址空间 在正式开始之前我们首先来看这样的一个现象...进程要被管理,进程地址空间也要被管理,进程地址空间通过先描述后组织的方法形成一个mm_struct被管理。...为了更有效的管理和少出错,现代系统提供了虚拟存储器,虚拟存储器为每个进程提供了一个大的,一致的,私有的地址空间,这个地址空间就是进程地址空间。...1.虚拟和物理地址空间 进程是操作系统中最成功的概念之一,每个进程都具有一个私有的虚拟地址空间,它提供一个假象使进程觉得自己独占内存空间。...2.虚拟地址和物理地址联系 a.页表映射 当一个进程被建立,操作系统就会给进程建立对应的进程控制块,这个进程控制块中有一个指针指向mm_struct(进程地址空间)。
文章目录 一、前言 二、什么是进程地址空间 三、进程地址空间如何进行管理 四、为什么会存在进程地址空间 五、进程地址空间区域的严格划分 一、前言 学习Linux系统编程一共要翻越三座大山 – 进程地址空间...此时,我们就能解释上面的现象了 – 子进程和父进程都拥有自己的单独的进程地址空间,且子进程的地址空间是从父进程那里拷贝来的,所以最开始二者的 g_val 其实指向同一块物理内存; 现在子进程想要修改自己地址空间中...---- 三、进程地址空间如何进行管理 OS 如何管理进程地址空间 OS 会为系统中的每一个进程都创建一个进程地址空间,但是 OS 内部同时存在着许多进程,所以为了保证各个进程正常运行,OS 需要对每个进程的地址空间进行管理...---- 四、为什么会存在进程地址空间 我们上面学习了什么是进程地址空间,以及进程地址空间如何进行管理,那么为什么会存在进程地址空间呢?我们直接将数据存入物理内存不好吗?...为什么还要耗费时间和空间创建虚拟地址空间以及页表呢?这时候就需要引入进程地址空间的优势了,进程地址空间主要有如下三方面的优势。 1、进程地址空间保证了数据的安全性。
验证栈区:地址在变低 验证堆区:地址在变高 3、静态变量会被定义在全局区 只不过只会在作用域里使用。 二、fork遗留问题 历史遗留问题:为什么一个变量可以同时等于0又同时>0 ?? ...3.3 什么是进程地址空间 所谓进程地址空间,本质上就是一个描述进程可视化范围的地址空间内存在各种区域划分,对线性地址进行start、end即可 。...),然后开辟一块新的物理内存,修改页表的映射 4.2 进程地址空间是如何切换的 进程PCB结构体里有对应的进程地址空间指针,所以进程切换就以为这进程空间地址空间被切换,而页表会被存储在CPU的cr3...但是虚拟地址可以将一个线性的地址呈现给进程。 五、为什么要有进程地址空间?...所以为什么子进程可以继承父进程的环境变量,因为子进程启动时,父进程已经把对应的环境变量信息加载进去了, 他也是地址空间的一部分,所以他必然有页表去帮助我们建立虚拟地址和物理地址的映射,而当子进程创建的时候
,不影响另一个进程的变量 value通过写时拷贝变成两个变量,打印不同变量的地址时,应该是两个变量的地址,那为什么显示是相同的呢?...,CPU会自动根据页表将虚拟地址转化为物理地址 创建子进程,就要创建子进程的PCB,及地址空间和页表结构 子进程的相关内核数据结构的属性字段会继承父进程 大富翁 A有个儿子是E,A跟E说,我们家有10...个亿是你爷爷的,所以E要继承给他10亿的大饼 所以子进程在虚拟地址处也有对应的地址 正常来说,子进程要对value对修改,把value变成200,父进程通过映射关系找到value,读到200 但因为进程具有独立性...进程地址空间+页表的意义: 1.防止地址随意访问,保护物理内存与其他进程 若没有地址空间的存在,则直接使用cPU调用物理地址,会有野指针的问题存在 2.将进程管理和内存管理进行解耦合 因为有虚拟地址和页表的存在...,所以不关心进程对应的物理地址所处位置
但在他们的世界里没有代码给我们带来的快乐,而我们有!!哈哈哈哈哈 如今的我们体会到了敲代码的乐趣,任何东西想用代码来搞一搞。...指针pgt指向该进程的页目录(每一个进程都有自己的页目录),当调度程序调度1个程序运行时,就将这个地址转换成物理地址,并写入控制寄存器。...虽然每一个进程只有1个虚拟空间,但是这个虚拟空间可以被别的进程来同享。如:子进程同享父进程的地址空间,而mm_user和mm_count就对其计数。...有一进程在调用fork函数创建子进程时,操作系统会将父进程的PCB,mm_struct结构体,包括页表复制一份给子进程,所以父子进程中相同的虚拟地址通过页表映射会找到同一块内存空间,读取到相同的数据。...虚拟地址空间的存在,可以更方便的进行进程和进程代码和数据的解耦,更好的保证了 进程的独立性特征。
今日更新了Linux进程空间地址和进程调度队列的内容 欢迎大家关注点赞收藏⭐️留言 问题现象 当g_val的值修改后,父子进程各自的g_val地址都是一样的,但是为什么值却不同呢?...由此我们可知,这个地址肯定不是物理地址,而是虚拟地址。 进程地址空间 地址空间的本质就是内核中的一个结构体对象。 每一个进程都有自己独立的地址空间,都有自己独立的页表。...页面里面存的是虚拟地址和对应的物理地址。 上图中,左边是父进程,右边是子进程。 我们在用C/C++语言所看到的地址,全部都是虚拟地址!...物理地址,用户一概看不到,由OS统一管理 页面一边存的是虚拟地址,另一边存的就是对应的物理地址。 子进程会继承父进程的数据,所以最开始指向的虚拟、物理地址也跟父进程一样。...由于g_val的值改了,由因为进程具有独立性,所以OS就会在物理空间重新开一个空间,拷贝旧的数据到该地址,再让子进程的g_val指向该物理地址,但是虚拟地址不变。因此就出现文章开头的情况。
环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux...OS则是将虚拟地址转化为物理地址(如何转化后面会讲到) 如何理解进程地址空间? 首先我们要知道,什么是进程地址空间?...在该结构体里存在着大量的_start与_end。用来表示每一个区域各自的边界值。 就比如说:堆区的区域范围为[heap_start,heap_end]。...同时可以将物理地址,经过页表映射虚拟地址返回给进程。就好像下面这样: 写时拷贝 我们来解释一下最开始的现象:为什么父子进程的tmp地址相同,但结果不同呢?...拓展:为什么存在进程地址空间? 一、防止地址随意访问,保护物理内存与其它进程 实际上,在最开始的时候,还没有虚拟地址这种概念。早期的进程是直接与物理内存打交道。
我们程这些地址为虚拟地址/线性地址 上面那些空间排布结构也不是在物理内存里。...当CPU执行进程中的指令时,它会根据程序计数器的值来获取下一条要执行的指令的虚拟地址 进程地址空间实质 代码和数据实际上是存储在物理内存中的,而进程空间(或称为虚拟地址空间)里存储的是代码和数据的虚拟地址...需要注意的是:这个结构体里不保存代码和数据 图示过程 2.1进程地址空间意义 地址空间和页表的结合是操作系统中实现虚拟内存管理的关键机制,它们的存在有助于解耦进程管理和内存管理,并提供了保护内存安全的重要手段...3.创建进程 3.1fork()函数创建子进程补充 我们之前已经讲了在代码里可以使用fork()函数来。...所以上面写时拷贝的过程里:可以看到在修改内容之前,数据段里的权限也都是只读,这不对吧?
Text-to-speech function is limited to 200 characters
一、是什么 进程地址空间是什么?...首先,我们可以理解,父子进程的值不同是因为进程间具有独立性,但是这里的i的地址居然是相同的!!!我们可以先排除该地址是在物理磁盘上的地址的可能性,因为物理磁盘的同一个地址只能存唯一确定的一个值。...为了给进程画饼(让进程认为自己独占操作系统资源),操作系统为每个进程都创建了独立的地址空间,地址空间的内容通过页表映射到物理内存中这样每个进程都能独立的运行。...3.现象的具体解释 父进程和子进程都有自己独立的进程地址空间,也有独立的页表结构。子进程由父进程创建,因此子进程的进程地址空间是拷贝父进程的进程地址空间。...三、怎么办 操作系统要为每一个进程分配地址空间,那么操作系统是否要管理这些地址空间呢?当然是要管理的。 那么,操作系统怎么管理进程的地址空间?
Linux进程地址空间 零、前言 一、程序内存空间 二、进程地址空间 1、引入及概念 2、进程地址空间 3、相关问题 零、前言 本章主要讲解学习进程地址空间的知识 一、程序内存空间 在学习C/C...,子进程以父进程为模板构建进程,代码父子共享,数据各有一份(谁进行写入谁发生拷贝) 而我们发现子进程数据发生修改时,子进程数据的地址和父进程的地址一样,没有发生改变 对于变量内容不一样,但地址值是一样的...物理地址,用户一概看不到,由OS统一管理,OS必须负责将 虚拟地址 转化成 物理地址 进程地址空间本质是进程看待内存的方式,抽象出来的一个概念,对于每个进程来说,系统会给他们创建对应的PCB进程块结构体...,同时也相应的分配了对应的mm_struct进程地址空间(PCB中储存了该进程对应的进程地址空间的地址),也就是每个进程都认为自己独占内存资源 对于进程来说,进程控制块以及进程地址空间以及相应的资源...PCB找到对应的进程地址空间,再由进程地址空间上的虚拟地址由页表找到物理空间上分配的数据 示图: 对于父子进程变量地址相同数据不同: 父进程创建子进程时,子进程以父进程为模板构建进程,代码数据父子共享
,输出地址是一致的,但是变量内容不一样!...能得出如下结论: 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量 但地址值是一样的,说明,该地址绝对不是物理地址!...在Linux地址下,这种地址叫做 虚拟地址 我们在用C/C++语言所看到的地址,全部都是虚拟地址!...物理地址,用户一概看不到,由OS统一管理 OS必须负责将 虚拟地址 转化成 物理地址 2.3 进程地址空间 所以之前说‘程序的地址空间’是不准确的,准确的应该说成 进程地址空间 说明: 上面的图就足矣说名问题...,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!
在 Linux 系统中,每一个进程都在自己独立的地址空间中运行,在 32 位系统中,每个进程的逻辑地址空间均为 4GB,这 4GB 的内存空间按照 3:1 的比例进行分配,其中用户进程享有 3G 的空间...⚫ 进程地址空间不隔离。...所有应用程序运行在自己的虚拟地址空间中,使得进程的虚拟地址空间和物理地址空间隔离开来,这样做带来了很多的优点: ⚫ 进程与进程、进程与内核相互隔离。...一个进程不能读取或修改另一个进程或内核的内存数据,这是因为每一个进程的虚拟地址空间映射到了不同的物理地址空间。提高了系统的安全性与稳定性。 ⚫ 在某些应用场合下,两个或者更多进程能够共享内存。...因为每个进程都有自己的映射表,可以让不同进程的虚拟地址空间映射到相同的物理地址空间中。通常,共享内存可用于实现进程间通信。 ⚫ 便于实现内存保护机制。
在IDEA里修改了内存数据之后,会发现打不开IDEA。
进程的地址空间 1、直接代码展示的现象 其中当父子进程之间的g_val改变之后,为什么即使是不同的值了之后,两个进程中的g_val的地址还是一样的?...同时此次介绍的将是进程中的另一部分,地址空间。 地址空间能够被进程中的指针找到,在32位的操作系统之下,地址空间通常都是4GB的。...其实首先对于子进程来说,由于会继承父进程的数据和代码,所以说子进程在开始的时候是直接浅拷贝父进程中所有的内容,地址空间,虚拟地址以及页表,但是如果直接按照页表来说找到对应的数据的话,并且修改成功,那么这次的修改就会被父进程看到...所以操作系统中,创建一个进程,不仅仅是创建一个进程的PCB,对于很多的地址空间,OS也要进行管理,那应该如何管理众多进程的地址空间呢?先描述,再组织。地址空间的本质就是内核中的一个结构体对象。...3、为什么要有地址空间? 3、解释: 为什么要对每一个进程构建一个地址空间呢?我们为什么不直接通过进程的task_struct中直接记录下我们存放在物理内存中的地址呢?
虚拟地址空间 2.1 感性理解虚拟地址空间 2.2 如何“画饼” 2.3 地址空间的区域划分 3. 进程地址空间与内存的关系 3.1 虚拟地址和物理地址 3.2 多进程的映射关系 4....进程地址空间与内存的关系 3.1 虚拟地址和物理地址 1. 虚拟地址的排布 通过上述的描述,我们已经知道,我们所编写的代码的位置都是在进程地址空间上,也就是虚拟的地址。...global_val,于是global的内存中的地址就会通过页表映射到虚拟空间的某一个地址中,于是父进程和子进程就可以通过虚拟空间中的地址去访问global,并且打印时父进程和子进程对应的global对应的虚拟地址也是相同的...这样子进程改变global_val的值也不会影响到父进程的global_val,这个操作与虚拟地址也没有任何关系。因此我们所看到的子进程与父进程的虚拟地址仍是相同的地址。...那么,当这段代码通过页表的映射加载到进程的mm_struct(虚拟地址)时,这段代码就被存放在这个进程对应的进程地址空间中,这个过程就是物理地址通过映射传输的,也就是说物理地址此时扮演的只是交通工具的作用
领取专属 10元无门槛券
手把手带您无忧上云