黄山市非遗网站策划书,山东住房和城乡建设厅网站一体化平台,网站修改备案号,北京装饰公司设计目录 上层用户看到的地址父进程创建子进程对代码区的同一变量修改 进程地址空间进程地址空间需要划分 页表 上层用户看到的地址
一个系统中的进程是与其他进程共享内存和CPU的。如果某个进程不小心写入另一个使用该内存的进程#xff0c;进程就可能以某种完全和程序逻辑无关的… 目录 上层用户看到的地址父进程创建子进程对代码区的同一变量修改 进程地址空间进程地址空间需要划分 页表 上层用户看到的地址
一个系统中的进程是与其他进程共享内存和CPU的。如果某个进程不小心写入另一个使用该内存的进程进程就可能以某种完全和程序逻辑无关的方式运行造成进程崩溃。
父进程创建子进程对代码区的同一变量修改 父进程创建子进程刚开始子进程要继承父进程的代码和数据没有其他的代码和数据。父进程的资源都是给子进程共享的。我们发现父子进程对同一变量num进行不一样的操作且相互不影响因为进程是相互独立的但是取地址发现他们的地址变量是一致的。着就说明了父子进程对应的全局num的取地址变量不是真实的物理地址是虚拟的地址。这是因为父进程创建子进程的时候拷贝了父进程的一个表叫进程地址空间。因为是拷贝的所以他们虚拟地址一样上层用户看到同样的地址实际上进程还要通过一个叫页表的表来映射虚拟地址和物理内存的关系一旦父子进程对数据有修改的操作操作系统会为第一个改变数据的进程在物理地址重新找到一个可以使用的物理内存改变页表的映射关系。这样进程就保证了独立性。 页表映射到物理内存是随机的。不会在意分别的规则。
进程地址空间 栈向下使用堆向上使用
上述图片不是进程的内存是保存了进程的代码和数据的地址的一张线性表从下往上增加都是地址数据。这是为了有效管理主存的一个抽象概念。当程序运行的时候程序的代码和数据在进程中其实已经被编译成为一系列的指令地址来对应代码和数据。进程地址空间有效的对物理内存进行了保护。在Linux系统的虚拟内存就是上图组织的系统为每个进程创建这样的一个虚拟内存。计算机通过虚拟内存加偏移量来寻找内存位置。
进程地址空间需要划分
进程需要被描述成一个task_struct结构体对象并以一定的数据结构来对进程进行管理进程地址空间也应该如此Linux进程地址空间其实就是进程task_struct结构体的一个对象叫mm_struct。 引用深入理解计算机系统 struct task_struct {//进程控制块//....................//....................struct mm_struct *mm, *active_mm;//....................
}
struct mm_struct {//进程地址空间struct vm_area_struct * mmap;
}
struct vm_area_struct {//进程地址空间的划分struct mm_struct * vm_mm; /* The address space we belong to. *///属于哪个进程地址空间unsigned long vm_start; /* Our start address within vm_mm. *///起始位置unsigned long vm_end; /* The first byte after our end addresswithin vm_mm. *///结束位置的第一个字节/* linked list of VM areas per task, sorted by address */struct vm_area_struct *vm_next;//链表结构组织
}vm_area_struct结构体会对进程地址进行划分如果计算机为32位进程地址空间就会有4GBvm_area_struct会对这4GB空间大小进行划分。划分是为了更好的管理内存把有序的进程地址空间通过页表映射的方式找到无序物理内存。更好的管理内存空间。更安全的使用内存。进程管理和内存管理解耦。 得出结论进程地址空间被描述为一个结构体对象是进程task_struct的一个对象然后以链表形式组织起来。
页表
页表存在于物理内存的一个页表条目数组Page Table EntryPTE页表的作用是让物理内存和虚拟地址有映射的关系。 每个进程都有自己的独立页表且页表不仅仅只是一份。虚拟内存地址和物理内存地址之间需要一个叫MMU内存管理单元的硬件进行翻译。每个页表都有一个标记为标记为位0或1如果位1表示虚拟内存有映射到物理内存的关系是否存在。一个进程有一个一级页表和可能多个的二级页表。在一个32位的计算机当中在32个bit位当中前10个bit位做为一级页表的映射关系但一级页表不映射到物理内存映射到二级页表当中10个bit位可以映射1024个二级页表然后二级页表用继续用10个bit位计算就可以映射到物理地址每个二级页表也可以映射1024个物理地址空间然后1024个二级页表一起就可以映射到1024 * 1024 个物理地址空间。在物理内存当中以4GB 的为例内存会以4KB位大小的页框来划分该物理内存。就会有1024*1024个页框。后12位的bit则表示的是偏移量。