进程用fork()或者vfork()生成(vfork是专门为了加载其他程序的子程序而优化的,随着fork()的优化,vfork已经被优化)

fork()生成的子进程与父进程共享代码区内存,对于其他内存

fork()之后常常伴随着 exec(), 这会用新程序替换进程的代码段,并重新初始化其 数据段、堆段和栈段。大部分现代 UNIX 实现(包括 Linux)采用两种技术来避免这种浪费。

1. 内核(Kernel)将每一进程的代码段标记为只读,从而使进程无法修改自身代码。这 样,父、子进程可共享同一代码段。系统调用 fork()在为子进程创建代码段时,其所 构建的一系列进程级页表项(page-table entries)均指向与父进程相同的物理内存页帧。

2.对于父进程数据段、堆段和栈段中的各页,内核采用写时复制(copy-on-write)技术 来处理。([Bach, 1986]和[Bovert & Cersati, 2005]描述了写时复制的实现。)最初,内核 做了一些设置,令这些段的页表项指向与父进程相同的物理内存页,并将这些页面自 身标记为只读。调用 fork()之后,内核会捕获所有父进程或子进程针对这些页面的修 改企图,并为将要修改的(about-to-be-modified)页面创建拷贝。系统将新的页面拷 贝分配给遭内核捕获的进程,还会对子进程的相应页表项做适当调整。从这一刻起,父、子进程可以分别修改各自的页拷贝,不再相互影响。图 24-3 展示了写时复制技术。

类似于 fork(),vfork()可以为调用进程创建一个新的子进程。然而,vfork()是为子进程立 即执行 exec()的程序而专门设计的。

vfork()因为如下两个特性而更具效率,这也是其与 fork()的区别所在。

1. 无需为子进程复制虚拟内存页或页表。相反,子进程共享父进程的内存,直至其成功 执行了 exec()或是调用_exit()退出。

2. 在子进程调用 exec()或_exit()之前,将暂停执行父进程。 这两点还另有深意:由于子进程使用父进程的内存,因此子进程对数据段、堆或栈的任 何改变将在父进程恢复执行时为其所见。此外,如果子进程在 vfork()与后续的 exec()或_exit() 之间执行了函数返回,这同样会影响到父进程。

vfork()的语义在于执行该调用后,系统将保证子进程先于父进程获得调度以使用 CPU。

线程:

类似于 fork()和 vfork(),Linux 特有的系统调用 clone()也能创建一个新进程。与前两者不 同的是,后者在进程创建期间对步骤的控制更为精准。clone()主要用于线程库的实现。由于 clone()有损于程序的可移植性,故而应避免在应用程序中直接使用。

大体上说来,fork()相当于仅设置 flags 为 SIGCHLD 的 clone()调用,而 vfork()则对应于设 置如下 flags 的 clone():

CLONE_VM | CLONE_VFORK | SIGCHLD

linux下进程和线程的区别和联系的更多相关文章

  1. Linux下进程与线程的区别及查询方法

    在平时工作中,经常会听到应用程序的进程和线程的概念,那么它们两个之间究竟有什么关系或不同呢?一.深入理解进程和线程的区别 1)两者概念 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进 ...

  2. [转] linux 下 进程和线程的区别

    1.进程与线程 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是C ...

  3. [进程管理]linux 下 进程和线程的区别(baidu 面试)

    进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是CPU调度和分派的 ...

  4. linux 下 进程和线程的区别

    1.进程与线程 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是C ...

  5. Linux下进程与线程的区别

    https://www.cnblogs.com/fah936861121/articles/8043187.html https://my.oschina.net/cnyinlinux/blog/36 ...

  6. linux查看进程的线程数

    top -H -p $PID  #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...

  7. Linux进程与线程的区别

    进程与线程的区别,早已经成为了经典问题.自线程概念诞生起,关于这个问题的讨论就没有停止过.无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.一般程序员而言,搞清楚二者的概念, ...

  8. Linux中进程与线程的概念以及区别

    linux进程与线程的区别,早已成为IT界经常讨论但热度不减的话题.无论你是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.对于一般的程序员,搞清楚二者的概念并在工作中学会运用是 ...

  9. 【Linux】程序、进程和线程的区别

    程序.进程和线程的区别 程序是一组指令及参数的集合,指令按照既定的逻辑控制计算机运行.进程则是运行着的程序,是操作系统执行的基本单位.线程则是为了节省资源而可以在同一个进程中共享资源的一个执行单位. ...

  10. linux下进程的最大线程数、进程最大数、进程打开的文件数

    linux下进程的最大线程数.进程最大数.进程打开的文件数   ===========最大线程数============== linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_TH ...

随机推荐

  1. day14-异常处理

    异常处理 1.基本介绍 SpringMVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler映射.数据绑定以及目标方法执行时发生的异常 有两种方案来进行异常 ...

  2. FTP客户端c代码功能实现

    现在市面上有很多免费的FTP软件:如FileZilla ,那如果想自己在代码中实现与ftp服务器的上传下载文件该如何实现那? 本质上ftp协议就是TCP基础上建立的一种协议,具体如下. FTP 概述 ...

  3. vue2和vue3区别

    1. vue2和vue3双向数据绑定原理发生了改变 vue2的双向数据绑定是利用了es5 的一个API Object.definepropert() 对数据进行劫持 结合发布订阅模式来实现的.vue3 ...

  4. ubuntu 启动脚本变化

    ubuntu-16.10 开始不再使用initd管理系统,改用systemd- 快速看了 systemd 的使用方法,发现改动有点大, 包括用 systemctl 命令来替换了 service 和 c ...

  5. PHP实现QQ第三方登录代码

    前言: PHP实现QQ快速登录,罗列了三种方法 方法一:面向过程,回调地址和首次触发登录写到了一个方法页面[因为有了if做判断], 方法二,三:面向对象 1.先调用登录方法,向腾讯发送请求,2.腾讯携 ...

  6. Day 13 13.2 requests之请求参数与请求体

    请求参数与请求体参数 一.什么是params参数(请求参数) get 方法是可以向服务器发送信息的,除了可以请求需要的页面之外,也可以发送我们指定的内容,这就是通过 params 参数实现的 requ ...

  7. neo4j与jdk版本【转】

    根据官网的介绍,目前应该是只有这三个版本相当于主流. Version3.5 使用java1.8 Version4.0+ 官方人员说了目前只支持JDK11 Neo4j Desktop 桌面版本的已经包括 ...

  8. ASP.NET Core MVC中调用Json()时默认使用Newtonsoft.Json返回数据

    1.需要安装两个包 Newtonsoft.Json Microsoft.AspNetCore.Mvc.NewtonsoftJson 2. Startup 类中的 ConfigureServices 方 ...

  9. loader的原理

    loader的基本原理 帮助浏览器将不同类型的文件资源转化为浏览器可识别的资源 分类 前置loader: pre 普通loader: normal 内联loader': inline 后置loader ...

  10. echarts饼图同时展示数量和百分比

    要在ECharts中同时展示饼图数据的数量和百分比,可以使用ECharts中的formatter功能.下面是一个简单的示例,演示如何在饼图中显示数量和百分比: option = { tooltip: ...