计算机原理---进程、线程、协程

进程

进程是相对于程序而言,程序是一堆静止的文件,而当程序运行起来以后 就是一个进程,是动态的。 操作系统会为进程分配CPU ,内存,磁盘空间等一系列资源。进程是系统资源分配的最小单位, 系统由一个个进程(程序)组成,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。

  • 文本区域存储处理器执行的代码
  • 数据区域存储变量和进程执行期间使用的动态分配的内存
  • 堆栈区域存储着活动过程调用的指令和本地变量

因此进程的创建和销毁都是相对于系统资源,是一种比较昂贵的操作
进程有三个状态:

  • 等待态:等待某个事件的完成
  • 就绪态:等待系统分配处理器以便运行
  • 运行态:占有处理器正在运行。

进程是抢占式的争夺CPU运行自身,而CPU单核的情况下同一时间只能执行一个进程的代码,但是多进程的实现则是通过CPU飞快的切换不同进程轮询实现,因此使得看上去就像是多个进程在同时进行.(并发,而非并行)

通信问题: 由于进程间是隔离的,各自拥有自己的内存内存资源, 因此相对于线程比较安全, 所以不同进程之间的数据只能通过 IPC(Inter-Process Communication) 进行通信共享,进程通过消息队列,共享内存等机制实现进程间通信。

线程
  • 线程属于进程
  • 线程共享进程的内存地址空间
  • 线程是CPU调度的最小单位
  • 由于默认进程内只有一个线程,所以多核CPU处理多进程就像是一个进程一个核心

线程几乎不占有系统资源,通信问题: 进程相当于一个容器,而线程而是运行在容器里面的,因此对于容器内的东西,线程是共同享有的,因此线程间的通信可以直接通过全局变量进行通信,但是由此带来的例如多个线程读写同一个地址变量的时候则将带来不可预期的后果,因此这时候引入了各种锁的作用,例如互斥锁等。

同时多线程是不安全的,当一个线程崩溃了,会导致整个进程也崩溃了,即其他线程也挂了, 但多进程而不会,一个进程挂了,另一个进程依然照样运行。

线程和进程的上下文切换

进程切换分3步:

  1. 切换页目录以使用新的地址空间
  2. 切换内核栈
  3. 切换硬件上下文

而线程切换只需要第2、3步,因此进程的切换代价比较大

协程
  • 协程是属于线程的。协程程序是在线程里面跑的,因此协程又称微线程和纤程等,是顺序处理的,在任何给定时间只有一个协程在执行
  • 协没有线程的上下文切换消耗。协程的调度切换是用户(程序员)手动切换的,因此更加灵活,因此又叫用户空间线程.
  • 原子操作性。由于协程是用户调度的,所以不会出现执行一半的代码片段被强制中断了,因此无需原子操作锁。
协程与线程的区别

协程的上下文切换需要极小的资源,是程序本身控制的。 而线程的上下文切换需要操作系统内核调度,而且创建线程的开销是比协程大的多的。所以当线程多了以后自身调度的开销就非常大,而协程可以有成千上万个

协程的实现:迭代器和生成器

  • 迭代器: 实现了迭代接口的类,接口函数例如:current,key,next,rewind,valid。迭代器最基本的规定了对象可以通过next返回下一个值,而不是像数组,列表一样一次性返回。语言实现:在Java的foreach遍历迭代器对(数组),Python的for遍历迭代器对象(tuple,list,dist)。
  • 生成器: 使用 yield 关键字的函数,可以多次返回值,生成器实际上也算是实现了迭代器接口(协议)。即生成器也可通过next返回下一个值。

协程举例:在Python中,使用了yield的函数为生成器函数,即可以多次返回值。则生成器可以暂停一下,转而执行其他代码,再回来继续执行函数往下的代码。

并发: 需要cpu 调度,多任务是交替运行的。 有可能是模拟的并发,比如1核CPU。

并行: 需要硬件支持, 多和同时处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lipviolet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值