一.复制进程 fork

pcb穿起来会形成一个链表,整个进程中的运行数,则看有几个pcb,(链表有多少个结点)
pcb可当做一个结构体,名字为struct task_struct,
有多少进程,就有多少结点
3.父进程的返回值为它的id号,子进程则为0
4.
fork复制之后,子进程从fork之后的语句开始进行,子进程的fork不会再执行、
父子进程并发进行(同时进行),两者互不影响
5.例题1
1). i=0, 进入for循环,进入fork ,复制两个进程,父进程打印一个A,子进程打印一个A,i=1时,父进程进入for循环,复制完父进程再打印一个A,复制的子进程打印一个A,子进程同样。
2). 四个进程,,6个A
例题2
没有\n后,执行后,A没有打出去,还在进程中,再次执行时,整体复制给子进程,子进程中也有一个A,往下执行时,还没有打出A,A存放在缓冲区,子进程中也在存放一个A,另一个子进程方法同。
6.
此时为逻辑地址,不是物理地址
7.
fork复制之后的子进程是从fork之后开始执行的,把内存空间复制一份,代码从fork后执行,但fork前的值仍与父进程相同。
8.0到4G地址空间
9.写时拷贝:在发生修改的时候,才会将父进程的内容复制给子进程,没发生修改的不复制,
写时拷贝使fork复制的更少,fork效率提高
在fork时候,原本需要将所有父进程复制给子进程,现在是将父子没有进行修改的页面先进共享,等到父和子要进行修改的时候在进行复制,
10.
程序进行编译之后,逻辑地址已经有了,用nm去观察,运行之后地址仍是原来的地址,所以这为逻辑地址, a,b的位置发生变化,是故意的,在栈区,每运行一下,走一位,为了安全