操作系统运转机制核心原理

来源:互联网 发布:js鼠标移入添加样式 编辑:程序博客网 时间:2024/05/22 01:44
PC的外围硬件系统构成趋近固定,因此可以轻易的在操作系统内部划分内核空间与用户空间,系统内核与硬件设备驱动位于内核空间,用户程序位于用户空间。
内核空间是固定的通过添加预定义的接口,运行中的操作系统可以通过模块内部定义约定知道这些模块究竟是干什么的。在需要使用某些功能的时候,能够根据预定义的操作调用这些模块的功能,执行操作。当然这并不意味着操作系统在运行过程中必须要将这些东西完全载入内存,某些系统拥有配置机制,可以通过操作系统的配置机制感知外围设备配置情况,根据配置信息动态载入内核空间模块。某些操作系统可能通过用户空间载入驱动,这可以理解为内核空间中同样存在一个抽象的设备驱动,外围设备实现了抽象设备定义的功能接口。系统首先载入抽象模块,之后根据配置信息载入对应的设备驱动程序,这样做的好处是当数据出现错误,程序出现bug的时候,可以在内核空间中利用预设的检查手段发现问题,规避问题,做出补救。
用户程序处于用户空间,用户空间与内核之间通过固定的函数(系统API)调用与通讯。用户空间中程序是不固定的,不固定意味着各种可能。系统通过特定的机制将应用程序的代码段加载到内存(执行空间)中,这个机制必定是固话在系统中的,是系统的必须组成,而不是像用户程序一样的插件程序。操作系统中如果是通过特定明确的应用程序载入其它程序,只能说明此应用程序是操作系统内部机制的包装,执行一些特殊操作,例如版本验证等。系统通过任务轮换机制切换执行的程序。

操作系统有两个核心,事件队列与任务循环队列。
操作系统管理整个计算机的硬件资源,硬件资源管理的方式基于事件驱动,操作系统预定义一些任务沟通CPU外围设备。当系统正常运行之后,通过内部机制载入应用程序代码段,执行操作。
当需要利用外围设备的时候,程序调用内部机制生成一个事件消息,消息进入操作系统的核心事件队列中,操作系统会逐一执行核心实践队列中的事件,事件可能会调用各种硬件资源完成操作,程序与硬件之间的各种数据交互由操作系统接管。
系统执行的应用程序在启动之后,会被添加到系统的任务循环队列中,在这个队列中一个固定的单元代表着一个应用程序执行序列,系统会根据内部算法在循环队列的所有任务块中切换。启动程序的时候添加任务块,结束程序的时候,清空该任务块。任务块中拥有至少一个空任务,当系统无操作的时候,闲置等待。
任务循环队列就是俗称的进程队列。
那么他在响应CPU的各种中断的时候,同样会先运行中断服务程序将CPU当前现场保留下来,之后将CPU收到的中断相关信息记录下来,将这个信息投入到分析任务序列。专门的分析程序会根据系统中应用程序、驱动程序、系统预设在系统中的注册信息,生成一个专门的事件信息,这个事件信息就是操作系统对于外部输入的所有响应了。之后这个事件会被投放到专门的事件处理队列中去。从MFC中分析出的理论是,系统分析得到的事件针对的是哪一个服务、软件、预设事件。就将它投入到该软件内部的事件队列【消息循环】中。之后再根据软件内部自定义的消息路由选择不同的分支进行处理。

以上机制的运行过程事例:
当应用程序启动,操作系统通过内部机制,将程序载入执行空间,将执行空间的PC值写入任务块,作为当前任务执行进度,操作系统在所有的任务块之间进行切换,任务块执行过程中,系统会监视PC值变化,当任务执行需要调用硬件功能,应用程序调用的接口会自动生成一个事件,该事件包含数据信息与操作的模块信息等。事件被投掷到操作系统的核心事件队列中,系统执行过程从用户空间切换到内核空间,在内核空间中,操作系统根据事件块中包含的信息对外围硬件进行操作,获取的数据通过接口返回给应用程序,系统执行由内核空间返回。
操作系统对于硬件设备的操作是分设备的,可能只有一个总的事件队列,也可能每个设备都有一个事件队列,但是即使只有一个时间队列也肯定会根据设备进行二次映射,将所有事件映射为每个设备都有一个事件队列的形式。当应用程序执行到内核空间对内核资源进行操作的时候会进入该资源的事件队列中,如果该队列中没有其他事件,队列将立即执行当前事件,如果之前有事件并未执行完成,系统继续执行上一事件,直到上一事件执行完成,外部表现就是当前程序挂起。当系统切换任务块,如果队列中的事件处理完成,程序即可从内核空间中获取数据,数据取出后,系统可能清除事件队列中对应的事件块。如果队列中的事件未处理完成,继续执行事件操作。
所以说挂起并不是系统停止运行,只不过是系统在执行其它事件。由此,多线程切换过程中的资源锁也就概念清楚明白了。
1 0