进程、线程、协程(操作系统相关问题)

进程、线程、协程区别

进程:是操作系统进行资源分配的最小单位
线程:是操作系统进行运算调度的最小单位 (进程是包含线程的,线程属于进程)
协程:是一种用户态的轻量级进程,他的调度是由用户控制的,他是用户视角的一种抽象,操作系统中并没有这个概念,他的主要思想是在用户态实现的调度算法,用少量线程完成大量调度。
(一个线程可以有多个协程,一个进程也可以单独有多个协程)
(进程和线程都是可以并发执行(同一时间间隔))

单进程 -->多进程(是提高了cpu利用率)
进程–>线程(降低上下文切换开销)–>协程(进一步降低上下文切换开销,使高并发的服务可以使用简单代码来实现)

区别多进程多线程
数据共享同步数据是分开的,共享复杂, 要用IPC, 同步简单多线程共享进程数据,共享简单,同步复杂
内存cpu占用内存多,切换复杂,cpu利用率低占用内存少,切换简单,cpu利用率高
创建销毁、切换创建销毁、切换复杂、速度慢创建销毁、切换简单、速度快
编程调试编程简单、调试简单编程复杂,调试复杂
可靠性进程间不会互相影响一个线程挂掉会导致整个进程挂掉
分布式适合多核、多机分布式适合多核分布式
适用场景cpu密集型(各种循环、计数)IO密集型(文件处理、网络爬虫)

进程和线程在linux中没有本质区别,最大区别是进程有自己的独立空间,但线程是共享的内存空间。

有一句话“python下想要充分利用多核cpu,就用多进程”?原因?
每个进程都有各自独立的GIL,互不干扰,(进程之间不需要使用GIL锁,因为进程是独立的,不会共享数据)这样就可以真正意义上的并行执行(同一时刻发生),所以python中,多进程的执行效率优于多线程(仅仅多核cpu),所以结论是,多核下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率。

线程和协程的区别:
1.进程和线程都是同步的,但协程是异步的。
2.协程能保留上一次调度时的状态,每次过程重入时,就相当于进入上一次调用的状态。
3.线程是抢占式的,但协程是非抢占式的, 所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运算权,相当于单线程的能力。
4.协程并不是取代线程,而是抽象与线程之上,线程是被分割的cpu资源,协程是组织好的代码流程,协程需要线程来承载运行,线程是协程的资源, 但协程不会直接使用线程,协程是直接利用的是执行器(interceptor),来间接使用线程这个资源,执行器可以关联任意线程或线程池,可以使当前线程,ui线程或者新建线程。

GIL锁

GIL全局解释锁

详细解释在这
1.GIL不是python的特点,而是Cpython解释器的特点
2.GIL锁是加在cpython解释器上的,是保证解释器级别的数据的安全,进程先获取GIL锁,然后再获取cpython解释器
3.GIL锁是互斥的,他可以阻止一个进程内多个线程同时执行
解释:就是如果没有GIL锁,有可能多线程在执行一个代码的同时,垃圾回收机制线程可能会对所执行代码的变量进行回收,导致运行报错。(python是一门解释性语言,代码是解释一行,执行一行,不清楚代码全局,而编译型语言就不会存在GIL锁,他会直接编译所有代码,就不会出现这个问题)
4、不同的数据除了 GIL 锁,还需要一把互斥锁,来保证数据处理不会错乱

在这里插入图片描述
如果我们GIL,为什么我们还需要线程锁?
GIL是防止多个线程同时运行,但不是在所有情况下,GIL在线程执行IO操作期间会临时释放,这个时候,多线程可以同时运行,这就是还需要加锁的原因

在这里插入图片描述
在这里插入图片描述
线程锁:
每当一个线程a想要访问共享数据时,必须先获得锁定,如果已经有别的线程b获得锁定了,那么就让线程a暂停,也就是同步阻塞,等线程b访问完毕,释放锁以后,再让线程a继续。锁有两种状态:被锁locked和没被锁unlocked,拥有acquire()和release()两种方法

线程锁的缺点:
阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大下降了。
由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁,导致多个线程全部挂起,既不能执行,也无法结束,靠操作系统强制终止。

Python 主要通过两种方式来创建线程
1.使用 threading 模块中 Thread 类的构造器创建线程。即直接对类 threading.Thread 进行实例化创建线程,并调用实例化对象的 start() 方法启动线程。
2.继承 threading 模块中的 Thread 类创建线程类。即用 threading.Thread 派生出一个新的子类,将新建类实例化创建线程,并调用其 start() 方法启动线程。

python中创建进程的方法
在Python中给我们提供了多个模块去创建进程,常用的有multiprocessing模块、os.fork()函数和Pool进程池,这三种方式中,os.fork只能在Linux、mac和UNIX系统使用,不可在windows中使用,而multiprocessing和pool进程池都是跨平台的
具体在这

在这里插入图片描述

1.同步、异步
同步:指一个进程在执行某个请求时,若这个请求还没执行完毕,那这个进程会一直等待下去,直到这个请求执行完,才会继续执行下面的请求。
异步:指一个进程在执行某个请求时,若这个请求还没执行完毕,进程不会等待,而是继续执行下面的请求。
同步IO和异步IO的区别就在于:数据拷贝的时候用户进程是否阻塞。等待数据准备是同步;不等待,等数据准备好通知是异步
2.阻塞、非阻塞:
这里
阻塞和非阻塞是程序在等待返回结果时的状态
阻塞:为了完成一个功能,发起一个调用,如果不具备条件的话则等待,直到具备条件则完成
非阻塞:为了完成一个功能,发起一个调用,具备条件直接输出,不具备条件直接报错返回。(立即返回)
两者区别在于:应用程序的调用是否立即返回

同步异步是相对于多任务而言,阻塞和非阻塞是对于代码执行而言

在这里插入图片描述
1.死锁?
死锁:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,他们都将无法推进下去。

死锁产生的原因?

  • 系统资源的竞争
  • 进程运行推进顺序不当

产生死锁的四个必要条件?

  1. 互斥条件
  2. 请求与保持条件
  3. 不可剥夺条件
  4. 循环等待条件

2.进程的几个状态?
执行、阻塞、等待
在这里插入图片描述
线程的几种状态?
创建、就绪、运行、阻塞和死亡
在这里插入图片描述
3.进程调度算法
如先来先服务、短作业优先、时间片轮转、优先权调度等等

在这
4.
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值