zoukankan      html  css  js  c++  java
  • 35、操作系统和进程模块

    一、操作系统

    一、操作系统的发展

    没有操作系统———传孔卡片

    批处理系统———串行,速度快

      联机批处理,读磁带的时候速度快

      脱机批处理,读磁带和cpu工作并发

    多道程序系统———并行

      操作系统的各种管理功能

      时空的复用:空间隔离开来,CPU看起来可以处理多个任务

     分时系统———更好的实现了并行

      缺点:让CPU的工作效率下降了

    实时系统———对一个任务实时响应

      优点:快

      缺点:能处理的任务更少

    通用操作系统

      兼具多个操作系统的特性

    二、操作系统的功能

      封装了对硬件的操作过程,给应用层序提供好用的接口

      对多个作业进行调度管理来分配硬件资源

    三、进程与程序

      程序:就是一堆代码

      进程:运行当中的程序。进程是操作系统资源分配的最小单位

      为什么要引入进程的概念?

        为了隔离资源

      进程是怎么被调度的呢?

        先来先服务算法:(FCFS)

        短作业优先算法

        时间片轮算法

        多级反馈转算法

      进程的状态:就绪、运行、阻塞

      进程的创建和结束:

        创建进程有很多方式———就是让一个程序运行起来

        所有的进程都是被进程创建出来的

        父进程与子进程:进程1创建了进程2,那么进程1就是父进程,进程2就是子进程

    二、进程

    1、在学习进程之前首先认识一下如何看到进程:

        os.getpid() 获取当前python运行的程序的进程号 (pid:process  id :进程id )  

          os.getppid()  获取当钱python运行的程序的父进程号(ppid:parents process id  父进程id )  

    关于multiprocess模块——综合的、多元的 进程模块(包):python中创建进程用来替我做事。

    import os
    from multiprocessing import Process  #导入进程模块
    import time
    def func():
        time.sleep(2)
        print('子进程号%d'%os.getpid())
    
    
    if __name__ =='__main__':
        p=Process(target=func)
        p.start()                                  #启动子进程
        print('第一次主进程号%d'%os.getpid())
        p.join()                                              #阻塞
        print('第二次主进程号%d'%os.getpid())

    有两种情况:

      1、没有p.join()  :这种情况下不阻塞,执行主程序,调用子进程。子进程和父进程是异步执行。

    创建进程对象 传要执行的函数 以及参数
    进程对象.start()
    主进程和子进程就是异步执行
    如果主进程中的代码已经结束了,子进程还没结束,主进程会等待子进程
    
    p.join 就是主进程会阻塞在join的位置,等待p进程结束
    windows操作系统中 创建进程的语句一定要放在if __name__ == '__main__':条件语句下面

      2、有p.join():主进程阻塞在join的位置,等待p进程的结束(异步阻塞)

    2、开启多个子进程 

    import os
    import time
    from multiprocessing import Process
    def func(i):
        time.sleep(3)
        print('%d :子进程%d干的事,父进程%d干的事'%(i,os.getpid(),os.getppid()))
    
    if __name__=='__main__':
        p_lst=[]
        for i in range(10):
            p=Process(target=func,args=(i,))     #实例化,调用线程类,传参数
            p.start()                            #启动线程(类似传达一下消息
            p_lst.append(p) 
        for p in p_lst:
            p.join()                              #阻塞
        print('-------主进程-------')

      创建一个线程,然后启动(对象名.start),它会在未知的时间里创建线程,所以至于它是不是在主线程之前还是之后启动都不能确定。如果想要主线程在所有线程后等待,那么需要预先创建一个空列表,然后把所有启动的子线程放入列表中,对列表中的子线程总体进行循环阻塞后,启动主线程。

    3、另一种开启多进程的方法

    import os
    from multiprocessing import Process
    class MyProcess(Process):  #必须创建一个类,必须继承Process方法
        def run(self):               #必须实现run方法
            print('子进程%d'%os.getpid())
            self.walk()
        def walk(self):
            print('子进程walk%d'%os.getpid())
    
    if __name__ =='__main__':
        p=MyProcess()            #先实例化一个对象
        p.start()                   #启动子进程
        p.join()
        print('主进程%d'%os.getpid())  #主进程
  • 相关阅读:
    [ffmpeg] h264并行解码
    [ffmpeg] 滤波
    FFmpeg中AVFilter模块实践指南
    加载动态链接库——dlopen dlsym dlclose
    [ffmpeg] 滤波格式协商
    Delphi XE2 之 FireMonkey 入门(30) 数据绑定: TBindingsList: TBindExpression 的 OnAssigningValue 事件
    Delphi XE2 之 FireMonkey 入门(29) 数据绑定: TBindingsList: 表达式的 Evaluate() 方法
    Delphi XE2 之 FireMonkey 入门(25) 数据绑定: TBindingsList: 表达式的灵活性及表达式函数
    Delphi XE2 之 FireMonkey 入门(32) 数据绑定: TBindingsList: TBindList、TBindPosition [未完成...]
    Delphi XE2 之 FireMonkey 入门(33) 控件基础: TFmxObject: SaveToStream、LoadFromStream、SaveToBinStream、LoadFromBinStream
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8399353.html
Copyright © 2011-2022 走看看