目录
一、printf输出问题
二、复制进程fork
2.1进程
2.2 pid_t fork(void);
注意:
2.3逻辑地址和物理地址
2.4写时拷贝技术
一、printf输出问题
会出现很长时间后系统打印出hello字符
解决:
1.在hello后面+\n,可以起到强制刷新的作用
2.加上fflush(stdout),强制刷新
二、复制进程fork
2.1进程
进程是一个正在运行的程序;
每个进程都有一个进程控制块,PCB
进程控制块是一个用结构体struct task_struct 实现的
2.2 pid_t fork(void);
getpid()获取当前进程的pid
getppid()获取当前进程的父进程
在第10行代码执行后,分成子进程和父进程,两个同时进行
注意:
程序在运行到fork完,将父进程复制一份成为子进程,整个空间都复制了
2.3逻辑地址和物理地址
当我们把n的值和地址打印后会发现一个很神奇的东西
运行结果:
不同的n打印的地址是相同的!!!
地址:偏移量
父进程的1和子进程的4都是0号逻辑页但是他们物理页不同
举个栗子:
操场排队,你在第三排的第三个位置,这个时候你实际所在位置是操场的东南角的A区,第二天的时候,你在操场的西北角B区,但是你还在你们队伍的第三排第三个位置,
这里的第三排第三个位置是逻辑地址,而操场实际位置就是你的物理地址。每次物理地址不同但是你的逻辑地址一般是不变的。
这时这个n我们就能解释了,他两的偏移量是一样的所以逻辑地址是一样的,都是0x7fff21153c44
但是他两所处空间不同,一个在父进程页面,一个在子进程页面,物理地址不同
2.4写时拷贝技术
写时拷贝:父进程和子进程是同一个逻辑地址,但不是同一个物理地址 一般子进程的pid号是父进程的pid+1
父进程和子进程刚开始是公用同一个物理地址的,但当页内容发生改变时,才会将父进程的内容复制一份给子进程,改变的页表信息独立一个物理地址,页表其余没变的页表信息和父进程一样
当父子进程有一点不同则就需要复制,但是内容一样时,系统为了优化,节省空间,就不需要拷贝了,进而大大提升效率。