美文网首页
fork 进程测试 copy-on-write

fork 进程测试 copy-on-write

作者: wenfh2020 | 来源:发表于2020-01-02 10:35 被阅读0次

父进程 fork 子进程后,子进程通过 copy-on-write 模式获得父进程内存,也就是子进程共用了大部分父进程内存,只有当子进程在修改自己进程内存后,共享部分,才会把那些修改的拷贝出来,这样可以节省系统大量内存分配。


系统

macos


测试

测试对象申请一块内存,主进程 fork 子进程后监测子进程对内存数据修改前后状况。

子进程数据修改前 子进程数据修改后

测试进程跑得比较快,两次抓图的进程不一样。感兴趣的朋友可以拿源码测试下。


测试源码

源码

alloc_data g_data;

int main() {
    pid_t pid = fork();
    if (0 == pid) {
        printf("child pid: %d, data ptr: %#lx\n", getpid(),
               (unsigned long)&g_data);
        sleep(5);  // update data before
        printf("child pid: %d, reset data:\n", getpid());
        g_data.reset();
        sleep(5);  // update data later
        exit(0);
    } else if (pid > 0) {
        printf("parent pid: %d, data ptr: %#lx\n", getpid(),
               (unsigned long)&g_data);
    } else {
        printf("fork fail\n");
        exit(1);
    }

    printf("parent end, pid: %d\n", getpid());
    return 0;
}

测试结果

alloc, data ptr: 0x602140, array ptr: 0x602148
parent pid: 29118, data ptr: 0x602140
child pid: 29126, data ptr: 0x602140
child pid: 29126, reset data:
reset data, data ptr: 0x602140, array ptr: 0x602148
delete data, pid: 29126
child 29126 terminated normally with exit status = 0
sig_child_handler end, errno: 0
parent end, pid: 29118
delete data, pid: 29118
  1. 子进程拷贝父进程的数据,数据地址(虚拟地址)是一样的。
  2. 父进程 alloc 了一次数据,delete 了两次数据,子进程只是拷贝了父进程数据,没有跑父进程 fork 前的代码逻辑。
    3.子进程有自己的独立空间, 子进程修改数据后,copy-on-write,子进程空间将分配新的数据空间存储新数据(top 查看进程负载情况)。

参考

  • 《深入理解计算机系统》第二部分,8.4 章 进程控制

相关文章

  • fork 进程测试 copy-on-write

    父进程 fork 子进程后,子进程通过 copy-on-write 模式获得父进程内存,也就是子进程共用了大部分父...

  • Redis持久化常见问题

    Fork操作 定义:调用fork函数给当前正在运行的进程创建一个子进程。根据copy-on-write(写时复制)...

  • 技术思想

    惰性删除 (redis过期删除) copy-on-write:redis rdb的时候,fork子进程bgsave...

  • 02Python学习笔记之二.七【多任务、fork、getp(p

    第1章节  多任务概念理解    第2章节  fork创建子进程 1-1 fork创建子进程—简单测试   ↑用v...

  • 系统编程--进程函数

    一、fork() 拷贝父进程,子进程的fork不执行,返回0,执行fork之后的所有代码父进程的fork返回子进程...

  • Android系统启动

    所有的进程都是init进程的子进程或孙进程。是init进程fork出子进程 fork:fork函数UNIX及类UN...

  • fork()系统调用

    fork() 函数简介 fork系统调用用于创建一个新进程,称为子进程,它与进行fork()调用的进程(父进程)并...

  • python多进程学习笔记

    fork方式创建进程 简单的fork 主进程fork时返回值大于0,子进程fork时返回值等于0 os.getpi...

  • 进程相关fork()/exec()/wait()

    fork() fork()将父进程复制一份子进程, 在子进程中从fork()调用处继续执行, 之后的代码在父子进程...

  • Android Zygote进程和app进程fork过程分析2

    进程fork的一些知识 在分析app进程fork时,先来简单普及进程fork相关的一些知识,后面会用到fork子进...

网友评论

      本文标题:fork 进程测试 copy-on-write

      本文链接:https://www.haomeiwen.com/subject/vuenoctx.html