zoukankan      html  css  js  c++  java
  • 并发编程

    阅读目录

    理论知识

    必备的理论基础:

    一.什么是操作系统:

      管理且优化使用计算机硬件是一件非常繁琐的事情,程序员是无法把所有的硬件操作细节都了解到的,于是计算机安装了一层软件(系统软件),成为操作系统,用来管理计算机硬件,这样,程序员只需要考虑应用软件的编写,应用软件直接使用操作系统提供的功能间接使用硬件就可以了.
      所以,简单来说,操作系统就是一个协调,管理,控制计算机硬件资源和软件资源的控制程序.操作系统所处的位置如图:

    二.操作系统的作用:

    1.隐藏了丑陋复杂的硬件接口,提供了良好的抽象接口;
    
     例如,操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作,有了文件,我们就无序考虑对磁盘的读写控制.
    
    2.将应用程序对硬件资源的竞争请求变得有序化
    
     例如,很多应用程序其实是共享一套计算机硬件.假如现在有三个应用程序都申请了打印机打印.那么a程序竞争到了资源就打印,b程序竞争到了就打印b的...,这就导致了无序.打印机可能一会儿打印一段a的内容,一会儿再打印c的内容.操作系统的一个功能就是让这种无序变得有序.

    三.多道技术:

    背景: 针对单核,实现并发
    
      现在的主机一般是多核,那么每个核都会利用多道技术.比如,有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个cpu的任意一个.
    
      
    
    空间上的复用: 如内存中同时有多道程序;
    
    时间上的复用: 复用一个cpu的时间片.
    
      强调: 遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,以便下次切换回来时,能基于上次切走的位置继续.

     进程

    什么是进程

    顾名思义,进程就是正在进行的程序.

    详细来说:

    第一,进程是一个实体.每一个进程都有自己的内存空间.
    第二,进程是一个"执行中的程序".

     进程的调度

    进程的调度算法:

    1.先来先服务算法

    2.短作业优先算法

    3.时间片轮转法

    4.多级反馈队列

    进程的并行与并发

    并发: 并发是指资源有限的情况下,两个进程交替使用资源.

    并行:并行是指两个进程同时进行.例如多个cpu执行多个任务.

    区别:

    并行是从微观上来说的,也就是说同一时刻,有不同的程序在执行,这就需要有多个处理器.

    并发是从宏观上来说的,同一时间段上有不同任务在执行,同一时刻只有一个任务.

    同步异步阻塞非阻塞

    程序的三状态: 就绪,执行,阻塞

    同步: 一个任务的执行依赖另一个任务的完成.

    异步: 一个任务的执行不依赖另一个任务的完成.

    阻塞: 当进程不满足程序运行的条件时,进程就会进入等待状态,知道满足条件为止,这就是阻塞.

    非阻塞: 除了阻塞,都是非阻塞.

      设置非阻塞: sk.setblocking(False)

    在python程序中的进程操作

    multiprocessing模块

    process模块

    p.start() : 启动进程,并调用该子进程中的p.run()
    p.run() : 进程启动时运行的方法,正是它去调用target指定的函数,我们自定义中的类一定要实现该方法.
    p.terminate() : 强制终止进程.
    p.is_alive() : 判断进程是否还活着.如果p仍运行,返回True
    p.join(timeout) : 主进程等待p终止,才会继续执行 
    方法介绍

    进程之间数据隔离

    from multiprocessing import Process
    
    def work():
        global n
        n=0
        print('子进程内: ',n)
    
    
    if __name__ == '__main__':
        n = 100
        p=Process(target=work)
        p.start()
        print('主进程内: ',n)
    
    进程之间的数据隔离问题

    守护进程

    守护进程只守护主进程,会随着主进程代码的结束而结束.

    锁Lock,信号量Semaphore,事件Event

    锁--multiprocessing.Lock

    当多个进程使用同一份数据资源时,会引发数据安全问题,使用Lock,就将进程变成串行,保证了数据安全.

    信号量-- multiprocessing.Semaphore

    信号量就是: 锁+计数器

    互斥锁同时只允许一个进程更改数据,而信号量是同时允许一定数量的进程更改数据.

    事件-- multiprocessing.Event

    event有一个默认的标识,默认为"False".
    set: 将False设置为True.
    clear: 将True设置False.
    is_set: 判断是否为True.
    wait: 标识为False,进入阻塞;标识为True,开始执行.
    方法

    进程间通信

    IPC (Inter-Process-Communication)

    实现IPC的方法:

      队列Queue :管道+锁

      管道Pipe :

    进程池

    定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务.池中进程的数量是固定的.

    回调函数

    什么是回调函数?

    进程池中任何一个任务结束,就告知主进程,主进程再调用一个函数来处理该结果.

     线程

        

       

  • 相关阅读:
    maven导入项目时出现“Cannot read lifecycle mapping metadata …… invalid END header (bad central directory offset)pom”错误的解决方法
    Eclipse下使用Git
    Sprint Boot入门(1):创建第一个Spring Boot应用
    Gradle入门(6):创建Web应用项目
    Gradle入门(5):创建二进制发布版本
    maven在windows10系统下安装配置和打包war
    Windows10系统下安装配置Tomcat 9.0.1
    面试题1
    Json序列化帮助类
    NPOI帮助类
  • 原文地址:https://www.cnblogs.com/yaraning/p/10161221.html
Copyright © 2011-2022 走看看