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())  #主进程

 

转载于:https://www.cnblogs.com/wangyuxing/p/8399353.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值