zoukankan      html  css  js  c++  java
  • 并发编程基本知识

    并发编程基础知识

    进程

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

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

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

    那么什么是多道技术呢?

    假设有一个工人(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()方法:作用就是让主进程等等子进程代码运行完毕,在继续运行。就是变成了同步运行。
    

    总结:**

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

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

  • 相关阅读:
    windows线程消息通信和处理 PostThreadMessage和PeekMessage GetMessage
    如何:对 Windows 窗体控件进行线程安全调用(转载自msdn)
    How to: Develop a Simple Windows Forms Control(转载)
    《Effective C#》 翻译札记(转载)
    对制造者线程和使用者线程进行同步
    用户模式与内核模式(转)
    焊接技巧
    TextBox控件滚动条自动下拉(转)
    books
    CODE::BLOCKS GLUT 完整开发包
  • 原文地址:https://www.cnblogs.com/liqianxin/p/12755988.html
Copyright © 2011-2022 走看看