并发编程

并发编程:
计算机又叫点电脑,为了代替人的工作而诞生的一种工具
操作系统发展史,第一代手工穿孔卡片,同一时间机房只有一个人在进行操作,对操作者来说是有好处的,但对等待者和cpu来说是不友好的,利用率极低


第二代出现了成批处理,首先出现的是联机批处理系统即作业的输入输出由cpu来处理,然后出现的是脱机批处理系统,解决了高速主机和
慢速威慑的矛盾,从而提高cpu利用率,并且出现了一种不与主机直接相连而专门用于输入输出的设备

经过两代的发展计算机已经有很高的CPU利用率,但是仍然存在运行期间发出输入/输出(I/O)请求后,高速的CPU便处于等待低速的I/O完成状态,致使CPU空闲。为改善CPU的利用率,又引入了多道程序系统。

多道技术:单核实现并发效果
并发:看起来像是同时运行
并行:真正意义上的同时进行 ps:1.并行是一种并发,但并发不都是并行 2.单核计算机可定不能实现并行,但是可以实现并发

依靠对资源的充分利用完成节省多个程序运行的总耗时

多道技术的重点知识
空间上的复用:多个程序共用一套计算机硬件
时间上的复用:切换+保存状态,切换cpu分为两种情况:1.当一个程序遇到IO操作的时候,操作系统会剥夺该程序的CPU执行权限(提高了cpu利用率同时不影响程序执行效率)
2.当一个程序长时间占用CPU是,操作系统会剥夺该程序的CPU执行权限(降低了程序运行效率)

进程理论:
程序和进程的区别:程序就是一堆躺在硬盘上的代码,进程则是表示程序正在执行的过程

要想多个程序同时进行就要进行进程的调度,先运行那个该切换那个如何切换都是调度需要考虑的事情

1.先来先服务调度算法,对长作业比较友好,但是对短作业就并不友好
2.短作业优先调度,但其对长作业不利;不能保证紧迫性进程被及时处理;作业的长短只是被估算出来的。
3.时间片轮转法+多级反馈队列:
时间片就是将固定的占用cpu时间切分成很多分,每一份表示一个时间片。在轮转法中,加入到就绪队列的进程有3种情况:
一种是分给它的时间片用完,但进程还未完成,回到就绪队列的末尾等待下次调度去继续执行。
另一种情况是分给该进程的时间片并未用完,只是因为请求I/O或由于进程的互斥与同步关系而被阻塞。当阻塞解除之后再回到就绪队列。
第三种情况就是新创建进程进入就绪队列。
多级反馈队列在本人看来类似于将就绪态进行分级,从而区别出各个级别之间的优先级来,仅当第一队列空闲时,调度程序才调度第二队列中的进程运行

那么根据两者的结合我们可以得出以下方式,当一个新进程诞生的时候会被优先放入第一队列,这就保证了在开启新进程时会第一时间做出响应,而之后如果在分配的时间片内对CPU占用没有结束那么会被放在第二队列,当且仅当第一队列没有进程需要占用CPU时,会给第二队列发放时间片。以此类推


进程三态转换图:首先进程进入就绪状态(所有程序在运行之前都要首先进入就绪态),

两对重要的概念:
同步和异步:描述的是任务的提交方式
同步:任务提交之后,原地等待任务的返回结果,等待的过程中不做任何事。在程序层面上表现出来的感觉就是卡住
异步:任务提交之后,不原地等待任务的返回结果,直接去做其他事情,任务的返回结果会有一个异步回调机制自动处理
阻塞和非阻塞:描述的是程序的运行状态
阻塞:阻塞态
非阻塞:就绪态和运行态
理想状态:我们应该让代码永远处于就绪态和运行态之间

开启进程的两种方式
线程与进程开启方式是差不多的
windows操作系统下创建进程要在main内创建,因为在win下创建进程类似于模块导入,会从上之下执行
linux中会直接将代码拷贝一份

进程间数据相互隔离

from multiprocessing import Process
import time
#第一种
# def task(name):
#     print(f"{name} is running")
#     time.sleep(3)
#     print(f"{name} is over")
#
# if __name__ == '__main__':
#     p = Process(target=task, args=("jason",))
#     p.start()


#第二种类的继承

# class MyProcess(Process):
#     pass

'''
总结:创建进程就是在内存中申请一块内存空间将需要运行的代码丢进去
      
      一个进程对应在内存中就是一块独立的内存空间
      多个进程对应在内存中就是多块独立的内存空间
      
      进程与进程之间数据默认情况下是无法直接交互的,如果想要交互
      可以借助第三方工具
'''

  

原文地址:https://www.cnblogs.com/Jicc-J/p/12756234.html