python D30 操作系统历史
Posted 我是一名劍客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python D30 操作系统历史相关的知识,希望对你有一定的参考价值。
一、操作系统
现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。
一般而言,现代计算机系统是一个复杂的系统。
其一:如果每位应用程序员都必须掌握该系统所有的细节,那就不可能再编写代码了(严重影响了程序员的开发效率:全部掌握这些细节可能需要一万年....)
其二:并且管理这些部件并加以优化使用,是一件极富挑战性的工作,于是,计算安装了一层软件(系统软件),称为操作系统。它的任务就是为用户程序提供一个更好、更简单、更清晰的计算机模型,并管理刚才提到的所有设备。
总结:
程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的,有了他,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件的编写就可以了,应用软件直接使用操作系统提供的功能来间接使用硬件。
二、什么是操作系统
#操作系统位于计算机硬件与应用软件之间,本质也是一个软件。操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成,所以,单纯的说操作系统是运行于内核态的,是不准确的。
图1
细说的话,操作系统应该分成两部分功能
#一:隐藏了丑陋的硬件调用接口(键盘、鼠标、音箱等等怎么实现的,就不需要你管了),为应用程序员提供调用硬件资源的更好,更简单,更清晰的模型(系统调用接口)。应用程序员有了这些接口后,就不用再考虑操作硬件的细节,专心开发自己的应用程序即可。
例如:操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作,有了文件我们无需再去考虑关于磁盘的读写控制(比如控制磁盘转动,移动磁头读写数据等细节),
#二:将应用程序对硬件资源的竞态请求变得有序化
例如:很多应用软件其实是共享一套计算机硬件,比方说有可能有三个应用程序同时需要申请打印机来输出内容,那么a程序竞争到了打印机资源就打印,然后可能是b竞争到打印机资源,也可能是c,这就导致了无序,打印机可能打印一段a的内容然后又去打印c...,操作系统的一个功能就是将这种无序变得有序。
#作用一:为应用程序提供如何使用硬件资源的抽象 例如:操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作,有了文件我们无需再去考虑关于磁盘的读写控制 注意: 操作系统提供给应用程序的该抽象是简单,清晰,优雅的。为何要提供该抽象呢? 硬件厂商需要为操作系统提供自己硬件的驱动程序(设备驱动,这也是为何我们要使用声卡,就必须安装声卡驱动。。。),厂商为了节省成本或者兼容旧的硬件,它们的驱动程序是复杂且丑陋的 操作系统就是为了隐藏这些丑陋的信息,从而为用户提供更好的接口 这样用户使用的shell,Gnome,KDE看到的是不同的界面,但其实都使用了同一套由linux系统提供的抽象接口 #作用二:管理硬件资源 现代的操作系统运行同时运行多道程序,操作系统的任务是在相互竞争的程序之间有序地控制对处理器、存储器以及其他I/O接口设备的分配。 例如: 同一台计算机上同时运行三个程序,它们三个想在同一时刻在同一台计算机上输出结果,那么开始的几行可能是程序1的输出,接着几行是程序2的输出,然后又是程序3的输出,最终将是一团糟(程序之间是一种互相竞争资源的过程) 操作系统将打印机的结果送到磁盘的缓冲区,在一个程序完全结束后,才将暂存在磁盘上的文件送到打印机输出,同时其他的程序可以继续产生更多的输出结果(这些程序的输出没有真正的送到打印机),这样,操作系统就将由竞争产生的无序变得有序化。
图 2
三 操作系统与普通软件的区别
1.主要区别是:你不想用暴风影音了你可以选择用迅雷播放器或者干脆自己写一个,但是你无法写一个属于操作系统一部分的程序(时钟中断处理程序),操作系统由硬件保护,不能被用户修改。
2.操作系统与用户程序的差异并不在于二者所处的地位。特别地,操作系统是一个大型、复杂、长寿的软件,
- 大型:linux或windows的源代码有五百万行数量级。按照每页50行共1000行的书来算,五百万行要有100卷,要用一整个书架子来摆置,这还仅仅是内核部分。用户程序,如GUI,库以及基本应用软件(如windows Explorer等),很容易就能达到这个数量的10倍或者20倍之多。
- 长寿:操作系统很难编写,如此大的代码量,一旦完成,操作系统所有者便不会轻易扔掉,再写一个。而是在原有的基础上进行改进。(基本上可以把windows95/98/Me看出一个操作系统,而windows NT/2000/XP/Vista则是两位一个操作系统,对于用户来说它们十分相似。还有UNIX以及它的变体和克隆版本也演化了多年,如System V版,Solaris以及FreeBSD等都是Unix的原始版,不过尽管linux非常依照UNIX模式而仿制,并且与UNIX高度兼容,但是linux具有全新的代码基础)
四 操作系统发展史
第一代(1940~1955) 手工操作----穿孔卡片
第一代之前人类是想用机械取代人力,第一代计算机的产生是计算机由机械时代进入电子时代的标志,从Babbage失败之后一直到第二次世界大战,数字计算机的建造几乎没有什么进展,第二次世界大战刺激了有关计算机研究的爆炸性进展。
lowa州立大学的john Atanasoff教授和他的学生Clifford Berry建造了据认为是第一台可工作的数字计算机。该机器使用300个真空管。大约在同时,Konrad Zuse在柏林用继电器构建了Z3计算机,英格兰布莱切利园的一个小组在1944年构建了Colossus,Howard Aiken在哈佛大学建造了Mark 1,宾夕法尼亚大学的William Mauchley和他的学生J.Presper Eckert建造了ENIAC。这些机器有的是二进制的,有的使用真空管,有的是可编程的,但都非常原始,设置需要花费数秒钟时间才能完成最简单的运算。
在这个时期,同一个小组里的工程师们,设计、建造、编程、操作及维护同一台机器,所有的程序设计是用纯粹的机器语言编写的,甚至更糟糕,需要通过成千上万根电缆接到插件板上连成电路来控制机器的基本功能。没有程序设计语言(汇编也没有),操作系统则是从来都没听说过。使用机器的过程更加原始
穿孔卡带的过程:程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
第二代(1955~1965) 磁带存储---批处理系统
设计人员、生产人员、操作人员、程序人员和维护人员直接有了明确的分工,计算机被锁在专用空调房间中,由专业操作人员运行,这便是‘大型机’。
有了操作系统的概念
有了程序设计语言:FORTRAN语言或汇编语言
1.联机批处理系统
2.脱机批处理系统
第三代(1955~1965) 多道程序系统(多道是重点*****)
在A程序计算时,I/O空闲, A程序I/O操作时,CPU空闲(B程序也是同样);必须A工作完成后,B才能进入内存中开始工作,两者是串行的,全部完成共需时间=T1+T2。
空间上的复用:将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序。
时间上的复用:当一个程序在等待I/O时,另一个程序可以使用cpu,如果内存中可以同时存放足够多的作业,则cpu的利用率可以接近100%
为了解决时间出现了分时系统
分时——现在流行的PC,服务器都是采用这种运行模式,即把CPU的运行分成若干时间片分别处理不同的运算请求 linux系统 实时——一般用于单片机上、PLC等,比如电梯的上下控制中,对于按键等动作要求进行实时处理
5.通用操作系统
第三代(1980~至今) 现代计算机
1.个人计算机操作系统
2.网络操作系统
知识拓展
五、操作系统原理
1. 操作系统的资源管理技术
资源管理解决物理资源数量不足和合理分配资源这两个问题。
操作系统虚拟机为用户提供了一种简单、清晰、易用、高效的计算机模型。虚拟机的每种资源都是物力资源通过复用、虚拟和抽象而得到的产物。
虚拟机提供进程运行的逻辑计算环境。从概念上来说,一个进程运行在一台虚拟机上,可以认为一个进程就是一台虚拟机,一台虚拟机就是一个进程。
-
复用:空分复用共享和时分复用共享。
a. 空分复用共享(space-multiplexed sharing): 将资源从“空间”上分割成更小的单位供不同进程使用。在计算机系统中,内存和外存(磁盘)等是空分复用共享的。
b. 时分复用共享(time-multiplexed sharing): 将资源从“时间”上分割成更小的单位供不同进程使用。在计算机系统中,处理器和磁盘机等是时分复用共享的。 -
虚拟:对资源进行转化、模拟或整合,把一个物理资源转变成多个逻辑上的对应物,也可以把多个物理资源变成单个逻辑上的对应物,即创建无须共享独占资源的假象,或创建易用且多于实际物理资源的虚拟资源假象,以达到多用户共享一套计算机物理资源的目的。虚拟技术可用于外部设备(外部设备同时联机操作(SPOOLing)),存储资源(虚拟内存)和文件系统(虚拟文件系统(Virtual File System, VFS))中。
复用和虚拟相比较,复用所分割的是实际存在的物理资源,而虚拟则实现假想的同类资源。虚拟技术解决某类物理资源不足的问题,提供易用的虚拟资源和更好的运行环境。
-
抽象:通过创建软件来屏蔽硬件资源的物理特性和实现细节,简化对硬件资源的操作、控制和使用。
复用和虚拟的主要目标是解决物理资源数量不足的问题,抽象则用于处理系统复杂性,重点解决资源易用性。
2. 系统调用
-
系统调用: 为给应用程序的运行提供良好环境,内核提供了一系列具有预定功能的服务例程,通过一组称为系统调用(System Call)的接口呈现给用户,系统调用把应用程序的请求传送至内核,调用相应的服务例程完成所需处理,将处理结果返回给应用程序。
注:系统调用的编号称为功能号
-
系统调用的执行过程: 当CPU执行程序中编写的由访管指令(supervisor, 也称自陷指令(trap)或中断指令(interrupt), 指引起处理器中断的机器指令)实现的系统调用时会产生异常信号,通过陷阱机制(也称异常处理机制,当异常或中断发生时,处理器捕捉到一个执行线程,并且将控制权转移到操作系统中某一个固定地址的机制),处理器的状态由用户态(user mode, 又称目态或普通态)转变为核心态(kerbel mode, 又称管态或内核态),进入操作系统并执行相应服务例程,以获得操作系统服务。当系统调用执行完毕时,处理器再次切换状态,控制返回至发出系统调用的程序。
-
系统调用是应用程序获得操作系统服务的唯一途径。
系统调用的作用:
1. 内核可以基于权限和规则对资源访问进行裁决,保证系统的安全性。
2. 系统调用对资源进行抽象,提供一致性接口,避免用户在使用资源时发生错误,且编程效率大大提高。系统调用与函数调用的区别:
1. 调用形式和实现方式不同。功能号 VS 地址; 用户态转换到内核态 VS 用户态。
2. 被调用代码的位置不同。 动态调用 + 操作系统 VS 静态调用 + 用户级程序。
3. 提供方式不同。 操作系统 VS 编程语言。
3. 操作系统内核
-
内核: 是一组程序模块,作为可信软件来提供支持进程并发执行的基本功能和基本操作,通常驻留在内核空间,运行于内核态,具有直接访问硬件设备和所有内存空间的权限,是仅有的能够执行特权指令的程序。
-
内核的功能:
a. 中断处理。中断处理是内核中最基本的功能,也是操作系统赖以活动的基础。
b. 时钟管理。时钟管理是内核的基本功能。
c. 短程调度。短程调度的职责是分配处理器,按照一定的策略管理处理器的转让,以及完成保护和恢复现场工作。
d. 原语管理。 原语是内核中实现特定功能的不可中断过程。
内核是操作系统对裸机的第一次改造,内核和裸机组成了第一层虚拟机,进程在虚拟机上运行。
4. 处理器状态: 内核态和用户态
- 仅在内核态下才能使用的指令称为特权指令,执行这些指令不仅影响运行程序自身,而且还会干扰其他程序及操作系统。 非特权指令在内核态和和用户态下都能工作。
现代计算机为处理器建立硬件标志位,称处理器状态位,通常是程序状态字(Program Status Word, PSW)中的一位,来将处理器的状态设置为内核态或用户态。
- 用户态向内核态转换的情况:
a. 程序请求操作系统服务, 执行系统调用。
b. 在程序运行时产生中断事件(如I/O操作完成),运行程序被中断,转向中断处理程序处理。
c. 在程序运行时产生异常事件(如在目态下执行特权指令),运行程序被打断,转向异常处理程序工作。
以上三种情况都是通过中断机制发生,可以说中断和异常是用户态到内核态转换的仅有途径。
- 用户栈和核心栈
a. 用户栈是用户进程空间中的一块区域。用于保存应用程序的子程序(函数)间相互调用的参数,返回值,返回点和子程序的局部变量。
b. 核心栈是内存中操作系统空间的一块区域。用于保存中断现场和保存操作系统程序(函数)间相互调用的参数,返回值,返回点和程序的局部变量。
5. 中断(Interupt)
-
中断:程序执行过程中遇到急需处理的事件时,暂时终止现行程序在CPU上的运行,转而执行相应的事件处理程序,待处理完成后再返回断点或调度其他程序的执行过程。
-
中断的分类:
a. 外中断(又称中断或异步中断): 来自处理器之外的中断信号,如,时钟中断、键盘中断等。外中断可分为可屏蔽中断和非可屏蔽中断。
b. 内中断(又称异常或同步中断),来自处理器内部的中断信号,如,访管中断,硬件故障中断,程序性中断等。内中断不能被屏蔽。 -
中断和异常的响应: 发现中断源 → 保护现场 → 转向中断/异常事件处理程序执行 → 恢复现场
6. 进程
-
进程:具有独立功能的程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位。
a. 从原理角度看,进程是支持程序执行的一种系统机制,它对处理器上运行程序的活动进行抽象。
b. 从实现角度看,进程是一种数据结构,用来准确地刻画运行程序的状态和系统动态变化状况。 -
进程状态的七态模型
a. 新建态(new): 进程被创建,尚未进入就绪队列。
b. 就绪态(ready): 进程具备运行条件,等待系统分配处理器。
c. 挂起就绪态(ready suspend):进程具备运行条件,但目前在外存中。
d. 运行态(running): 进程占有处理器正在运行。
e. 终止态(exit): 进程达到正常结束点或被其他原因所终止,下一步将被撤销。
f. 等待态(wait): 又称阻塞态或休眠态。进程正在等待某个事件完成,目前不具备运行条件。
g. 挂起等待态(blocked suspend): 进程正在等待某个事件完成,并且在外存中。 -
程序和数据刻画进程的静态特征,称为进程控制块的一种数据结构刻画进程的动态特征。进程映像(process image)包括进程控制块、进程程序块、进程核心块、进程数据块等要素。
-
进程控制块(Process Control Block, PCB):进程存在的唯一标识,操作系统掌握进程的唯一资料结构和管理进程的主要依据。包括标识信息、现场信息和控制信息等信息。
-
进程队列(process queue):处于同一状态的所有进程的PCB链接在一起的数据结构。 有两种队列组织方式:链接方式和索引方式。
-
进程切换必定在内核态而非用户态发生。
-
进程可以分为两部分,资源集合和线程集合。进程要支撑线程运行,为线程提供虚拟地址空间和各种资源。进程封装管理信息,线程封装执行信息。
7. 处理器调度
-
处理器调度层次:
a. 高级调度: 又称作业调度、长程调度。从输入系统的一批作业(job, 用户提交给操作系统计算的一个独立任务)中按照预定的调度策略挑选若干作业进入内存,为其分配所需资源并创建对应作业的用户进程。
b. 中级调度: 又称平衡调度,中程调度。根据内存资源情况决定内存所能容纳的进程数目,并完成外存和内存中进程对换工作。
c. 低级调度:又称进程调度/线程调度,短程调度。根据某种原则决定就绪队列中那个进程/线程先获得处理器,并将处理器出让给它使用。 -
低级调度算法:
a. 先来先服务(First Come First Server, FCFS)算法。
b. 最短作业优先(Shortest Job First, SJF)算法。
c. 最短剩余时间优先(Shortest Remaining Time First, SRTF)算法: 假设当前某进程/线程正在运行,如果有新进程/线程移入就绪队列,若它所需的CPU运行时间比当前运行的进程/线程所需的剩余CPU时间还短,抢占式最短作业优先算法强行剥夺当前执行者的控制权,调度新进程/线程执行。
d. 最高响应比优先(Highest Response Ratio First, HRRF)算法:非剥夺式算法。其中,响应比 = (作业已等待时间 + 作业处理时间) / 作业处理时间。
e. 优先级调度算法:优先级高的选择进程/线程优先选择。
f. 轮转调度(Round-Robin, RR)算法: 也称时间片调度。就绪队列的进程轮流运行一个时间片。
g. 多级反馈队列(Multi-Level Feedback Queue, MLFQ)算法。衡量调度算法的性能指标:
a. 资源利用率: CPU利用率 = CPU有效工作时间/(CPU有效工作时间 + CPU空闲等待时间)
b. 吞吐率: 单位时间内CPU处理作业的个数。
c. 公平性: 确保每个进程都能获得合理的CPU份额和其他资源份额,不会出现饥饿现象。
d. 响应时间: 从交互式进程提交一个请求(命令)直到获得响应之间的时间间隔。
e. 周转时间: 批处理用户从向系统提交作业开始到作业完成为止的时间间隔。
平均周转时间:T = (∑ni=1ti∑i=1nti ) / n , 其中 titi 表示作业i的周转时间。
平均带权作业周转时间: T = (∑ni=1wi∑i=1nwi) / n, 其中 wi=ti/tkwi=ti/tk , titi 表示作业i的周转时间。 tktk 表示作业i的运行时间。
8. 进程的交互
- 进程互斥(Mutual Exclusion): 若干进程因相互抢夺独占型资源而产生的竞争制约关系。
-
进程同步(Synchronization): 为完成共同任务的并发进程基于某个条件来协调其活动,因为需要在某些位置上排定执行的先后次序而等待、传递信息或消息所产生的协作制约关系。
资源竞争会引发两个控制问题:
a. 死锁: 一组进程因争夺资源陷入永远等待的状态。
b. 饥饿: 一个可运行进程由于由于其他进程总是优先于它,而被调度程序无限期地拖延而不能被执行。
9. 临界区管理
-
并发进程中与共享变量有关的程序段称为临界区(Critical Section)。共享变量所代表的资源称为临界资源(Critical Resource),即一次仅能供一个进程使用的资源。
-
临界区调度原则:
a. 择一而入。 一次之多只有一个进程进入临界区内执行。
b. 忙则要等。 如果已有进程在临界区中, 试图进入此临界区的其他进程应等待。
c. 有限等待。 进入临界区内的进程应在有限时间内退出。 -
临界区管理的软件算法:Peterson算法。
为每个进程设置标志,当标志值为true
时表示该进程要求进入临界区,另外再设置一个指示器turn
以指示可以由哪个进程进入临界区,当turn = i
时则可由Pi
进入临界区。
-
Peterson算法满足临界区管理的三个原则。
-
临界区管理的硬件设施:
a. 关中断。 在进程进入临界区时关中断,进程退出临界区时开中断。
b. 测试并设置指令。 利用机器指令TS(Test and Set)实现临界区的上锁和开锁原语操作。
c. 对换指令。 利用对换指令实现临界区的上锁和开锁原语操作。
信号量(samaphore)和PV操作
PV操作都是原语操作, 不可中断。
-
信号量和PV操作
1 // 信号量 2 typedef struct semaphore { 3 int value; // 信号量值 4 struct pcb* list; // 指向“等待该信号量的进程队列”的指针 5 }; 6 7 // P操作 8 void P(semaphore s){ 9 s.value--; // 信号量值减一 10 11 // 如果信号量值小于0, 执行P操作的进程调用sleep(s.list)阻塞自己, 12 // 被置成“等待信号量s”状态,并移入s信号量队列,转向进程调度程序。 13 if(s.value < 0) sleep(s.list); 14 } 15 16 // V操作 17 void V(semaphore s){ 18 s.value++; // 信号量值加一 19 20 // 如果信号量小于等于0, 则调用wakeup(s.list)释放一个等待信号量s的进程, 21 // 并转换成就绪态, 进程则继续执行。 22 if(s.value <= 0) wakeup(s.list); 23 }
-
a. 若信号量值
s.value
为正值, 此值等于在封锁进程之前对信号量s
可施行P操作的次数,即,s所代表的实际可用的资源数。
b. 若信号量值s.value
为负值, 其绝对值等于登记在s
信号量队列中的等待进程的数目。
c. 通常P操作意味着请求一个资源,V操作意味着释放一个资源。在一定条件下,P操作也可表示挂起进程的操作,V操作代表唤醒被挂起进程的操作。 -
信号量实现互斥
1 semaphore mutex; 2 mutex = 1; 3 4 //进程Pi, i = 1, 2 ..., n 5 process Pi(){ 6 P(mutex); 7 8 /* 临界区 */ 9 10 V(mutex); 11 }
11. 管程
-
管程(monitor):代表共享资源的数据结构及并发进程在其上执行的一组构成就构成管程,管程被请求和释放资源的进程锁调用。
a. 条件变量。 管程内的一种数据结构。只有在管程中才能被访问,进程可以在条件变量上等待或被唤醒。只能通过
wait()
和signal()
原语操作来控制。
b.wait()
原语。 挂起调用进程并释放管程,直至另一个进程在条件变量上执行signal()
。
c.signal()
原语。如果有其他的进程因对条件变量执行wait()
而被挂起,便释放之。 如果没有进程在等待,那么相当于空操作,信号不被保存。
12. 死锁
-
死锁的主要解决方法: 死锁防止、死锁避免、死锁检测和恢复。
-
死锁产生的必要条件:
a. 互斥条件。 临界资源是独占资源,进程应互斥且排他地使用这些资源。
b. 占有和等待条件。 进程在请求资源得不到满足而等待时,不释放已占有的资源。
c. 不剥夺条件。已获资源只能由进程资源释放,不允许被其他程序剥夺。
d. 循环等待条件。 存在循环等待链,其中每个进程都在等待下一个进程所持有的资源。死锁的防止就是去破坏死锁产生的必要条件。 如,使资源可同时使用(破坏互斥条件)、静态分配资源(破坏占有和等待条件)、剥夺调度(破坏不剥夺条件)、层次分配策略(循环等待条件)等。
-
死锁避免: 银行家算法 (额…自己百度去吧。 = =!)
-
死锁检测和恢复: 进程-资源分配图(额…还是去百度吧。)
a. 如果进程-资源分配图中无环路,此时系统没有死锁。
b. 如果进程-资源分配图中有环路,且每个资源类中只有一个资源,则系统发生死锁。
c. 如果进程-资源分配图中有环路,且所涉及的资源类有多个资源,则不一定会发生死锁。
13. 可变分区存储管理
- 可变分区存储分配算法:
a. 最先适应分配算法。从未分配区的开始位置开始扫描,在找到的第一个能满足长度要求的空闲区上分配存储空间。
b. 下次适应分配算法。从未分配区上次扫描结束处开始顺序查找,在找到的第一个能满足长度要求的空闲区上分配存储空间。
c. 最优适应分配算法。扫描整个未分配区,选择能满足用户进程要求的最小分区分配存储空间。
d. 最坏适应分配算法。扫描整个未分配区,选择能满足用户进程要求的最大分区分配存储空间。
e. 快速适应分配算法。为经常用到的长度的空闲区设立单独的空闲区链表。
14. 分页存储管理
-
基本概念:
a. 页面。 进程逻辑地址空间分成大小相等的区,每个区称为页面或页。(注: 页面的本质是逻辑地址空间)
b. 页框(kuàng, 0.0)。 又称页帧。内存物理地址空间分成大小相等的区,其大小和页面大小相等,每个区就是一个页框。(注: 页框的本质是物理地址空间)
c. 逻辑地址。分页存储器的逻辑地址由页号和页内偏移两部分组成。d. 内存页框表。页框表的表项给出物理块使用情况:0为空闲,1为占用。
e. 页表。页表是操作系统为进程建立的,是程序页面以上是关于python D30 操作系统历史的主要内容,如果未能解决你的问题,请参考以下文章