操作系统的历史、
首先是IBM7094,装了一个监控系统。当时是批处理操作系统。工作方式大概是这样的:
一个任务一个任务的执行,如果一个任务完成了,就将结果打到输出磁带上。如果出现了错误,就由程序员将这个错误的任务拿出,修改好了再放回来。
这个系统叫IBSYS。
然后到了OS/360。
计算机开始进入多个行业。不只需要计算。也有IO任务。需要多道程序。所以作业之间的切换和调度成为核心。
然后到MULTICS系统。
这个系统只是在OS/360上添加了一个新功能。比如服务器中,多个人登陆一台服务器,他会将每个人的作业都跑一段时间。
然后就到了UNIX系统。
这是一个简化的MULTICS,核心概念差不多,但是更灵活和成功。
然后就到了Linux,这里主要是源代码的公布,导致Linux非常火。PC开始普及。
之后开发了操作系统CP/M:写命令让用户用,执行命令对应的程序,单任务执行。
1980出现了8086 16位芯片,从CP/M基础上开发了QDOS(Quick and Dirty OS)
然后QDOS到MS-DOS。Bill Gates 开始进入历史舞台。
他和Paul Allen 开发了BASIC解释器,开创了微软,1977年Bill Gates开发了FAT管理磁盘。然后和QDOS合作将这些技术打包,改名位MS-DOS。
之后就是MS-DOS转变为windows了。
二、进程。
管理CPU,要想管理CPU,首先怎么用CPU。其实很简单。只要将PC设置到代码段的开始。那么CPU就开始计算。那么我们提出疑问。
如上图,很明显IO的速度要比计算的速度慢的多。大概100W条计算,等于一条IO。那我们能不能跳过这条IO命令呢,明显不能。因为这条IO可能输入了一个值,而下面的程序要用到这个变量。如果还是单道处理的话,那么CPU的效率就会极低,不运算等着输入。所以我们应该在输入输出时,切到其他程序中。来让CPU继续工作。这样叫多道处理。
那么怎么做到呢。比如我在程序1的上半部分执行了ax=50;然后切到程序2,又切回来后。继续往下执行,但是这时ax是已经又值的,所以切出这个程序时,我们需要来保持这个程序的状态。所以当然与静止的代码块不一样。我们将这种正在运行的程序叫做进程,并用一个结构体PCB来表示每个程序运行的状态。到这,我想到了一种算法,递归。也是这样的思想。
然后如何将这么多个程序次序推进呢。
首先开机后,会自动运行第一个程序。
。而windows会启动桌面程序。然后进程分为一些队列。如图
我们给出进程状态图。
然后再根据源码说。
首先将这个任务的状态变为等待,将这个任务放到diskwaitqueue中。执行schedule()函数。
然后从getnext函数中拿出下一个进程。这个叫调度。而下面的switch_to显而易见叫切换。关于调度有很多种方法。比如FIFO是最公平的策略,也就是谁先排的就先执行谁。还有一种方式是Priority。是不是很眼熟。优先队列。消耗时间小的先执行。但是想想也知道,有可能会导致一些程序永远执行不到。所以还有一些细节操作,不再说了。调度在后面会细讲,我们先讲如何切换。那么我们看switch_to的源代码
思想很简单,切换的时候,讲cpu的计算结果,赋值给PCB1.切到PCB2的时候,将PCB2的状态转移过来。接着计算即可。
下一个问题:多个进程可能会用到同一个内存。如果进程1修改了内存100中的数值,进程2再用那么就会使进程2崩溃。
解决的办法:限制对地址100的读写。如何限制,当进程执行100时,让后他通过映射表,映射到物理内存上。来读取数据,这样就可以使多个进程的地址空间分离。
那么多进程是如何合作的?
简略了...懒得写了...