当前位置: 首页 > news >正文

网站制作设计机构兄弟网站建设

网站制作设计机构,兄弟网站建设,海南免费发布信息平台,罗湖平台网站建设费用前言 只有光头才能变强 在读《Redis设计与实现》关于哈希表扩容的时候#xff0c;发现这么一段话#xff1a; 执行BGSAVE命令或者BGREWRITEAOF命令的过程中#xff0c;Redis需要创建当前服务器进程的子进程#xff0c;而大多数操作系统都采用写时复制#xff08;copy-on-w…前言 只有光头才能变强 在读《Redis设计与实现》关于哈希表扩容的时候发现这么一段话 执行BGSAVE命令或者BGREWRITEAOF命令的过程中Redis需要创建当前服务器进程的子进程而大多数操作系统都采用写时复制copy-on-write来优化子进程的使用效率所以在子进程存在期间服务器会提高负载因子的阈值从而避免在子进程存在期间进行哈希表扩展操作避免不必要的内存写入操作最大限度地节约内存。 触及到知识的盲区了于是就去搜了一下copy-on-write写时复制这个技术究竟是怎么样的。发现涉及的东西蛮多的也挺难读懂的。于是就写下这篇笔记来记录一下我学习copy-on-write的过程。 本文力求简单讲清copy-on-write这个知识点希望大家看完能有所收获。 一、Linux下的copy-on-write 在说明Linux下的copy-on-write机制前我们首先要知道两个函数fork()和exec()。需要注意的是exec()并不是一个特定的函数, 它是一组函数的统称, 它包括了execl()、execlp()、execv()、execle()、execve()、execvp()。 1.1简单来用用fork 首先我们来看一下fork()函数是什么鬼 fork is an operation whereby a process creates a copy of itself. fork是类Unix操作系统上创建进程的主要方法。fork用于创建子进程(等同于当前进程的副本)。 新的进程要通过老的进程复制自身得到这就是fork如果接触过Linux我们会知道Linux下init进程是所有进程的爹(相当于Java中的Object对象) Linux的进程都通过init进程或init的子进程fork(vfork)出来的。下面以例子说明一下fork吧 #include unistd.h   #include stdio.h  int main ()    {   pid_t fpid; //fpid表示fork函数返回的值  int count0;// 调用fork创建出子进程  fpidfork();// 所以下面的代码有两个进程执行if (fpid  0)   printf(创建进程失败!/n);   else if (fpid  0) {  printf(我是子进程由父进程fork出来/n);   count;  }  else {  printf(我是父进程/n);   count;  }  printf(统计结果是: %d/n,count);  return 0;   }   得到的结果输出为 我是子进程由父进程fork出来统计结果是: 1我是父进程统计结果是: 1解释一下 fork作为一个函数被调用。这个函数会有两次返回将子进程的PID返回给父进程0返回给子进程。(如果小于0则说明创建子进程失败)。再次说明当前进程调用fork()会创建一个跟当前进程完全相同的子进程(除了pid)所以子进程同样是会执行fork()之后的代码。所以说 父进程在执行if代码块的时候fpid变量的值是子进程的pid子进程在执行if代码块的时候fpid变量的值是01.2再来看看exec()函数 从上面我们已经知道了fork会创建一个子进程。子进程的是父进程的副本。 exec函数的作用就是装载一个新的程序可执行映像覆盖当前进程内存空间中的映像从而执行不同的任务。 exec系列函数在执行时会直接替换掉当前进程的地址空间。我去画张图来理解一下 参考资料 程序员必备知识——fork和exec函数详解https://blog.csdn.net/bad_good_man/article/details/49364947linux中fork函数详解原创实例讲解https://blog.csdn.net/jason314/article/details/5640969linux c语言 fork() 和 exec 函数的简介和用法https://blog.csdn.net/nvd11/article/details/8856278Linux下Fork与Exec使用https://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.htmlLinux 系统调用 —— fork()内核源码剖析https://blog.csdn.net/chen892704067/article/details/765962251.3回头来看Linux下的COW是怎么一回事 fork()会产生一个和父进程完全相同的子进程(除了pid) 如果按传统的做法会直接将父进程的数据拷贝到子进程中拷贝完之后父进程和子进程之间的数据段和堆栈是相互独立的。 但是以我们的使用经验来说往往子进程都会执行exec()来做自己想要实现的功能。 所以如果按照上面的做法的话创建子进程时复制过去的数据是没用的(因为子进程执行exec()原有的数据会被清空)既然很多时候复制给子进程的数据是无效的于是就有了Copy On Write这项技术了原理也很简单 fork创建出的子进程与父进程共享内存空间。也就是说如果子进程不对内存空间进行写入操作的话内存空间中的数据并不会复制给子进程这样创建子进程的速度就很快了(不用复制直接引用父进程的物理空间)。并且如果在fork函数返回之后子进程第一时间exec一个新的可执行映像那么也不会浪费时间和内存空间了。另外的表达方式 在fork之后exec之前两个进程用的是相同的物理空间内存区子进程的代码段、数据段、堆栈都是指向父进程的物理空间也就是说两者的虚拟空间不同但其对应的物理空间是同一个。 当父子进程中有更改相应段的行为发生时再为子进程相应的段分配物理空间。 如果不是因为exec内核会给子进程的数据段、堆栈段分配相应的物理空间至此两者有各自的进程空间互不影响而代码段继续共享父进程的物理空间两者的代码完全相同。 而如果是因为exec由于两者执行的代码不同子进程的代码段也会分配单独的物理空间。 Copy On Write技术实现原理 fork()之后kernel把父进程中所有的内存页的权限都设为read-only然后子进程的地址空间指向父进程。当父子进程都只读内存时相安无事。当其中某个进程写内存时CPU硬件检测到内存页是read-only的于是触发页异常中断page-fault陷入kernel的一个中断例程。中断例程中kernel就会把触发的异常的页复制一份于是父子进程各自持有独立的一份。 Copy On Write技术好处是什么 COW技术可减少分配和复制大量资源时带来的瞬间延时。COW技术可减少不必要的资源分配。比如fork进程时并不是所有的页面都需要复制父进程的代码段和只读数据段都不被允许修改所以无需复制。Copy On Write技术缺点是什么 如果在fork()之后父子进程都还需要继续进行写操作那么会产生大量的分页错误(页异常中断page-fault)这样就得不偿失。几句话总结Linux的Copy On Write技术 fork出的子进程共享父进程的物理空间当父子进程有内存写入操作时read-only内存页发生中断将触发的异常的内存页复制一份(其余的页还是共享父进程的)。fork出的子进程功能实现和父进程是一样的。如果有需要我们会用exec()把当前进程映像替换成新的进程文件完成自己想要实现的功能。参考资料 Linux进程基础http://www.cnblogs.com/vamei/archive/2012/09/20/2694466.htmlLinux写时拷贝技术(copy-on-write)http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html当你在 Linux 上启动一个进程时会发生什么https://zhuanlan.zhihu.com/p/33159508Linux fork()所谓的写时复制(COW)到最后还是要先复制再写吗https://www.zhihu.com/question/265400460写时拷贝copyonwrite COW技术https://blog.csdn.net/u012333003/article/details/25117457Copy-On-Write 写时复制原理https://blog.csdn.net/ppppppppp2009/article/details/22750939二、解释一下Redis的COW 基于上面的基础我们应该已经了解COW这么一项技术了。 下面我来说一下我对《Redis设计与实现》那段话的理解 Redis在持久化时如果是采用BGSAVE命令或者BGREWRITEAOF的方式那Redis会fork出一个子进程来读取数据从而写到磁盘中。总体来看Redis还是读操作比较多。如果子进程存在期间发生了大量的写操作那可能就会出现很多的分页错误(页异常中断page-fault)这样就得耗费不少性能在复制上。而在rehash阶段上写操作是无法避免的。所以Redis在fork出子进程之后将负载因子阈值提高尽量减少写操作避免不必要的内存写入操作最大限度地节约内存。参考资料 fork()后copy on write的一些特性https://zhoujianshi.github.io/articles/2017/fork()%E5%90%8Ecopy%20on%20write%E7%9A%84%E4%B8%80%E4%BA%9B%E7%89%B9%E6%80%A7/index.html写时复制https://miao1007.github.io/gitbook/java/juc/cow/三、文件系统的COW 下面来看看文件系统中的COW是啥意思 Copy-on-write在对数据进行修改的时候不会直接在原来的数据位置上进行操作而是重新找个位置修改这样的好处是一旦系统突然断电重启之后不需要做Fsck。好处就是能保证数据的完整性掉电的话容易恢复。 比如说要修改数据块A的内容先把A读出来写到B块里面去。如果这时候断电了原来A的内容还在参考资料 文件系统中的 copy-on-write 模式有什么具体的好处https://www.zhihu.com/question/19782224/answers/created新一代 Linux 文件系统 btrfs 简介:https://www.ibm.com/developerworks/cn/linux/l-cn-btrfs/最后 最后我们再来看一下写时复制的思想(摘录自维基百科) 写入时复制英语Copy-on-write简称COW是一种计算机程序设计领域的优化策略。其核心思想是如果有多个调用者callers同时请求相同资源如内存或磁盘上的数据存储他们会共同获取相同的指针指向相同的资源直到某个调用者试图修改资源的内容时系统才会真正复制一份专用副本private copy给该调用者而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的transparently。此作法主要的优点是如果调用者没有修改该资源就不会有副本private copy被建立因此多个调用者只是读取操作时可以共享同一份资源。 至少从本文我们可以总结出 Linux通过Copy On Write技术极大地减少了Fork的开销。文件系统通过Copy On Write技术一定程度上保证数据的完整性。其实在Java里边也有Copy On Write技术。 这部分留到下一篇来说敬请期待~ 如果大家有更好的理解方式或者文章有错误的地方还请大家不吝在评论区留言大家互相学习交流~~~ 参考资料 写时复制写时拷贝写时分裂Copy on writehttps://my.oschina.net/dubenju/blog/815836不会产奶的COW(Copy-On-Write)https://www.jianshu.com/p/b2fb2ee5e3a0 一个坚持原创的Java技术公众号Java3y欢迎大家关注 3y所有的原创文章 文章的目录导航(脑图海量视频资源)https://github.com/ZhongFuCheng3y/3y转载于:https://www.cnblogs.com/Java3y/p/9884583.html
http://www.zqtcl.cn/news/980827/

相关文章:

  • 南通制作网站的有哪些公司吗sae 部署wordpress
  • 友情链接对网站的影响wordpress admin init
  • 渭南网站开发做网红用哪个网站
  • 湖北建设网站wordpress 翻页电子书
  • 网站设计命名规范厦门建站比较好的公司
  • 用vs2010做网站登入前端培训费用大概多少郑州
  • 网站建设后的效果评估杭州网站制作公司
  • 3网站建设公司影楼修图用什么软件
  • 手机网站的内容模块多用户商城开源左
  • 库尔勒网站建站宝盒合作
  • 五河网站建设哪家好wordpress获取文章作者
  • 怎么修改网站内容wordpress ajax接口
  • 绵阳市城乡建设和规划局网站重庆网站建设公司有哪些
  • 宿迁网站建设公司排名展厅设计企业
  • 做家具定制的设计网站开阿里巴巴网站建设流程
  • 站长统计软件广州免费核酸在哪里做
  • 做soho一定要做网站吗在百度网站备案查询上显示未备案是什么意思
  • 移动公司营销网站设计html旅游网站模板
  • 专业生产车间设计图纸网站ui设计师证
  • 如何建网站教程视频10种网络营销方法
  • 网站内链优化的角度wordpress缓存插件破解版
  • 南宁网站建设哪个好天津网站建设咨询
  • 网站开发常用中间件计算机语言python
  • 学习html5的网站软件系统开发怎样容易
  • 做企业网站用什么华为弹性云服务器创建wordpress
  • 重庆手机网站开发网站建设的条件是什么
  • 舟山建设网站公司wordpress的总结
  • 如何做com的网站做网站设计学那个专业好
  • 中山如何建设网站如何安装wordpress模板
  • 如何搭建自己得网站树状wordpress主题