我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。
我们每天都在用Windows操作系统,但是其实我们每天直接在打交道的并不是Windows操作系统的内核,而是Windows操作系统的人机交互界面,这个界面其实只是Windows操作系统的一个组件,在Linux上,我们使用Linux系统所使用的界面则只是Linux系统上的一个程序。所以说,我们接触的并不是这些系统的内核。久而久之,我们基本会慢慢把界面里所展示的直观的东西误认为是Windows操作系统本身,其实这是不对的。
我们来重新审视Windows操作系统,看看Windows操作系统本身典型特征和主要功能。由Windows操作系统的功能,可以知道Windows操作系统提供的服务有下面这些:提供了一个用以执行程序的环境,提供的服务有程序执行、I/O操作、文件操作、资源分配与保护、错误检测与排除等。
Windows操作系统借用了多道程序设计的理念,所谓多道程序设计技术就是指在内存中同时存放两道或两道以上的作业,这些作业同时处于运行状态,且它们在管理程序控制下,相互穿插运行。这些作业共享处理器、外设以及其他资源。
Windows操作系统的中断处理程序只能是操作系统程序,不可能是应用程序。中断处理属于系统中会对系统产生重大影响的动作,因此只允许核心态程序执行。而应用程序通常指用户程序,运行在用户态下,不能进行这些操作。
虚拟
说到操作系统的虚拟,你是怎么理解的?基本上可以有下面三种描述 :
①由于一台计算机配置了操作系统和其他软件,因此比一台裸机功能更强大,使用更方便,称为虚拟机。由于操作系统自身包含了若干层软件,因此该计算机系统又可称为多层虚拟机。
②如在多道分时系统中,利用多道程序设计技术可以把一台物理上的CPU虚拟为多台逻辑上的CPU,而供多个终端用户使用。
③虚拟存储器,仅把作业的一部分装入内存便可运行作业,从逻辑上对内存容量进行了扩充。又如在设备管理中虚拟设备技术的使用,可将一台物理设备变换为若干台逻辑上的对应物。
控制
在Windows这么一个具有分时特点的操作系统中,有一个程序的功能如下:
(1)将文本数据从文件中读出。
(2)排序
(3)将排好序的数据写入文件。
下面我们从分时操作系统对资源管理的角度以及进程的生命周期两方面,论述该程序从开始执行到结束,操作系统为其提供服务与控制的全过程。
从文件中读数据时,通过read系统调用完成。它首先创建一条消息,其中包含fd(文件描述符)、buffer(缓冲区)、nbytes(大小)等参数,以及表示READ类型的消息码。然后将这条消息送给文件系统,并阻塞该进程以等待文件系统的响应,文件系统在收到消息后,以消息类型为下标查找过程表,调用相应过程处理读请求。数据输入完成后,操作系统切换到排序进程,开始进行排序工作。在排序工作结束后,操作系统调用write系统调用来完成,write系统调用将进程缓冲区中的数据写到与文件描述符关联的文件中。和read系统调用非常相似,同样需要3个参数:fd、buffer、nbytes。两个系统调用都返回所成功传送的字节数,或者发送一个错误条件的信号并返回-1。
操作系统与硬件的关系:操作系统是覆盖在硬件上的第一层软件,它管理计算机的硬件资源。操作系统为用户完成所有与硬件相关的操作,从而极大方便了用户对硬件资源的使用,并提高了硬件资源的利用率。操作系统与其他系统软件的关系:操作系统是一种特殊的系统软件,其他系统软件运行在操作系统的基础之上,可获得操作系统提供的大量服务,也就是说,操作系统是其他系统软件与硬件之间的接口。
保护
对于一个正确运转的计算机系统,保护操作系统是非常重要的。但为了向用户提供更大的灵活性,应尽可能少地对用户加以限制。下面列出的各操作通常是加以保护的。试问至少有哪几条指令需加以保护?
(1)改变成用户方式。
(2)改变成系统方式。
(3)从存放操作系统的存储区读取数据。
(4)将数据写到存放操作系统的存储区上
(5)从存储操作系统的存储区取指令。
(6)打开计时器。
(7)关闭计时器。
操作2、4应加以保护。因为这两条操作是对操作系统本身的内容加以修改。如果交由用户任意操作就会对操作系统造成破坏并最终导致系统运行出错或系统崩溃,所以应在任何情况下加以保护。其他几种操作在一般情况下也应加以保护,但即使这些操作交由用户操作,也不会出现像上述两种操作那样的破坏性。
函数
我们再来说一说库函数与系统调用的区别和联系。
区别:库函数是语言或应用程序的一部分,可以运行在用户空间中。而系统调用是操作系统的一部分,是内核提供给用户的程序接口,运行在内核空间中。
联系:许多库函数都会使用系统调用来实现功能。没有使用系统调用的库函数,执行效率通常比系统调用高,因为使用系统调用时,需要上下文的切换以及状态的转换(从用户态转为核心态)。
调度
Windows操作系统具有分时兼批处理的功能,那我们能不能设计一个合理的队列调度策略,使得分时作业响应快,批处理作业也能及时得到响应。
我想我们是可以的。批处理系统中,将作业依次以脱机输入方式输入到磁带上,监督程序依次执行磁带上的作业,作业执行时用户无法干预其运行。批处理系统按照发展历程可分为单道批处理系统和多道批处理系统,主要区别为内存中同时存在单个或多个作业。多道批处理系统中的一道程序因I/O请求而暂停执行时,借助中断技术,CPU转而去运行另一道程序。
我们可设计两个优先级队列。分时作业进入高优先级队列,采用短时间片的时间轮转法调度。当高优先级队列空时,调度低优先级的成批作业,并给予较长的时间片。
指令
然后,我们再从指令的角度来看看操作系统,假定Windows操作系统下面指令已装入指令寄存器,则执行时不会导致CPU从用户态变为内核态的有哪些呢?
第一条命令 DIV R0,R1;(R0)/(R1)->R0
第二条命令 INT n; 产生软中断
第三条命令 NOT R0; 寄存器R0的内容取非
第四条 命令 MOV R0,addr; 把地址addr处的内存数据放入寄存器R0中
第一条命令中若R1中的内容为0,则会出现内中断,从用户态变为内核态;第二条 命令软中断在内核态执行;第三条命令寄存器取非不会产生中断,且不属于其他操作系统内核,故不会变为内核态;第四条addr是主存地址,访存需要进入内核态。
作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。