赞
踩
目录
- fork()函数的功能就是复制当前进程,在内核进程表中创建一个新的进程表,当前进程称为子进程,被复制的进程称为父进程。
注意:子进程的代码和父进程的完全相同,同时它还会复制父进程的数据(堆数据、栈数据和静态数据)。数据的复制采用的是写时复制。创建子进程后,父进程打开的文件描述符默认在子进程中也是打开的,且文件描述符的引用计数加1。
(1)僵死进程产生的原因或者条件: 当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程 ;
(2)演示僵死进程: ./main & ps(子进程结束而父进程未结束的时候才有僵死进程)。
(3)如何处理僵死进程:
①父进程先于子进程结束 比如子进程的n改为7,父进程的n改为3; 父进程先于子进程结束,子进程就会被收养,"父进程"就会获取退出码;(调用wait);
②父进程获取退出码。
(4)其实两种处理僵死进程的方法本质都是一样的,都调用了wait,获取退出码.但是两种 方法又有区别,就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会执行。
(5)一般我们父进程调用wait是配合信号使用的,等讲到信号量再说.现在只能说明父进程 调用wait可以避免僵死进程。
(1)man-fork(看头文件/返回值)
(2)fork方法调用成功后,就会有两个进程存在,调用fork的进程称为父进程,新复制的进程 称为子进程;
(3)getpid:得到当前进程的PID;
(4)getppid:得到当前进程的父进程的PID。
注意:子进程的PID=父进程的PID+1
父进程的返回值为子进程的PID,子进程的返回值为0。fork调用失败返回-1。
![]()
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- #include<string.h>
- #include<assert.h>
-
- int main()
- {
- char *s=NULL;
- int n=0;//控制父子进程执行的次数
-
- pid_t id=fork();
- assert(id!=-1);
-
- if(id==0)//子进程
- {
- s="child";
- n=3;
- }
- else//父进程
- {
- s="parent";
- n=7;
- }
- //父 子进程一起执行
- int i=0;
- for(;i<n;i++)
- {
- printf("s=%s\n",s);
- sleep(1);
- }
- exit(0);
- }

简单分页 分页 逻辑页 物理页 页表
是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
swap(交换):实现进程切换
①它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,根据需要在磁盘和主存之间来回传送数据,使得能够运行比内存大的多的进程。
②它为每个进程提供了一致的地址空间,从而简化了存储器管理;
③ 它保护每个进程的地址空间不被其他进程破坏 ;
fork复制进程的过程做了一个优化——写时拷贝技术;
引入了写时拷贝技术,就可以延迟页面的拷贝,甚至免除页面的拷贝 还有一个需要注意的地方:写时拷贝是以页为单位的,哪怕这个页中只有一个字节被修 改了,我们也需要将整个页面都复制出来一份。
①复制开销比较大
②占用内存空间
如有错误,敬请指正。
您的收藏与点赞都是对我最大的鼓励和支持!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。