一、第二次课大纲
1.fork、vfork、clone
2.写时拷贝技术
3.Linux线程的实现本质
4.进程0和进程1
5.进程的睡眠和等待队列
6.孤儿进程的托孤,SUBREAPER
1.fork、vfork、Copy-on-Write例子
2.life-period例子,实验体会托孤
3.pthread_create例子,strace它
4.彻底看懂等待队列的案例
二、fork
1)fork创建一个进程。p1是一个task_struct,p2也是一个task_struct,调度器只通过task_struct来调度进程。在p1中fork后新进程p2,直接完全对拷给p2的task_struct,两者完全一样(当然pid不同),资源一样。只要有修改就不一样了,资源分裂。比如fs,fd等。chdir函数修改cwd。
2)但是内存资源mm不好分裂。采用写时拷贝技术(COW)
例子:
1 #include <sched.h> 2 3 #include <unistd.h> 4 5 #include <stdio.h> 6 7 #include <stdlib.h> 8 9 10 11 int data = 10; 12 13 14 15 int child_process() 16 17 { 18 19 printf("Child process %d, data %d\n",getpid(),data); 20 21 data = 20; 22 23 printf("Child process %d, data %d\n",getpid(),data); 24 25 _exit(0); 26 27 } 28 29 30 31 int main(int argc, char* argv[]) 32 33 { 34 35 int pid; 36 37 pid = fork(); 38 39 40 41 if(pid==0) { 42 43 child_process(); 44 45 } 46 47 else{ 48 49 sleep(1); 50 51 printf("Parent process %d, data %d\n",getpid(), data); 52 53 exit(0); 54 55 } 56 57 }