hello~ 很高兴见到大家! 这次带来的是Linux系统中关于进程这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢? 个 人 主 页: 默|笙

1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 int g_unval;
5 int g_val = 100;
6 int main(int argc, char *argv[], char *env[])
7 {
8 const char *str = "helloworld";
9 printf("code addr: %p\n", main);
10 printf("read only string addr: %p\n", str);
11 printf("init global addr: %p\n", &g_val);
12 printf("uninit global addr: %p\n", &g_unval);
13 static int test = 10;
14 char *heap_mem = (char*)malloc(10);
15 char *heap_mem1 = (char*)malloc(10);
16 char *heap_mem2 = (char*)malloc(10);
17 char *heap_mem3 = (char*)malloc(10);
18 printf("heap addr: %p\n", heap_mem); //heap_mem(0), &heap_mem(1)
19 printf("heap addr: %p\n", heap_mem1); //heap_mem(0), &heap_mem(1)
20 printf("heap addr: %p\n", heap_mem2); //heap_mem(0), &heap_mem(1)
21 printf("heap addr: %p\n", heap_mem3); //heap_mem(0), &heap_mem(1)
22 printf("test static addr: %p\n", &test); //heap_mem(0), &heap_mem(1)
23 printf("stack addr: %p\n", &heap_mem); //heap_mem(0), &heap_mem(1)
24 printf("stack addr: %p\n", &heap_mem1); //heap_mem(0), &heap_mem(1)
25 printf("stack addr: %p\n", &heap_mem2); //heap_mem(0), &heap_mem(1)
26 printf("stack addr: %p\n", &heap_mem3); //heap_mem(0), &heap_mem(1)
27 return 0;
28 }
在我们对进程和内存有了一定了解之后,那么这个程序地址空间是指内存吗?若说它是内存,它把空间划分的这样绝对,PCB应该存储在哪里?若说它不是内存,那它究竟是什么东西?根据冯-诺依曼体系,代码和数据就是要放在内存里面的。之所以会有这样的矛盾,这是因为之前学习的东西并不完整,接下来我们来了解进程/虚拟地址空间。
//实验代码
int num = 100;
6 int main()
7 {
8 pid_t id = fork();
9 if (id == 0)
10 {
11 printf("我是一个子进程,pid:%d, ppid:%d, num = %d, &num = %p\n", getpid(), getppid(), num, &num);
12 num = 200;
13 printf("我是一个子进程,我修改了num的值, num = %d, &num = %p\n", num, &num);
14 }
15 else
16 {
17 while(1)
18 {
19 printf("我是一个父进程,pid:%d, ppid:%d, num = %d, &num = %p\n", getpid(), getppid(), num, &num);
20 sleep(1);
21 }
22 }
23 return 0;
24 }
进程/虚拟地址空间不是真正意义上的物理内存,也不是程序地址空间,但对于进程来说它就是内存,完整图如下,相对于程序地址空间它多出来命令行参数环境变量区以及内核空间。





2.而当子进程想修改某个值的时候,OS就会在物理内存里面给子进程要修改的数据分配出一块新的存储空间,并修改子进程虚拟地址所对应的物理地址,这次类似于一次深拷贝,这也就是写时拷贝。


今天的分享就到此结束啦,如果对读者朋友们有所帮助的话,可否留下宝贵的三连呢~~ 让我们共同努力, 一起走下去!