进程表结构以及malloc和mmap的区别

一、进程表的结构:
进程表逻辑结构分为四个部分,逻辑地址从低到高依次是Text段(代码段)、Data段(数据段)、空闲空间、Stack段(栈空间)。
1)Text段:包含了进程的执行代码以及许多编译信息;
2)Data段:包含了进程中的变量,堆在此段内,有预先分配的大小,可以存放进程运行过程中的变量;
3)空闲空间:可存储某些静态/全局变量,也可被作为堆和栈的拓展空间使用,mmap()作用后得到的文件映射也存放在此空间中;
4)Stack段:存放数据,可作为进程之间的共享空间。

二、进程表的变化:
1)fork()和exec()
调用fork()时,产生的子进程是复制的进程表(PCB表),但是PID(进程号:区别进程的根本标志)不同;
而exec()则是改变进程的进程地址空间(虚拟的),它的PID保持原来的PID,即exec()前后是同一个进程(PID未改变),可以说,exec()实现了让一个进程执行多个可执行文件。

==>补充:正是由于fork的特性,派生出了COW策略(copy-on-write),通俗的说就是延后fork的复制工作。原理就是:先不复制父进程的PCB表的内容,但将内存的权限修改为只读(对父进程和子进程都一样),这样,当子进程和父进程未进行修改操作时,节约了cpu复制PCB表的时间,提高了工作效率;当父进程或者子进程尝试修改内存中的数据时,由于权限错误,产生exception,陷入内核,进行相应的系统调用改回权限并完成PCB表的复制。

2)malloc()和mmap()
调用malloc()时,是在PCB表结构中的堆中申请空间,若申请空间失败,即超过给定的堆最大空间时,将会调用brk()系统调用,将堆空间向未使用的区域扩展,brk()之后新增的堆空间不会自动清除,需使用相应的系统调用来清除;
调用mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值