内容大纲:
操作系统发展史
分时系统与实时系统
什么是进程?
异步非阻塞形式:
进程的启动
操作系统发展史:
#手工操作的时代--穿孔纸带
程序和数据是通过纸带输入机器,计算的结果也是通过纸带输出
#特点:
用户独占全机,
cpu等待输入时间过程长,cpu的利用不充分
#批处理--磁带存储
#把输入机上的用户作业读入磁带,
把磁带上的用户作业读入主机内存并执行并把计算结果向输出机输出。
#问题
高速CPU仍处于空闲状态,等待慢速的输入/输出设备完成工作
#脱机批处理
#卫星即专门负责输入输出
#问题:
每当主机运行期间,发出输入输出的请求之后,高速的CPU变处于等待状态
#多道程序系统
#什么是多道程序设计技术?
多个程序连续进入内存,允许他们交替的在CPU上面运行,
当其中一个程序进入I/O等待的时候,CPU切换去运行另一道程序
#总结:
多道程序系统的出现,标志着操作系统进入成熟的阶段,也正是由于多个程序
同事在计算机运行,开始有了空间隔离的概念,只有内存空间的隔离,
才有了数据更加安全,稳定。
多道技术的出现,提出了时空复用的概念,遇到i/o操作就切换程序,使得cpu的利用率提高了。
分时系统与实时系统:
分时系统的概念:
把处理及的运行时间分成很短的时间片,按时间片的轮流,把处理机的资源
分配给联机作业使用。
特点:
对用户相应的及时性,不至于用户等待每个命令的处理时间过长,
实时系统:
系统需要及时的响应随机发生的外部事件,
通用操作系统:
具有多种类型操作特征,兼有多道批处理,分时处理,实时处理的功能。
什么是分布式操作系统?
将分散的计算机系统,相互连接,协作完成任务。
什么是操作系统?
操作系统就是一个协调、管理和控制计算机硬件资源(主要指内存),软件资源的控制程序
什么是输入输出?
输入:
input recv read
输出:
output send write
什么是进程?
#正在执行的一个过程,进程是对正在运行的程序的一个抽象。
#进程是计算机的程序关于某数据集上的一次活动,是系统进行资源分配和调度
的基本单位。是操作系统结构的基础。
#进程是一个执行中的程序,程序本身是一个没有生命的实体,只有处理器
赋予程序生命的时候(操作系统之执行它的时候),它才是一个活动的实体,我们称其为进程。
进程的调度
想要多个进程交替进行,操作系统必须对这些进程进行调度
调度的原则:
FCFS先来先服务
短作业优先
时间片轮转
多级反馈队列
#第一个到第n个队列,优先级依次从高到低,优先级越高分配的时间片越短
#新进程进入内存后,先将他放在第一个队列的末尾,排队进行等待,当轮到改进行执行的时候
,如果在时间片内能够完成,便撤离系统,如果没有完成,便进入第二队列的末尾,
#当第一队列为空的时候,执行第二队列的进程,
并行与并发的区别:
并行:一个cpu处理一个进程,并排平行的向前推进
并发:资源有限的情况下,两个进程交替使用资源
进程的三状态转换
就绪状态(ready)
创建并提交,进程已经分配到了出CPU之外的资源,
运行状态(Running)
CPU正在处理,时间片到了还未处理完毕,改进程回到就绪状态
阻塞状态(Blocked)
执行的过程中,遇到I/O而无法继续执行,进入阻塞状态,
完成I/O之后,进程回到就绪状态。
同步和异步:
同步:洗好了衣服再去做饭
异步:洗衣机在旁边洗衣服,我在厨房做饭,
同步阻塞形式:
排队的时候,专心排队,啥也别干
异步阻塞形式:
洗衣机在旁边洗衣服,我在厨房做饭,可是洗衣服没有洗衣粉,做饭没有盐
异步非阻塞形式:
效率高,
到银行办业务,去了号,等待的过程中,可以去喝咖啡,只要在被叫号之前回来就行。
#os.getpid() os.getppid()
import os import time print(os.getpid())#process ip #这个py文件的进程 ip print(os.getppid())#parent process ip #pycharm的进程ip '''4412 3156''' from multiprocessing import Process import os def func(): print('子进程',os.getpid(),os.getppid())#func的进程ip py文件的进程ip if __name__ == '__main__': print('主进程',os.getpid(),os.getppid())#py文件的进程ip pycharm的进程ip my_process = Process(target=func) my_process.start()
主进程 4292 3156 子进程 1956 4292
#进程的启动
import os import time from multiprocessing import Process def func(): for i in range(10): time.sleep(0.5) print('子进程',os.getpid(),os.getppid()) if __name__ == '__main__': print('主进程',os.getpid(),os.getppid()) pro = Process(target= func) pro.start() for i in range(10): time.sleep(0.3) print('*'*i)
主进程 1928 3156 * ** *** **** 子进程 6608 1928 ***** ****** 子进程 6608 1928 ******* ******** 子进程 6608 1928 ********* 子进程 6608 1928 子进程 6608 1928 子进程 6608 1928 子进程 6608 1928 子进程 6608 1928 子进程 6608 1928 子进程 6608 1928
总结一下:
为什么主进程启动的时候必须使用if __name__ == '__main__':?
因为进程启动的时候, pro.start() 会为进程开辟空间,并且把父进程的所有变量import进来,
如果没有if __name__ == '__main__':?,这句话,遇到pro.start()又会重新开辟空间启动进程,这样一直的循环下去。
#进程之间数据的隔离
import os,time from multiprocessing import Process count = 100 def func(): global count count -= 1 print('子进程',count) if __name__ == '__main__': print('主进程',os.getpid()) pro = Process(target=func) pro.start() time.sleep(2) print('主进程:',count)
主进程 7184 子进程 99 主进程: 100
#过个进程的启动 以及进程中参数的传递
import os,time from multiprocessing import Process def func(argv): print('子进程参数:%s'%argv,os.getpid(),os.getppid()) if __name__ == '__main__': for i in range(10): Process(target=func,args=(i,)).start() print('fu进程:%s',os.getpid(),os.getppid())
fu进程:%s 5908 3156 子进程参数:5 7536 752 子进程参数:4 4256 752 子进程参数:6 7156 752 子进程参数:7 4792 752 子进程参数:0 7844 752 子进程参数:8 2200 752 子进程参数:3 4836 752 子进程参数:2 4424 752 子进程参数:1 6620 752 子进程参数:9 1304 752
总结:
子进程的启动是异步的,父进程只负责通知操作系统,启动子进程。
接下来的工作由操作系统接手,父进程继续进行。
父进程执行结束之后,不会结束程序,要等到所有的子进程都执行完毕之后才会结束。
因为,父进程要负责回收进程的资源。