操作系统的历史,进程,线程。

操作系统的历史、

首先是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时,让后他通过映射表,映射到物理内存上。来读取数据,这样就可以使多个进程的地址空间分离。

那么多进程是如何合作的?


简略了...懒得写了...

猜你喜欢

转载自blog.csdn.net/qq_36504018/article/details/80514901