Linux——fork复制(将死进程)、内存管理(虚拟内存)、写时拷贝技术

目录

一、fork复制

1、进程原理

2、 僵死进程

3、代码演示

 二、内存管理

1、分页

2、虚拟内存

3、虚拟内存提供的三个重要的能力

三、fork写时拷贝技术

1、定义

2、引入 

3、缺点

一、fork复制

1、进程原理

  •  fork()函数的功能就是复制当前进程,在内核进程表中创建一个新的进程表,当前进程称为子进程,被复制的进程称为父进程。

  注意:子进程的代码和父进程的完全相同,同时它还会复制父进程的数据(堆数据、栈数据和静态数据)。数据的复制采用的是写时复制。创建子进程后,父进程打开的文件描述符默认在子进程中也是打开的,且文件描述符的引用计数加1。

Linux——fork复制(将死进程)、内存管理(虚拟内存)、写时拷贝技术_第1张图片

2、 僵死进程

(1)僵死进程产生的原因或者条件: 当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程 ;

(2)演示僵死进程: ./main & ps(子进程结束而父进程未结束的时候才有僵死进程)。

Linux——fork复制(将死进程)、内存管理(虚拟内存)、写时拷贝技术_第2张图片

(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,子进程的返回值为0fork调用失败返回-1。

 Linux——fork复制(将死进程)、内存管理(虚拟内存)、写时拷贝技术_第3张图片 

3、代码演示:

#include
#include
#include
#include
#include

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

 二、内存管理

1、分页

简单分页 分页 逻辑页 物理页 页表

Linux——fork复制(将死进程)、内存管理(虚拟内存)、写时拷贝技术_第4张图片

2、虚拟内存

是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

swap(交换):实现进程切换

3、虚拟内存提供的三个重要的能力:

①它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,根据需要在磁盘和主存之间来回传送数据,使得能够运行比内存大的多的进程。

②它为每个进程提供了一致的地址空间,从而简化了存储器管理;

③ 它保护每个进程的地址空间不被其他进程破坏 ;

三、fork写时拷贝技术

1、定义

Linux——fork复制(将死进程)、内存管理(虚拟内存)、写时拷贝技术_第5张图片

2、引入 

fork复制进程的过程做了一个优化——写时拷贝技术

引入了写时拷贝技术,就可以延迟页面的拷贝,甚至免除页面的拷贝 还有一个需要注意的地方:写时拷贝是以页为单位的,哪怕这个页中只有一个字节被修 改了,我们也需要将整个页面都复制出来一份。

3、缺点

①复制开销比较大

②占用内存空间

如有错误,敬请指正。

您的收藏与点赞都是对我最大的鼓励和支持!

你可能感兴趣的:(Linux,linux,运维,服务器,c#)