1.操做系统历史html
2.进程,IO,同步异步阻塞非阻塞python
手工操做:算法
1946年第一台计算机诞生--20世纪50年代中期,计算机工做还在采用手工操做方式。此时尚未操做系统的概念。安全
脱机批处理系统:为克服与缓解:高速主机与慢速外设的矛盾,提升CPU的利用率,又引入了脱机批处理系统,即输入/输出脱离主机控制。服务器
多道程序系统(IO到了就切换任务):网络
#两个做业之间,若是一个做业遇到了IO操做了,另一个做业就开始使用CPU进行计算 # 多道程序设计技术不只使CPU获得充分利用,同时改善I/O设备和内存的利用率,从而提升了整个系统的 # 资源利用率和系统吞吐量(单位时间内处理做业(程序)的个数),最终提升了整个系统的效率。 # 单处理机系统中多道程序运行时的特色: # (1)多道:计算机内存中同时存放几道相互独立的程序; # ·(2)宏观上并行:同时进入系统的几道程序都处于运行过程当中,即它们前后开始了各自的运行,但都未运行完毕; # ·(3)微观上串行:实际上,各道程序轮流地用CPU,并交替运行。 # 多道程序系统的出现,标志着操做系统渐趋成熟的阶段,前后出现了做业调度管理、处理机管理、存储器管理、外部设备管理、文件系统管理等功能。 # 因为多个程序同时在计算机中运行,开始有了空间隔离的概念,只有内存空间的隔离,才能让数据更加安全、稳定。 # 出了空间隔离以外,多道技术还第一次体现了时空复用的特色,遇到IO操做就切换程序,使得cpu的利用率提升了,计算机的工做效率也随之提升。
分时系统(时间片到了就切换):session
# 分时技术:把处理机的运行时间分红很短的时间片,按时间片轮流把处理机分配给各联机做业使用。 # 若某个做业在分配给它的时间片内不能完成其计算,则该做业暂时中断,把处理机让给另外一做业使用,等待 # 下一轮时再继续其运行。因为计算机速度很快,做业运行轮转得很快,给每一个用户的印象是,好象他独占了一台计算 # 机。而每一个用户能够经过本身的终端向系统发出各类操做控制命令,在充分的人机交互状况下,完成做业的运行。 # 具备上述特征的计算机系统称为分时系统,它容许多个用户同时联机使用计算机。 # 特色: # (1)多路性。若干个用户同时使用一台计算机。微观上看是各用户轮流使用计算机;宏观上看是各用户并行工做。 # (2)交互性。用户可根据系统对请求的响应结果,进一步向系统提出新的请求。这种能使用户与系统进行人机对话的工做方 # 式,明显地有别于批处理系统,于是,分时系统又被称为交互式系统。 # (3)独立性。用户之间能够相互独立操做,互不干扰。系统保证各用户程序运行的完整性,不会发生相互混淆或破坏现象。 # (4)及时性。系统可对用户的输入及时做出响应。分时系统性能的主要指标之一是响应时间,它是指:从终端发出命令到系统予以应答所需的时间。 # 分时系统的主要目标:对用户响应的及时性,即不至于用户等待每个命令的处理时间过长。 # 分时系统能够同时接纳数十个甚至上百个用户,因为内存空间有限,每每采用对换(又称交换)方式的存储方法。 # 即将未“轮到”的做业放入磁盘,一旦“轮到”,再将其调入内存;而时间片用完后,又将做业存回磁盘(俗称“滚进”、“滚出“法),使 # 同一存储区域轮流为多个用户服务。 # 多用户分时系统是当今计算机操做系统中最广泛使用的一类操做系统。 # 注意:分时系统的分时间片工做,在没有遇到IO操做的时候就用完了本身的时间片被切走了,这样的切换工做其实并无提升cpu的效率, # 而使得计算机的效率下降了。可是咱们牺牲了一点效率,却实现了多个程序共同执行的效果,这样你就能够在计算机上一边听音乐一边聊qq了。 # 分时——如今流行的PC,服务器都是采用这种运行模式,即把CPU的运行分红若干时间片分别处理不一样的运算请求 linux系统 # 实时——通常用于单片机上、PLC等,好比电梯的上下控制中,对于按键等动做要求进行实时处理
通用操做系统:多线程
# 操做系统的三种基本类型:多道批处理系统、分时系统、实时系统。 # 通用操做系统:具备多种类型操做特征的操做系统。能够同时兼有多道批处理、分时、实时处理的功能,或其中两种以上的功能。 # 例如:实时处理+批处理=实时批处理系统。首先保证优先处理实时任务,插空进行批处理做业。常把实时任务称为前台做业,批做业称为后台做业。 # 再如:分时处理+批处理=分时批处理系统。 # 即:时间要求不强的做业放入“后台”(批处理)处理,需频繁交互的做业在“前台”(分时)处理,处理机优先运行“前台”做业。 # 从上世纪60年代中期,国际上开始研制一些大型的通用操做系统。这些系统试图达到功能齐全、可适应各类应用范围和操做方式变化无穷的环境的目标。 # 可是,这些系统过于复杂和庞大,不只付出了巨大的代价,且在解决其可靠性、可维护性和可理解性方面都遇到很大的困难。 # 相比之下,UNIX操做系统倒是一个例外。这是一个通用的多用户分时交互型的操做系统。它首先创建的是一个精干的核心, # 而其功能却足以与许多大型的操做系统相媲美,在核心层之外,能够支持庞大的软件系统。它很快获得应用和推广,并不断完善,对现代操做系统有着重大的影响。 # 至此,操做系统的基本概念、功能、基本结构和组成都已造成并渐趋完善。
操做系统的进一步发展:我的计算机操做系统,网络操做系统,分布式操做系统并发
IO:
# I/O # 即 input output #只要是和内存打交道,可是不涉及到计算的,都是IO #内置函数 inpput time.sleep() 读文件,写文件 网络请求:recv accept都是IO
进程:
1.是运行中的程序;
2.是系统最小的资源分配单位
3.为多个任务之间的数据安全和内存隔离作约束
进程的三个状态:就绪态,执行态,阻塞态
# (1)就绪(Ready)状态 # 当进程已分配到除CPU之外的全部必要的资源,只要得到处理机即可当即执行,这时的进程状态称为就绪状态。 # (2)执行/运行(Running)状态当进程已得到处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。 # (3)阻塞(Blocked)状态正在执行的进程,因为等待某个事件发生而没法执行时,便放弃处理机而处于阻塞状态。 # 引发进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能知足、等待信件(信号)等。 #进程建立后,进入就绪状态,等待操做系统运行 import time print('程序开始运行了') #程序运行状态 name = input('>>> ') #遇到了阻塞 #用户输入后,进入就绪状态,等待运行 print(name) #运行态 time.sleep(1) #再次进入阻塞态 #再次进入就绪态 print('程序结束运行') #运行态 #结束 #因为该程序运行十分短暂,没有遇到没运行完,可是时间片到了,切换到就绪态,进入等待队列
#引进进程的概念 每个程序都有它本身存储的空间,空间上隔离开来 # 第一,进程是一个实体。每个进程都有它本身的地址空间,通常状况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。 # 文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 # 第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操做系统执行之), # 它才能成为一个活动的实体,咱们称其为进程。[3] # 进程是操做系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态状况,描述系统内部各道 # 程序的活动规律引进的一个概念,全部多道程序设计操做系统都创建在进程的基础上。 #进程与程序中的区别 # 程序是指令和数据的有序集合,其自己没有任何运行的含义,是一个静态的概念。 # 而进程是程序在处理机上的一次执行过程,它是一个动态的概念。 # 程序能够做为一种软件资料长期存在,而进程是有必定生命期的。 # 程序是永久的,进程是暂时的。 # 注意:同一个程序执行两次,就会在操做系统中出现两个进程,因此咱们能够同时运行两个软件,分别作不一样的事情也不会混乱。
#进程调度 #先来先服务调度算法(FCFS),有利于长做业,不利于短做业 #短做业优先调度算法(SJ/PF),进程的长短被预先估算出来 #时间片 轮转法:把1秒钟分红多份,每一份就是时间片,每一份是CPU调度的时间 # 基本思路是让每一个进程在就绪队列中的等待时间与享受服务的时间成比例。 # 在时间片轮转法中,须要将CPU的处理时间分红固定大小的时间片,例如,几十毫秒至几百毫秒。 # 若是一个进程在被调度选中以后用完了系统规定的时间片,但又未完成要求的任务, # 则它自行释放本身所占有的CPU而排到就绪队列的末尾, # 等待下一次调度。同时,进程调度程序又去调度当前就绪队列中的第一个进程。 #多级反馈队列调度—较为科学的调度方法 # 多级反馈队列调度算法则没必要事先知道各类进程所需的执行时间,并且还能够知足各类类型进程的须要, # 于是它是目前被公认的一种较好的进程调度算法。在采用多级反馈队列调度算法的系统中,调度算法的实施过程以下所述。 # (1) 应设置多个就绪队列,并为各个队列赋予不一样的优先级。第一个队列的优先级最高,第二个队列次之, # 其他各队列的优先权逐个下降。该算法赋予各个队列中进程执行时间片的大小也各不相同, # 在优先权愈高的队列中,为每一个进程所规定的执行时间片就愈小。 # 例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍。 # (2) 当一个新进程进入内存后,首先将它放入第一队列的末尾, # 按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,即可准备撤离系统; # 若是它在一个时间片结束时还没有完成,调度程序便将该进程转入第二队列的末尾,再一样地按FCFS原则等待调度执行; # 若是它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……, # 如此下去,当一个长做业(进程)从第一队列依次降到第n队列后,在第n 队列便采起按时间片轮转的方式运行。 # # (3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行; # 仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。若是处理机正在第i队列中为某进程服务时, # 又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机, # 即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。
#咱们计算机采用时间片轮转法和多级反馈队列调度
并行和并发:
# 并行 : 并行是指二者同时执行,好比赛跑,两我的都在不停的往前跑;(资源够用,好比三个线程,四核的CPU ) # (多线程:看起来像一块儿执行,但因为cpython中的GIL,使得多个线程同一时间只有一个线程占用cpu) # 并发 : 并发是指资源有限的状况下,二者交替轮流使用资源,好比一段路(单核CPU资源)同时只能过一我的 # A走一段后,让给B,B用完继续给A ,交替使用,目的是提升效率。 #(多进程:在同一时间能够占用多个cpu) # # 区别: # 并行是从微观上,也就是在一个精确的时间片刻,有不一样的程序在执行,这就要求必须有多个处理器。 # 并发是从宏观上,在一个时间段上能够看出是同时执行的,好比一个服务器同时处理多个session。
同步、异步、阻塞、非阻塞:
#同步:事情是串行的,必须作完这件事,才能继续往下作 # 相似好几条马路,只有一辆车在这些道上跑 #异步:变现出来为两个函数,同时运行。在同一时间有两件事在同时作的事情 #阻塞:inpput time.sleep() 读文件,写文件 网络请求:recv 等 # 非阻塞:程序无论走到哪,都不停下来。可是程序不可避免的就要阻塞 # 非阻塞和阻塞的概念相对应,指在不能马上获得结果以前,该函数不会阻塞当前线程,而会马上返回。 # 简单点说: # 阻塞就是干不完不许回来, # 非阻塞就是你先干,我现看看有其余事没有,完了告诉我一声 # 其它该了解的概念: # 1.同步VS异步 # 同步和异步一般用来形容一次方法调用。同步方法调用一开始,调用者必须等待被调用的 # 方法结束后,调用者后面的代码才能执行。而异步调用,指的是,调用者不用管被调用方法是否 # 完成,都会继续执行后面的代码,当被调用的方法完成后会通知调用者。好比,在超时购物,如 # 果一件物品没了,你得等仓库人员跟你调货,直到仓库人员跟你把货物送过来,你才能继续去收银台付款,这就 # 相似同步调用。而异步调用了,就像网购,你在网上付款下单后,什么事就不用管了,该干吗就干吗去了,当货 # 物到达后你收到通知去取就好。 # # 2 并发与并行 # 并发和并行是十分容易混淆的概念。并发指的是多个任务交替进行,而并行则是指真正意义上 # 的“同时进行”。实际上,若是系统内只有一个CPU,而使用多线程时,那么真实系统环境下不能并行,只能经过切换时间片的方式交替进行,而成为并发执行任务。真正的并行也只能出如今拥有多个CPU的系统中。 # # 3 阻塞和非阻塞 # 阻塞和非阻塞一般用来形容多线程间的相互影响,好比一个线程占有了临界区资源,那么其余线程 # 须要这个资源就必须进行等待该资源的释放,会致使等待的线程挂起,这种状况就是阻塞,而非阻塞就刚好相反,它强调没有一个线程能够阻塞其余线程,全部的线程都会尝试地往前运行。 # # 4 临界区 # 临界区用来表示一种公共资源或者说是共享数据,能够被多个线程使用。可是每一个线程使用时,一旦临界区资源被一个线程占有,那么其余线程必须等待。
同步阻塞,异步阻塞,同步非阻塞,异步非阻塞:
#1.同步阻塞形式 效率最低。拿上面的例子来讲,就是你专心排队,什么别的事都不作。 #2.异步阻塞形式 若是在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行作其它的事情,那么很显然,这我的被阻塞在了这个等待的操做上面; 异步操做是能够被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。 #3.同步非阻塞形式 其实是效率低下的。 想象一下你一边打着电话一边还须要抬头看到底队伍排到你了没有,若是把打电话和观察排队的位置当作是程序的两个操做的话,这个程序须要在这两种不一样的行为之间来回的切换,效率可想而知是低下的。 #4.异步非阻塞形式 效率更高, 由于打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不一样的操做中来回切换。 好比说,这我的忽然发觉本身烟瘾犯了,须要出去抽根烟,因而他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操做上面,天然这个就是异步+非阻塞的方式了。 不少人会把同步和阻塞混淆,是由于不少时候同步操做会以阻塞的形式表现出来,一样的,不少人也会把异步和非阻塞混淆,由于异步操做通常都不会在真正的IO操做处被阻塞。
摘抄连接:景老师-操做系统介绍