Linux7-fork、内存管理相关的概念、fork写时拷贝技术

一、fork

1、相关概念

什么是fork:
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。
上面的话通俗理解就是: fork是复制进程的函数,程序一开始就会产生一个进程,当这个进程(代码)执行到fork()时,fork就会复制一份原来的进程即就是创建一个新进程,我们称子进程,而原来的进程我们称为父进程,此时父子进程是共存的,他们一起向下执行代码。

注意的一点:就是调用fork函数之后,一定是两个进程同时执行fork函数之后的代码,而之前的代码以及由父进程执行完毕。

fork的特点:
首先明白linux中:

PID表示的进程号,是唯一的,一个PID只标识一个进程

PCB:进程控制块,进程控制块是用一个结构体struct task_struct来实现
在这里插入图片描述

————————————————
版权声明:本文为CSDN博主「Oorik」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51609435/article/details/124849719

2、fork复制进程原理:

在这里插入图片描述
fork就是将进程复制一份,PID加一(PID不能一样);

父进程的返回值是子进程的PID,子进程的返回值是0;

进程释放如果顺序不对等问题,可能出现僵死(僵尸)进程;

3、man fork (看头文件,看返回值)

在这里插入图片描述
FORK(2)----2表示系统调用;1是命令

size_t 其实就是 int ,size_t是个表示大小的整型

pid_t 是整型,只不过是表示pid的整型;

4、fork代码:

#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); 
}

fork方法调用成功后,就会有两个进程存在,调用fork的进程称为父进程,新复制的进程
称为子进程;

运行结果:
在这里插入图片描述
结果可能不同,因为是父子进程一起运行的;

5、getpid:得到当前进程的PID;

6、getppid:得到当前进程的父进程的PID;

7

在这里插入图片描述
Linux程序设计中文第4版16页;(了解);

二.内存管理相关的概念:

1、简单分页 分页 逻辑页 物理页 页表;

在这里插入图片描述

2.虚拟内存:

swap(交换)
虚拟内存提供的三个重要的能力:
1) 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动
区域,根据需要在磁盘和主存之间来回传送数据,使得能够运行比内存大的多的进
程。
2) 它为每个进程提供了一致的地址空间,从而简化了存储器管理;
3) 它保护每个进程的地址空间不被其他进程破坏 ;

三.fork写时拷贝技术(重点)

在这里插入图片描述
不采用写时拷贝技术,第一,复制开销比较大;第二,占用内存空间;
所以我们对fork复制进程的过程做了一个优化:-------写时拷贝技术;
在这里插入图片描述
引入了写时拷贝技术,就可以延迟页面的拷贝,甚至免除页面的拷贝

还有一个需要注意的地方:写时拷贝是以页为单位的,哪怕这个页中只有一个字节被修
改了,我们也需要将整个页面都复制出来一份.

在这里插入图片描述
内核设计与实现44页;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值