博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

进程--python

Posted on 2019-01-08 15:55  GraceNana  阅读(143)  评论(0编辑  收藏  举报

进程:正在执行的一个过程,是对正在运行程序的一个抽象

操作系统:推荐阅读《操作系统原理》 《现代操作系统》

IO操作 :     输入/输出(CPU闲置,利用率低)

进程调度:多个进程交替运行,操作系统必须对这些进程进行调度,这个调度也不是随即进行的,而是需要遵循一定的法则。

  1. 先来先服务调度法
  2. 短作业优先调度法
  3. 时间片论转法
  4. 多级反馈队列

并发与并行

***多道程序系统程序之间的切换运行,保存状态叫做并发(伪并行))

并行是理想状态,源于多个cpu运行(多核技术)

分时系统:解决多道批处理系统时间复用上的缺点,把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。

特点: (1)多路性 (2)交互性 (3)独立性 (4)及时性

目标:对用户的响应的及时性,即不至于用户等待每一个命令的处理时间过长

实时系统: 由于分时系统不能满足实时控制与实时信息处理两个应用领域的需求,即系统能够及时响应随机发生的外部事件,并在严格的时间范围内完成对该事件的处理

分为两类:(1)实时控制系统(如飞机飞行控制) (2)实时信息处理系统(相当于银行系统)

特点: (1)及时响应    (2)高可靠性

同步异步(任务的提交方式,异步:多个任务同时提交出去,同时执行)

同步/异步 与 阻塞和非阻塞

 

  1. 同步阻塞形式(效率低,排队)
  2. 异步阻塞形式 (异步操作是可以被阻塞的,只不过它不是在处理消息时阻塞的)
  3. 同步非阻塞形式(开线程)
  4. 异步非阻塞形式(效率最高)

 

空间复用 时间复用è充分利用内存,提高代码运行效率

硬件上内存隔离解决程序切换的不安全

分时系统:常用(每个程序执行一点时间)

实时系统:高进度行业,不切换

进程的创建:

  1. 系统初始化
  2. 一个进程在运行过程中开启了子进程(常用)
  3. 用户的交互式请求,而创建的一个新进程(如用户双击暴风影音)
  4. 一个批处理作业的初始化(只在大型机的批处理系统中应用)

进程结束:

  1. 正常退出(自愿)
  2. 出错退出(自愿)
  3. 严重错误(非自愿,执行非法指令,如引用不存在的内存)
  4. 被其他进程杀死

进程并发的实现

import time
from multiprocessing import Process
def f1():
    time.sleep(3)
    print(‘aaaa’)
def f2():
    time.sleep(3)
    print(‘bbb’)
f1() #排队进行共6s 串行执行
f2()
if __name__ == ‘__main__’:
    p1 = Process(target = f1,)
    p2 = Process(target = f2,)
    p1.start()    #给操作系统发信号创建进程,输出顺序不一定
    p2.start()    #多进程,有I/O切换执行,耗时3s左右,并发代码运行效率提高了一倍
    
    p1.join()  #主进程等待子进程,如果没有join命令,会继续执行主进程,CPU执行代码速度快于操作系统
    p2.join()
    print(‘主进程’)
    

for 循环创建进程

import time
from multiprocessing import Process
def f1(n):
    time.sleep(3)
    print(i)
if __name__ == ‘__main__’:
    for i in range(20):
    p1 = Process(target = f1,args=(i,))  # i为传入参数或者kwargs ={‘n’:’i’}
    p1.start()       #多进程执行顺序操作系统决定

继承的形式创建进程

class MyProcess(Process):   #继承类创建进程对象
    def __init__(self,n):
        super().__init__()   #执行父类的init
    self.n = n
    def run(self):
    print(‘a and %s’%self.n)
if __name__ == ‘__main__’:
    p1 = Myprocess(‘b’) 
    p1.start()         #a and b