• 并发编程


    并发编程:
    计算机又叫点电脑,为了代替人的工作而诞生的一种工具
    操作系统发展史,第一代手工穿孔卡片,同一时间机房只有一个人在进行操作,对操作者来说是有好处的,但对等待者和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
    
    '''
    总结:创建进程就是在内存中申请一块内存空间将需要运行的代码丢进去
          
          一个进程对应在内存中就是一块独立的内存空间
          多个进程对应在内存中就是多块独立的内存空间
          
          进程与进程之间数据默认情况下是无法直接交互的,如果想要交互
          可以借助第三方工具
    '''
    

      

  • 相关阅读:
    教你如何开发一个完败Miracast的投屏新功能
    深度评测--安卓免费的银行卡识别SDK,华为 HMS MLKit 和Card IO哪个好?
    别让算法和数据结构拖你职业生涯的后腿
    接入卡片类快服务你必须知道的事情
    手机智眼——智慧视觉
    解放双手的革命——智慧语音
    Android | 超简单集成HMS ML Kit实现最大脸微笑抓拍
    快服务常见TOP3审核雷区,再不过审就要崩溃啦!
    图标新纪元——服务直达
    集成机器学习服务上架华为应用市场指南
  • 原文地址:https://www.cnblogs.com/Jicc-J/p/12756234.html
Copyright © 2020-2023  润新知