计算机基础知识之操作系统

操作系统的诞生

现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现细节,并且管理优化这些部件是一件挑战性极强的工作。所以,我们需要为计算机安装一层软件,也就是操作系统。操作系统的任务就是用户程序提供一个简单清晰的计算机模型,并管理以上所有设备。


操作系统所处位置图例:

  • 我们将整个计算机分为硬件和软件,操作系统充当软件和硬件之间的媒介

  • 操作系统使得程序员可以用标准化机制 和 输入输出硬件(I/O)交互。还有就是说,程序员只负责编写程序,如何调用、处理程序的任务就交给了操作系统

总结:操作系统是一个用来协调、管理和控制计算机硬件和软件资源的系统程序,其中包括:文件系统、内存管理、设备管理和进程管理。它位于硬件和应用程序之间。需要注意的是,操作系统本质上也是一个软件,它由硬件上的程序进行调用运行。



CPU的资源利用

我们知道,CPU的运算是很快的,而 I/O、打印机之类的设备运行很慢,这导致了一个后果,CPU闲置(程序阻塞在I/O上,这很浪费资源)

我们想实现的是:当cpu遇到阻塞时,它会把程序休眠,切换到下一个程序,等到阻塞的任务完成了,再回过头来进行运行处理。 所以我们需要有一种方式来最大限度的利用它,这样使得多个程序可以同时运行,在单个CPU上共享时间——“多任务处理”



内存地址的分配:

每个程序都会占用一些内存,当切换到另一个程序时,我们不能丢失数据,需要记录当前状态,以方便回过头来处理程序时不会丢失数据。

解决办法就是: 给每个程序分配专属内存块

  • 把程序A分配到内存地址0~999
  • 把程序B分配到内存地址1000~1999

分配内存地址面临的一个问题:

如果一个程序请求更多内存,操作系统会决定是否同意,以及决定分配具体哪些内存块。这样虽然灵活性很好,但是会遇到个问题,由于更多的内存块是后续申请的,同个程序的内存块可能分配到非连续的情况。



虚拟内存

其实真正的程序可能会分配到内存中数十个地方,这对于程序员来说很难跟踪,为了隐藏这种复杂性,操作系统会把内存进行“虚拟化”—— 称为虚拟内存,程序可以假定内存总是从地址0开始,而实际物理地址,被操作系统隐藏和抽象了。

如上图所示,此时程序B的虚拟内存地址为0~999,而实际的物理地址,却是1000~1999

什么意思呢?或者说,这么做的好处是什么? 有了虚拟内存之后,程序员不用关心实际的内存地址,操作系统会自动处理虚拟内存和物理内存之间的映射

这种功能对于程序A的情况更为有用: 程序A的物理内存是不连续的,而从程序A的角度上看,它是连续的(虚拟内存)

这种机制使程序的内存大小可以灵活增减,叫“动态内存分配”,它的简化,为操作系统同时运行多个程序提供了更大的灵活性



内存保护

给程序分配专用的内存范围,还有另外一个好处: “程序之间的隔离”

程序与程序直接互相独立,互不影响。内存保护是操作系统对计算机上的内存进行访问权限管理的一个机制。内存保护的主要目的是限制某个进程访问的只是操作系统配置给它的地址空间。这个机制可以防止某个行程,因为某些程序错误或问题,而有意或无意地影响到其他进程或是操作系统本身的运行状态和数据。

这也是程序与程序之间不能直接通信的原因。