并发编程基础知识
进程
进程是操作系统最核心的概念。
程序:放在硬盘上的一堆代码。
进程:当程序被启动加载到内存之后开始执行就被称为进程。
那么什么是多道技术呢?
假设有一个工人(CPU),但是他需要处理好几件事情(进程),这时候他有两种处理方式,一种是一件事接着一件事做,这就是单道。一种是几种事情一起干,这是多道。
CPU的运行速度是很快的,当进程A遇到IO操作的时候,如果要是单道的话,就需要cpu在那等着进程A从堵塞状态恢复,然后在继续运行进程A。直到A运行结束。然后跑去运行进程B。这样等待的时间就是进程A的时间+进程B的时间。
而多道的就是当运行进程A的时候,一旦A进入IO状态,那么cpu就会趁着空闲的时间再跑去执行进行B,不让CPU多等待。这样消耗的时间就是进程AB中消耗时间最长的时间。
要点:
-
当程序遇到IO操作的时候,会被操作系统剥夺该程序CPU的执行权限。
作用:提高了CPU的利用率,且不影响程序的执行效率。
-
当程序长时间占用CPU的时候,操作系统也会剥夺该程序的CPU执行权限。
弊端:降低了程序的执行效率。
进程的调度
既然知道了多道技术,那么进程之间是怎么执行先后顺序的。
- 先来先服务调度算法。谁先运行的就先服务谁。不适合IO多的进程。
- 短作业优先调度算法。对长作业类型不利。
- 时间片轮转法。先将进程进行排队,CPU会服务进程固定长度的时间(相当于进程点了一个钟),然后如果进程没有运行完毕,就再继续队列末尾排队。针对进程运行中的不同情况也会重新划分队列的优先级。
- 多级反馈队列。先设置多个不同级别的就绪队列,第一队列优先级最高,服务时间相对其他队列最短,如果在服务时间过了并未完成,那么就会进入第二队列。只有第一队列服务完毕,才会进入第二队列,一旦重新启动一个进程,CPU会中断正在服务第二对列的进程,而去执行新的进程。
并行与并发
并行:就是多个进程真正意义上的同时运行。从微观还是宏观上都是进程A、B同时执行。这时候必须有多个处理器才可以实现。
并发:进程A、B轮流使用cpu资源,实现了资源的利用率,但是同一时刻只有一个进程在运作。在宏观上好像两者一起执行的。
同步异步与堵塞非堵塞
同步异步描述的是任务的提交方式。
同步:一个任务A的完成需要依赖另一个任务B的反馈,这样当执行任务A的时候,就必须在原地等着任务B完成,A才能继续完成。
异步:任务A的完成不需要等待被依赖的任务B的执行完毕,而只是通知任务B运行。
堵塞与非堵塞主要是程序等待消息通知时的状态角度来说的。
堵塞:就是任务处于堵塞态。
非堵塞:任务处于就绪态和运行态。
这时就可分为四种状态:同步堵塞、同步非堵塞、异步堵塞、异步非堵塞(理想态)。
开启进程的方法
开启新的进程在Python中表现为导入该模块,一般都会放到main代码之下来执行。
# 利用multiprocessing模块中的Process
from multiprocessing import Process
import time
def task(n):
time.sleep(n)
print("这是子进程")
if __name__ == '__main__':
p = Process(target=task,args=(2,)) # 创建一个对象,args需要的是一个元祖
p.start() # 让操作系统创建一个异步进程。
print("主进程")
# 类的继承
class Myprocess(Process):
# def __init__(self,name):
# super().__init__() # 定义__init__须放此行代码
# self.name = name
def run(self): # run函数是必须定义的
time.sleep(2)
print("这是子进程")
if __name__ == '__main__':
p = Myprocess() # 创建对象
p.start() # 调用run()函数
print("这是主进程")
# join()方法:作用就是让主进程等等子进程代码运行完毕,在继续运行。就是变成了同步运行。
总结:**
创建进程是在内存中申请一块内存空间将需要运行的代码丢进去,
每个进程对应在内存中就是一块独立的内存空间。