并发编程基本知识

并发编程基础知识

进程

进程是操作系统最核心的概念。

程序:放在硬盘上的一堆代码。

进程:当程序被启动加载到内存之后开始执行就被称为进程。

那么什么是多道技术呢?

假设有一个工人(CPU),但是他需要处理好几件事情(进程),这时候他有两种处理方式,一种是一件事接着一件事做,这就是单道。一种是几种事情一起干,这是多道。

CPU的运行速度是很快的,当进程A遇到IO操作的时候,如果要是单道的话,就需要cpu在那等着进程A从堵塞状态恢复,然后在继续运行进程A。直到A运行结束。然后跑去运行进程B。这样等待的时间就是进程A的时间+进程B的时间。

而多道的就是当运行进程A的时候,一旦A进入IO状态,那么cpu就会趁着空闲的时间再跑去执行进行B,不让CPU多等待。这样消耗的时间就是进程AB中消耗时间最长的时间。

要点:

  1. 当程序遇到IO操作的时候,会被操作系统剥夺该程序CPU的执行权限。

    作用:提高了CPU的利用率,且不影响程序的执行效率。

  2. 当程序长时间占用CPU的时候,操作系统也会剥夺该程序的CPU执行权限。

    弊端:降低了程序的执行效率。

进程的调度

既然知道了多道技术,那么进程之间是怎么执行先后顺序的。

  1. 先来先服务调度算法。谁先运行的就先服务谁。不适合IO多的进程。
  2. 短作业优先调度算法。对长作业类型不利。
  3. 时间片轮转法。先将进程进行排队,CPU会服务进程固定长度的时间(相当于进程点了一个钟),然后如果进程没有运行完毕,就再继续队列末尾排队。针对进程运行中的不同情况也会重新划分队列的优先级。
  4. 多级反馈队列。先设置多个不同级别的就绪队列,第一队列优先级最高,服务时间相对其他队列最短,如果在服务时间过了并未完成,那么就会进入第二队列。只有第一队列服务完毕,才会进入第二队列,一旦重新启动一个进程,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()方法:作用就是让主进程等等子进程代码运行完毕,在继续运行。就是变成了同步运行。

总结:**

创建进程是在内存中申请一块内存空间将需要运行的代码丢进去,

每个进程对应在内存中就是一块独立的内存空间。

posted @ 2020-04-22 21:08  小菜鸟是我  阅读(220)  评论(0编辑  收藏  举报