fork与vfork,exit()与_exit(),malloc与kmalloc及vmalloc,wait与waitpid

本文详细介绍了Linux中进程管理的基础知识,包括fork与vfork的区别、exit与_exit的功能差异、wait与waitpid的不同作用。此外,还深入探讨了内存分配机制,如malloc、kmalloc与vmalloc的应用场景及特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.fork与vfork

    fork介绍:

    pid_t fork(void);

    linux中fork函数用于从当前进程中创建一个新进程,函数有两个返回值,在父进程中返回子进程的pid,在子进程中返回0,出错就返回-1,fork函数创建一个子进程时,fork函数分配新的内存块和内核数据结构给子进程,把父进程部分数据结构内容拷贝入系统进程列表中,然后fork函数返回,开始调度器调度。注意,子进程完全复制父进程的资源,复制出来的子进程有自己的PCB和pid,这样的子进程独立于父进程。

    fork之后谁先执行由调度器决定,为什么我们这里看到的是父进程先执行,子进程后执行呢?因为fork创建子进程对父进程的所有资源进程复制,它的开销是很大的,所以子进程一般都执行的慢。

    由于fork创建子进程时,子进程对父进程进行复制,这样的开销比较大,所以就用了写时拷贝的机制,通常父子代码共享,父子不再写入时,数据也是共享的,即父子进程共用一份页表,当一方试图写入时,便以写时拷贝的方式拷贝一份副本。

vfork函数:

pit_t vfork(void);

vfork也是用来创建进程的,但是vfork与fork是有不同点在于

a)vfork创建的子进程,父进程和子进程共享地址空间

b)vfork保证子进程先运行,在它调用exec(exit)之后父进程才可能被运行

2.exit()与_exit()

void exit(int status);

void _exit(int status);

exit和_exit函数都用于进程终止,调用它们,清除包括PCB在内的各种进程的相关的东西,并且终止进程其区别是:exit函数在退出之前会检查文件的打开情况,把文件缓冲区的内容写回文件,清理I/O缓冲。

3.wait()与waitpid()

pid_t wait( int * status);
pid_t waitpid(pid_t pid, int* status, int options);
这个两个函数都用于等待子进程的推出,其区别是:
a)waitpid等待特定的子进程, 而wait则返回任一终止状态的子进程

b)waitpid提供了一个wait的非阻塞版本

4.malloc与kmalloc及vmalloc

1.kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存

2.kmalloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要. 而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA,在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc

3. kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值