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

1. 程序和进程

C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。应用程序的运行状态称为进程。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的资源管理实体。可以从以下几个方面进行区别:

  • 进程是动态的,而程序是静态的。

  • 进程有一定的生命周期,而程序是指令的集合,本身无"运动"的含义。

  • 一个进程只能对应一个程序,一个程序可以对应多个进程。进程和程序的关系就像戏剧和剧本之间的关系。

2. 进程

进程是指程序执行时的一个实例,由代码、数据、系统资源和环境组成。每个运行的程序就是一个进程。

  • 进程是操作系统进行资源分配的基本单位,拥有完整的进程空间。

  • 进程有进程控制块PCB,PCB记录了进程上下文信息,系统通过PCB对进程进行调度。

  • 进程=程序+数据+PCB

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体,task_struct是Linux内核的一种数据结构,每个进程都把它的信息放在 task_struct 这个数据结构里,task_struct 包含了以下内容:

1).标示符 : 描述本进程的唯一标示符,用来区别其他进程。

2).状态 :任务状态,退出代码,退出信号等。

3).优先级 :相对于其他进程的优先级。

4).程序计数器:程序中即将被执行的下一条指令的地址。

5).内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

6).硬件上下文数据:进程执行时处理器的寄存器中的数据。

7).IO状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

8).记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

9).文件:描述符等

每个进程都有自己独立的 mm_struct 结构(虚拟地址空间),各个进程都在自己的地址空间中活动,互不干扰。 mm_struct是对进程的地址空间(虚拟内存)的描述,包括:代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆),堆栈。

3. 线程

进程中的一个执行路径就叫做线程。

  • 线程是进程的一部分,如果没有进行显示的线程分配,可以认为进程是单线程的;如果进程中建立了线程,则可认为系统是多线程的。

  • 程序执行的最小单位,系统分配处理器时间资源的基本单元,内核的调度对象是线程。

  • 线程自己只拥有少量系统资源:程序计数器、一组寄存器、栈。

Linux实现线程的机制非常独特。从内核的角度说,他并没有线程这个概念。Linux把所有的线程都当做进程来实现。内核并没有准备特殊的调度算法或者是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯一隶属于自己的 task_struct ,所以在内核中,它看起来像是一个普通的进程(只是它和其他一些进程共享某些资源,如地址空间),只是它并没有自己独立的内存地址空间。

在linux中,实际上线程和进程使用的是同一个结构体 task_struct,在 linux 眼里,不会区分进程和线程,内核在进程任务调度时,仅仅是根据调度算法选择一个 task_struct,至于这个task_struct,到底是进程、还是线程,内核并不关心。

当创建一个线程时,创建一个 task_struct结构体,但是这个 task_struct 共享进程的虚拟内存 (也就是 task_struct 结构中的 mm_sruct mm字段)。

什么情况下使用线程:

1)需要频繁创建销毁的优先使用线程,因为对进程来说创建和销毁一个进程代价很大

2)线程的切换速度快,所以在需要大量计算,切换频繁时用线程,耗时的操作使用线程可提高应用程序的响应

3)因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程

4)并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求

5)需要更稳定安全时,适合选择进程;需要速度时,选择线程更好

4. 区别

  • 因为进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高,但是正由于进程之间独立的特点,使得进程安全性比较高,也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。一个线程死掉就等于整个进程死掉。

  • 体现在通信机制上面,正因为进程之间相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。

  • 体现在CPU系统上面,线程使得CPU系统更加有效,因为操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。

  • 进程——资源分配的最小单位,线程——程序执行的最小单位。

  • 进程的创建和撤消的开销要远大于线程创建和撤消的开销

  • 进程间切换时,当前进程的CPU环境要保存,新进程的CPU环境要设置,线程间切换时只须保存和设置少量寄存器,并不涉及存储管理方面的操作,可见,进程切换的开销远大于线程切换的开销。

5. 关系

  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。

  • 资源分配给进程,同一进程的所有线程共享该进程的虚拟地址空间资源(通过共享进程的mm_sruct)。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆)。但是每个线程拥有自己的栈段,用来存放所有局部变量和临时变量。

  • 处理器分给线程,即真正在处理器上运行的是线程。

Linux进程和线程相关推荐

  1. Linux进程与线程的区别 详细总结(面试经验总结)

    首先,简要了解一下进程和线程.对于操作系统而言,进程是核心之核心,整个现代操作系统的根本,就是以进程为单位在执行任务.系统的管理架构也是基于进程层面的.在按下电源键之后,计算机就开始了复杂的启动过程, ...

  2. Linux进程与线程的区别

    2019独角兽企业重金招聘Python工程师标准>>> Linux进程与线程的区别 cnyinlinux 本文较长,耐心阅读,必有收获! 进程与线程的区别,早已经成为了经典问题.自线 ...

  3. linux 进程和线程或线程和线程之间通过管道通信(pipe)

    linux 进程和线程或线程和线程之间通过管道通信(pipe) 转自:http://blog.csdn.net/robertkun/article/details/8095331 线程间通信: [cp ...

  4. (大集合)Linux进程和线程的基本编程、通讯和例程【杂记】

    Linux 进程 和 线程 的基本 编程.通讯 和 例程 注:[杂记]系列为日常网搜资料的堆砌而积累成之.如有错误恭谢指出.标识为"原创"其实不完全是,只是多引用再整理和加上自己的 ...

  5. 【Linux进程、线程、任务调度】三 CPU/IO消耗型进程 吞吐率/响应 SCHED_FIFO算法与SCHED_RR算法 SCHED_NORMAL算法和CFS算法 nice与renic chrt

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

  6. 一文搞定Linux进程和线程(详细图解)

    Linux 进程和线程 本篇文章我们就深入理解一下 Linux 内核来理解 Linux 的基本概念之进程和线程.系统调用是操作系统本身的接口,它对于创建进程和线程,内存分配,共享文件和 I/O 来说都 ...

  7. 吉林大学操作系统上机(实验一:Linux进程与线程通讯)

    前言 我希望找到这里的学弟学妹能基于我的内容完成的更好,这里的代码和思路应该是你们的下限!! 我分享这些笔记的初衷是因为我觉得csdn上与之相关的不少博客都收费,但是我当时做的时候,我觉得就那么一点东 ...

  8. 【Linux进程、线程、任务调度】二 fork/vfork与写时拷贝 线程的本质 托孤 进程睡眠和等待队列

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

  9. Linux -- 进程或线程独占CPU

    如果想让特定进程或线程独占某一或某些CPU,我们需要做三件事. 一,隔离CPU,避免其它线程run在被隔离的CPU上. 二,绑定所有的interrupts到非隔离的CPU上,避免被隔离的CPU收到in ...

最新文章

  1. android加固多渠道,Android 多渠道打包(使用友盟统计,结合360加固宝进行多渠道打包)...
  2. Android--实现自制录音/播放录音程序
  3. 离线安装ADT和sdk
  4. java9新特性 2017_Java 9 ← 2017,2019 → Java 13 ,来看看Java两年来的变化
  5. moss2010 sharepoint 2010配置人员搜索
  6. 浅析Entity Framework Core中的并发处理
  7. NAT(NAPT)地址转换过程
  8. Dubbo消费者服务的订阅
  9. oracle导入导出还原,Oracle 备份 还原 数据库 导入导出
  10. GIS之旅——大学本科总结
  11. 汉化pycharm,中文
  12. 条码打印软件如何在二维码中间添加logo图片
  13. SAP ABAP开发视频学习(视频教程)
  14. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\x94
  15. 【WSN定位】基于matlab灰狼算法优化无线传感器非测距定位【含Matlab源码 2008期】
  16. 微信小程序:点击图片进行预览
  17. 74HC595级联电路篇(二)
  18. Flak 自定义URL转换器
  19. 格签名相似概念区分: SVP、SIS、LWE的区分
  20. 学生HTML个人网页作业作品----(画家企业8页)

热门文章

  1. Servlet和模本办法
  2. python 多线程笔记(6)-- 闭包
  3. 【独家:震惊!——西城区所有学区优质度透解与大排名,泄密了!】
  4. js事件冒泡和事件委托
  5. 关于多网络时钟的讨论
  6. 用我对HTML的点点理解来做个简单的百度首页
  7. HTML DOCTYPE 标签 -- DTDs 文档类型声明
  8. 使用XML管理模版資源
  9. nginx在linux自动启动脚本,nginx的自动启动脚本
  10. php ftp是什麽,FTP是什么