并发编程基础及进程基础

并发编程基础及进程基础

一、操做系统发展史

一、穿孔卡片python

​ 读取速度很慢linux

​ CPU利用率很低算法

​ 单个用户(一份代码)使用编程

二、批处理并发

​ 读取速度慢app

​ CPU利用率低异步

​ 联机(多份代码)使用函数

​ 效率低操作系统

三、脱机批处理(现代操做系统的设计原理)设计

​ 读取速度提升

​ CPU利用率提升

二、多道技术(基于单核背景下产生)

单道:一条道走到黑(串行)

程序 a和b 都要使用CPU,a先使用CPU时,须要等待a使用结束后,b才开始使用CPU

多道:好比, a和b 都要使用CPU,a先使用CPU时,直到a遇到IO或者执行时间过长时,a会(切换+保存状态),而后b可使用CPU,直到b遇到IO或者执行时间过长,b会(切换+保存状态),a再次执行,直到两个程序结束

IO: input() , output() , time.sleep(), 文件的读写,数据的传输

空间上的复用:多个程序使用一个CPU

时间上的复用:切换+保存状态

  1. 当执行程序遇到 IO 时,操做系统会将CPU的执行权限剥夺

    优势:CPU的执行效率高

  2. 当执行程序时间过长时,操做系统会将CPU的执行权限剥夺

    缺点:程序的执行效率低

并发与并行

并发:

​ 在单核(一个CPU)的状况下,当执行当 a ,b 两个程序,先运行a时,当a遇到IO时,b开始执行,看着像同时运行

并行:

​ 在多核状况下,当执行 a ,b 两个程序,a 与 b 同时执行,真正意义上的同时执行

三、进程

一、什么是进程

进程是一个资源单位

二、进程与程序的区别

程序:一堆代码文件

进程:执行代码的过程,称之为进程

三、进程调度

  1. 先来先服务调度算法

    a , b 程序,当a 先来a就先执行,一直执行完后b才执行

    缺点:执行效率低

  2. 短做业优先调度算法

    执行时间短的先执行

    缺点:致使执行时间长的程序,须要等待全部时间短的程序执行完毕后,才能执行

  3. 时间片轮转法

    好比同时有10个程序 ,操做系统给1秒时间,每一个程序分0.1秒运行,未运行完的进入下一次调度

  4. 多级反馈队列

    1级队列:优先级最高,先执行

    2级队列:优先级次之,1级队列执行完后执行

    3级队列:。。。。

如今的操做系统的进程调度算法:时间片轮转法+多级反馈队列

四、同步与异步

同步与异指的是 提交任务的方式

同步(串行):程序 a和b 都要提交使用CPU,a先提交使用CPU时,须要等待a使用结束后,b才提交开始使用CPU

异步(并发):两个a,b程序都要提交并执行,假如a先提交并执行,b无需等a执行完毕,就能够直接提交任务

五、阻塞与非阻塞

阻塞(等待):凡是遇到IO都会阻塞

非阻塞(不等待):除了IO都是非阻塞

六、进程的三种状态

就绪态:同步与异步已经获取除CPU之外的全部资源,只要获取处理机就能立马执行的状态

运行态(非阻塞):已经得到处理机,正在执行的状态,程序的执行时间过长——>将程序返回给就绪态

阻塞态:遇到IO,处于阻塞状态

同步与异步指的是:提交任务的方式

阻塞与非阻塞:指的是进程的状态

异步非阻塞:CPU的利用率最大化

七、建立进程的两种方式

强调:在Windows操做系统中因为没有 fork ( linux 操做系统中建立进程的机制),在建立子进程的时候会自动 import 启动它的这个文件,而在 import 的时候又执行了整个文件。所以若是将process()直接写在文件中就会无限递归建立子进程报错。因此必须把建立子进程的部分使用if __ name__ ==‘ __ main__’ : 判断保护起来,import 的时候 ,就不会递归运行了。

from multiprocessing import Process
import time

# 方式1:直接调用Process
def test_data(name):
    print(f'start{name}子进程')
    time.sleep(2)
    print(f'end{name}子进程')

if __name__ == '__main__':
    # target = 函数地址,args = 函数传入的参数(元组)
    obj = Process(target=test_data, args=('Jason',))
    # 建立子进程
    obj.start()
    # 等着子进程结束完成后再结束
    obj.join()
    print('主进程')
from multiprocessing import Process
import time

# 方式2:使用类继承Process
class MyProcess(Process):
    def run(self):
        print(f'start子进程')
        time.sleep(2)
        print(f'end子进程')

if __name__ == '__main__':
    list2 = []
    for i in range(5):
        obj = MyProcess()
        obj.start()
        list2.append(obj)
    for obj in list2:
        obj.join()
    print('主进程结束')
相关文章
相关标签/搜索