多道技术背景:
提高工作效率(充分利用I/O阻塞的时间) (I: input, O: output)
同时执行多个任务
多道技术:
空间复用: 充分利用内存空间
时间复用: 充分利用I/O阻塞时间
空间上的复用:将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序。
缺点:首先丧失的是安全性,比如你的qq程序可以访问操作系统的内存,这意味着你的qq可以拿到操作系统的所有权限。其次丧失的是稳定性,某个程序崩溃时有可能把别的程序的内存也给回收了,比方说把操作系统的内存给回收了,则操作系统崩溃。
为了解决空间复用上的问题:程序之间的内存必须分割,由操作系统控制。如果内存彼此不分割,则一个程序可以访问另外一个程序的内存。
时间上的复用:当一个程序在等待I/O时,另一个程序可以使用cpu,如果内存中可以同时存放足够多的作业,则cpu的利用率可以接近100%
缺点:程序员A的程序运行10分钟就能够运行结束,程序员B的程序需要运行24小时,如何程序员B的程序先运行,并且程序员B的程序没有任何IO操作,那么程序员A需要等待24小时之后才能执行,那么这就不太合理了。
为了解决时间出现了分时系统
分时系统:
分时技术: 把处理机的运行时间分成很短的时间片, 按时间片轮流把处理机分配给各联机作业使用.
若某个作业在分配给它的时间片内不能完成其计算, 则该作业暂时中断, 把处理机让给另一作业使用, 等待下一轮时再继续其运行. 由于计算机速度很快, 作业运行轮转得很快, 给每个用户的印象是, 好像他独占了一台计算机. 而每个用户可以通过自己的终端向系统发出各种操作指令, 在充分的人机交互情况下, 完成作业的运行.
具有上述特征的计算机系统称为分时系统, 它允许多个用户同时联机使用计算机. 多用户分时系统是当今计算机操作系统中最普遍使用的一类操作系统.
实时系统:
虽然多道批处理系统能获得较令人满意的资源利用率和系统响应时间, 但却不能满足实时控制与实时信息处理两个应用领域的需求. 于是就产生了实时系统, 即系统能够及时响应随机发生的外部事件, 并在严格的时间范围内完成对该事件的处理.
实时系统在一个特定的应用中常作为一种控制设备来使用.
实时系统可分成两类:
分时——现在流行的PC,服务器都是采用这种运行模式,即把CPU的运行分成若干时间片分别处理不同的运算请求 linux系统
实时——一般用于单片机上、PLC等,比如电梯的上下控制中,对于按键等动作要求进行实时处理
并发: (一个CPU执行多个进程, 进程之间不断切换)
提高了程序的工作效率
两项工作:
1. 进程之间的切换
2. 保护现场, 保留进程执行的进度
并行: (多核,每个核执行一个,同时执行无需切换即并行)
应用多核, 多个任务同时执行
同步: 等待前面的任务执行完毕, 后面的任务才能执行.
异步:排队取号,前面的任务执行时,自己回去处理自己的事,等前面的任务执行完了,叫到自己的号,再过去执行自己的任务.
阻塞: 只等待排队,什么都不干
非阻塞: 可以处理自己的事情,不用干等着
进程:
具有独立功能的程序在某个数据集合上的一次运行活动, 也是操作系统进行资源分配和保护的基本单位.
进程状态的七态模型
1. 新建态(new): 进程被创建, 尚未进入就绪队列.
2. 就绪态(ready): 进程具备运行条件, 等待系统分配处理器.
3. 挂起就绪态(ready suspend): 进程具备运行条件, 但目前在外存中.
4. 运行态(running): 进程占有处理器正在运行.
5. 终止态(exit): 进程达到正常结束点或被其他原因所终止, 下一步将被撤销.
6. 等待态(wait): 又称阻塞态或休眠态. 进程正在等待某个事件完成, 目前不具备运行条件.
7. 挂起等待态(blocked suspend): 进程正在等待某个事件完成, 并且在外存中.
进程的交互:
进程互斥(Mutual Exclusion): 若干进程因相互抢夺独占型资源而产生的竞争制约关系.
进程同步(Synchronization): 为完成共同任务的并发进程基于某个条件来协调其活动, 因为需要在某些位置上排定执行的先后次序而等待,、传递信息或信息所产生的协作制约关系.
查看进程的pid
import os
import time from multiprocessing import Process def func(pycharm_pid): print('子进程', os.getpid()) print('父进程', os.getppid()) print('pycharm的pid', pycharm_pid)
time.sleep(10) # 等待10s,防止进程很快结束,可以在此期间看到任务管理器中进程的PID print('我是func~~~') def inner(): print('我是inner') print('子进程', os.getpid()) print('父进程', os.getppid()) def inner2(): print('我是inner2') print('子进程', os.getpid()) print('父进程', os.getppid()) return inner2() return inner() def func2(): print('我是func2') print('父进程的另一个子进程', os.getpid())
time.sleep(10) if __name__ == '__main__': print('父进程', os.getpid()) pycharm_pid = os.getppid() p = Process(target=func, args=(pycharm_pid,)) # 创建一个进程 p.start() # 启动这个进程 p1 = Process(target=func2,) # 创建一个进程 p1.start() # 启动这个进程 # 进程启用后会相互抢占内存, 而p和p1进程的启动间隔十分短,所以p和p1无法确定哪个进程会先执行,是完全随机的