linux中让子进程执行和父进程不同功能的两种常用方法

linux中让子进程执行和父进程不同功能的两种常用方法,第1张

运维

Linux系统进程控制

行者111111111111111

原创

关注

0点赞·3人阅读

1、进程创建

shell命令行启动程序指令皆是创建了进程,我们通常通过调用fork()函数创建子进程。

1.1、fork()函数用法简介

调用fork后, *** 作系统内核将:

分配新的内存块和内核数据结构给子进程

将父进程部分数据结构内容拷贝至子进程

添加子进程到系统进程列表当中

fork返回,开始调度器调度

1.2、fork函数返回值

子进程返回0,父进程返回的是子进程的pid

原因:fork之后进入内核,申请内存构建子进程PCB、虚拟内存、页表,将子进程设置R状态,放入调度队列,由于创建子进程之后父子进程共享代码,所以父子进程都会有return返回值。返回值返回给变量本质发生了写时拷贝,改变了子进程对应页表的指向,数据映射到了其他区域

1.3、写时拷贝

由于进程要独立,代码不可修改,数据可改,所以默认数据各有一份,但是内存是有限度的,如果把父进程数据全部再拷贝一份,那么太浪费内存,甚至导致fork失败。通常通过写时拷贝实现,就是当父或子进程修改数据时,将要修改的数据拷贝一份,让子进程页表指向新的重复数据在发生修改

Copy on write 思想:

1) redis RDB机制的优化

redis 提供了类似于 snapshot+commitlog的方式,对应叫做RDB 和aof

RDB在做快照的时候,需要考虑到性能和内存使用。

比如在时间t,redis 有1G的数据,redis 会新开一个 fork 子进程

主进程对外提供服务,由子进程拷贝数据到文件。

子进程使用了linux 的 copy on write 机制。

让主进程和子进程 共享1G的内存数据。如果没有写 *** 作,不需要额外的空间。

如果有写 *** 作,read-only的这段内存就会发生page-fault, 子进程处理这个异常,只拷贝对应的数据

做到一个按需拷贝的机制,大大节省内存。

2) 在java中也有一个 copy-on-write 的 集合 CopyOnWriteArrayList

这是一种多线程优化技术,读的时候不加锁。

写的时候,加锁拷贝一份数据集,修改内容;但是同时开放读 *** 作。对于一些读多写少的数据,这种做法的确很不错。

缺点是,拷贝期间读取老数据,拷贝的是整个数据集,如果数据集比较大,会占用额外内存,可能触发GC。

相比而言,linux底层实现的copy on write 机制则是优秀的多,因为只需要拷贝 page-fault的那一页。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8713951.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存