转自: http://blog.csdn.net/guyan0319 https://blog.csdn.net/guyan0319/article/details/79411626

一、进程 
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

组成

进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

特征 
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。 
并发性:任何进程都可以同其他进程一起并发执行 
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位; 
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进 
结构特征:进程由程序、数据和进程控制块三部分组成。 
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

状态 

二、线程

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

特点

在多线程OS中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。线程具有以下属性。 
1)轻型实体 
线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。 
线程的实体包括程序、数据和TCB。线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。TCB包括以下信息: 
(1)线程状态。 
(2)当线程不运行时,被保存的现场资源。 
(3)一组执行堆栈。 
(4)存放每个线程的局部变量主存区。 
(5)访问同一个进程中的主存和其它资源。 
用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。 
2)独立调度和分派的基本单位。 
在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。 
3)可并发执行。 
在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。 
4)共享进程资源。

在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。

三、协程

协程与子例程一样,协程(coroutine)也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程源自 Simula 和 Modula-2 语言,但也有其他语言支持。 
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。 
一个程序可以包含多个协程,可以对比与一个进程包含多个线程, 
因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。 
协程和线程区别:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。

四、进程和线程的关系和区别

1、地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;因此线程可以读写同样的数据结构和变量,便于线程之间的通信。相反,进程间通信(IPC)很困难且消耗更多资源。 
2、资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源 
3、进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元 
4、二者均可并发执行. 
5、进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束 
6、线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志

五、优缺点 
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

最后送上,从网上找的材料,以图文方式将进程和线程做的很好的解释清晰易懂:

1、 
 
计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 
2、 
 
假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。 
3、 
 
进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态 
4、 
 
一个车间里,可以有很多工人。他们协同完成一个任务。 
5、 
 
线程就好比车间里的工人。一个进程可以包括多个线程。 
6、 
 
车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。 
7、 
 
可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。 
8、 
 
一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫”互斥锁”(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。 
9、 
 
还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。 
10、 
 
这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做”信号量”(Semaphore),用来保证多个线程不会互相冲突。

不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。 
11、 

操作系统的设计,因此可以归结为三点:

(1)以多进程形式,允许多个任务同时运行;

(2)以多线程形式,允许单个任务分成不同的部分运行;

(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

(完)

来源:https://www.cnblogs.com/guolei2570/p/8810536.html

进程、线程和协程的理解相关推荐

  1. Day8—进程,线程,协程

    本节内容: 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join.Daeman 线程锁之Lock\Rlock\信号量 Event事件 queue队列 生产者消费 ...

  2. 进程,线程和协程 并行与并发

    一.进程 进程的出现是为了更好的利用CPU资源使到并发成为可能. 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费.聪明的老大 ...

  3. python的进程线程和协程_python成长之路 :线程、进程和协程

    python线程 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分 ...

  4. 进程、线程、协程和管程的区别

    大家都知道,计算机是为了模拟现实世界,其中计算机领域最伟大的发明之一就是操作系统.操作系统对于计算机来说是其核心的存在,可以说操作系统的地位就像计算机的灵魂一样.操作系统的诞生是为了运行用户程序,事实 ...

  5. 线程,协程对比和Python爬虫实战说明

    此文首发于我的个人博客:线程,协程对比和Python爬虫实战说明 - zhang0peter的个人博客 这篇文章写的是我对线程和协程的理解,有错误之处欢迎指出. 举一个餐馆的例子.我们把一个餐厅当做一 ...

  6. python线程进程协程面试_Python学习经验之谈:关于协程的理解和其相关面试问题...

    都知道Python非常适合初学者学习来入门编程,昨天有伙伴留言说面试了Python岗位,问及了一个关于协程的问题,想了想还是跟大家出一篇协程相关的文章和在Python面试中可能会问及的相关面试问题.都 ...

  7. 从根上理解高性能、高并发(七):深入操作系统,一文读懂进程、线程、协程

    本文引用了"一文读懂什么是进程.线程.协程"一文的主要内容,感谢原作者的无私分享. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早 ...

  8. 进程、线程、协程?用海贼王的故事来理解它们的差异

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于Python生活志 ,作者 Python生活志 Python爬虫.数据分析.网 ...

  9. 进程、线程、协程对比

    进程.线程对比 功能 进程,能够完成多任务,比如 在一台电脑上能够同时运行多个QQ 线程,能够完成多任务,比如 一个QQ中的多个聊天窗口 定义的不同 进程是系统进行资源分配和调度的一个独立单位. 线程 ...

最新文章

  1. MySQL- SHOW TABLE STATUS命令
  2. 【计算机网络】数据链路层 : 差错控制 ( 检错编码 | 奇偶校验码 | CRC 循环冗余码 )★
  3. 小巧优美的ORM框架-doodads
  4. 倒出mysql库命令行_mysql命令行导入导出数据库
  5. 转:Chrome渲染分析之Timeline工具的使用
  6. python企业微信回调_回调模式
  7. Java二维数组谷电,java二维数组遍历的2种代码
  8. 轻芒联合创始人、CTO 范怀宇亲述《使用小程序做交互的技巧》
  9. 中文分词:正向最大匹配与逆向最大匹配
  10. linux创建表空间 没有权限,ORA-12913: 无法创建字典管理的表空间
  11. 使用运动探测器和训练有素的DNN检测害虫
  12. superforming的sql-labs大通关之第一部分(第1~10关)解析及注入方法
  13. 绕过tp路由器管理密码_无线路由器管理员密码多少 无线路由器管理员密码介绍【详解】...
  14. 全面拆解携程云原生实践,打造智能弹性的云端酒店直连系统!
  15. python高频词汇表大全_利用python统计word文档高频词汇
  16. Teamviewer检测为商业用途的解决方案
  17. API数据接口该怎么对接
  18. Android 集成友盟推送方案(1)
  19. 【leetcode】脑子打结的题
  20. 帮您解决开发SPI4W常见问题

热门文章

  1. QT的QDataStream类的使用
  2. 经典C语言程序100例之四一
  3. 众唱点歌机会显示无法连接服务器,目前众多厂商唱多的服务器附加存储缺点分析...
  4. 02_Android写xml文件和读xml文件
  5. Python基础概念_2_基础概念
  6. 4代hiv检测50元_闲置甩干机卖了50元!大爷突然想起:里面还有4根金条
  7. 使用TimeQuest时序分析器
  8. Android权限申请的学习实践
  9. 通道抠图--火焰,背景颜色统一为黑色
  10. H3C S5120-52P-WiNet交换机配置