Wordpress官网网址,怎么做网站关键词优化,电商关键字优化,网站全背景做多大目录
一、虚拟地址
二、进程地址空间 一、虚拟地址 父进程和子进程之间#xff0c;代码共享#xff0c;而数据可能会发生修改#xff0c;所以当其中一个进程要写入数据时#xff0c;则发生写时拷贝#xff0c;各自私有一份。 现在有源文件内容如下所示。
int glob_val …目录
一、虚拟地址
二、进程地址空间 一、虚拟地址 父进程和子进程之间代码共享而数据可能会发生修改所以当其中一个进程要写入数据时则发生写时拷贝各自私有一份。 现在有源文件内容如下所示。
int glob_val 10;
int main()
{pid_t id fork();if(id 0){int cnt 0;while(1){printf(child : pid:%d, ppid:%d, glob_val:%d, glob_val:%p\n,getpid(),getppid(),glob_val,glob_val);sleep(1);cnt;if(cnt 5){glob_val 20;printf(child change glob_val:10-20\n);}}}else{while(1){printf(child : pid:%d, ppid:%d, glob_val:%d, glob_val:%p\n,getpid(),getppid(),glob_val,glob_val);sleep(1);}}return 0;
}预期运行结果是该程序运行五秒之内父子进程打印的全局变量的值和地址均相同五秒之后子进程修改了值则发生写时拷贝父子进程打印的全局变量的值和地址均不同。 实际运行结果
[eutoVM-4-13-centos 24926]$ ./myaddr
child : pid:10513, ppid:31055, glob_val:10, glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:10, glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10, glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:10, glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10, glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:10, glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10, glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:10, glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10, glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:10, glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10, glob_val:0x60105c
child change glob_val:10-20
child : pid:10514, ppid:10513, glob_val:20, glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10, glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:20, glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10, glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:20, glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10, glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:20, glob_val:0x60105c
child : pid:10514, ppid:10513, glob_val:20, glob_val:0x60105c
child : pid:10513, ppid:31055, glob_val:10, glob_val:0x60105c为什么五秒之后全局变量的地址是相同的。 其实这个地址是虚拟地址并不是实际的物理地址。 而虚拟地址并不止在父子进程的数据拷贝上出现在程序员这一层所见到的都是由操作系统提供的虚拟地址而非实际的物理地址。 划分分区的也是虚拟地址。 虚拟地址可以理解为逻辑地址在底层其实是有物理地址的只不过逻辑地址和物理地址之间的函数关系是由操作系统处理的。 当子进程做了写时拷贝后其实发生的变化不在虚拟地址上而是在物理地址上。 二、进程地址空间 每一个进程都存在进程地址空间。
操作系统对进程地址空间的管理 先面向对象再数据结构。 进程和进程地址空间 PCB内有一个结构体指针这个指针指向地址空间这个结构体。 区域划分 即虚拟地址空间的区域划分用代码来实现本质就是进程地址空间这个结构体的成员变量进程地址空间的结构体一定有类似下面这样的字眼。
struct 进程地址空间
{int code_start,code_end;int init_start,init_end;int heap_start,heap_end;int stack_start,stack_end;·····
}
区域划分的本质 所谓的区域划分本质就是操控特定的几个变量这些变量实现了区域划分的条件 1.可以判断是否越界。 2.可以扩大或者缩小范围。 划分好的区域在区域内的所有地址是可以被当前进程所使用的。
进程管理和内存管理是独立、互不影响的。 代码、数据本质上还是保存在物理内存上面而虚拟地址是操作系统逻辑上提供给用户的地址将逻辑地址映射为物理地址的数据结构叫做页表。 可执行程序加载到内存后进程创建PCB即task_struct、PCB又创建进程地址空间即mm_struct。 内存管理可执行程序的代码、数据都保存在物理内存中。 进程管理进程获取代码、数据是在进程地址空间即获取到的是虚拟地址。 二者之间用页表映射。
CPU完成页表的映射操作 CPU获取到虚拟地址CPU内部的寄存器CR3保存着页表的起始地址CPU内部有一个部件MMUmemory mange unit将虚拟地址通过页表映射到物理地址。 注意CR3内部保存的页表的起始地址一定是物理地址。 进程地址空间和页表这种设计的意义 1.内存管理的时候代码和数据的内存块都是碎片化的处于无序的状态而进程地址空间是有序的页表将无序的物理内存转换为有序的进程地址空间进程操作内存空间会更方便。 2.内存管理和进程管理互相独立、不影响这种解耦合的做法会大大减轻设计操作系统的负担。