深入理解Windows操作系统机制(二)

news2024/11/17 21:33:48

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。

我们每天都在用Windows操作系统,但是其实我们每天直接在打交道的并不是Windows操作系统的内核,而是Windows操作系统的人机交互界面,这个界面其实只是Windows操作系统的一个组件,在Linux上,我们使用Linux系统所使用的界面则只是Linux系统上的一个程序。所以说,我们接触的并不是这些系统的内核。久而久之,我们基本会慢慢把界面里所展示的直观的东西误认为是Windows操作系统本身,其实不是。

今天我们来重新审视Windows操作系统,看看Windows操作系统本身典型特征和主要功能。由Windows操作系统的功能,可以知道Windows操作系统提供的服务有下面这些:提供了一个用以执行程序的环境,提供的服务有程序执行、I/O操作、文件操作、资源分配与保护、错误检测与排除等。

Windows操作系统借鉴了多道程序设计的理念,所谓多道程序设计技术就是指在内存中同时存放两道或两道以上的作业,这些作业同时处于运行状态,且它们在管理程序控制下,相互穿插运行。这些作业共享处理器、外设以及其他资源。

Windows操作系统的中断处理程序只能是操作系统程序,不可能是应用程序。中断处理属于系统中会对系统产生重大影响的动作,因此只允许核心态程序执行。而应用程序通常指用户程序,运行在用户态下,不能进行这些操作。

Windows操作系统的系统调用按功能可分为6类,包括进程管理、文件操作、设备管理、主存管理、进程通信和信息维护。

如果Windows程序正在试图读取某个磁盘的第100个逻辑块,则使用Windows操作系统提供的系统调用。本文所需要的接口就属于文件操作相关的调用。

在多道程序设计下,宏观上进程是同时运行的,但是在微观上,单处理器某时刻只能处理一个进程,所以进程与进程之间不能并行执行。处理器、通道、设备都能并行执行,比如同时打印(设备)、计算(处理器)、传输数据(通道控制内存与外存间数据交换)。

这里要注意区别并发与并行的含义,并行性是指两个或多个事件在同一时刻发生,而并发性是指两个或多个事件在同一时间间隔内发生。虽然同时刻只能处理一个进程,但多个进程可以并发执行。

实际上,Windows操作系统在系统调用、中断、库函数、原语这些概念中,只有系统调用是操作系统提供的接口。系统调用是能完成特定功能的子程序,当应用程序要求操作系统提供某种服务时,便调用具有相应功能的系统调用。

库函数则是高级语言中提供的与系统调用对应的函数(也有些库函数与系统调用无关),目的是隐藏指令的细节,使系统调用更为方便抽象。但要注意,库函数属于用户程序而非系调用,是系统调用的上层;中断及原语是计算机系统底层的基础功能,属于系统调用的下层。

系统提供封装好的系统调用供应用程序使用,应用程序无须考虑系统底层的内容,仅考虑上层的操作即可;中断是系统内部对于事件响应的机制,对于应用程序来说是透明的,不会提供给应用程序直接使用;同样库函数和原语都是面对操作系统底层的,不会直接提供给应用程序。
  

缺页处理与时钟中断都属中断,会对系统造成影响,因此只能在核心态执行。进程调度属于系统的一部分,也只能在核心态执行。命令解释程序属于命令接口,是操作系统提供给用户所使用的接口,因此可以在用户态执行。

CPU状态分为核心态和用户态,核心态又称特权状态、系统态或管态。通常,操作系统在管态下运行,CPU在管态下可以执行指令系统的全集。用户态又称常态或目态,机器处于用户态时,程序只能执行非特权指令,用户程序只能在用户态下运行。

CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序不能使用。
  

Windows操作系统常见的特权指令有以下几种:

(1)有关对I/O设备使用的指令,如启动I/O设备指令、测试I/O设备工作状态和控制I/O设备动作的指令等。

(2)有关访问程序状态的指令,如对程序状态字(PSW)的指令等。

(3)存取特殊寄存器指令,如存取中断寄存器、时钟寄存器等指令。

(4)其他特权指令。

本文中缺页处理程序、时钟中断处理程序都是要修改中断寄存器,进程调度程序要修改程序状态字。

对于Windows操作系统的系统调用、外部中断、进程切换、缺页这几种中,一般来讲不可能发生在用户态的是进程切换。判断能否在用户态执行的关键在于事件是否会执行特权指令。

首先看系统调用,系统调用是系统提供给用户程序调用内核函数的,当用户程序执行系统调用时,会使CPU状态从用户态切换至核心态并执行内核函数,执行结束之后将控制权还给用户程序,并且CPU状态从核心态切换至用户态。从这个过程可以看出,虽然系统调用的执行过程中CPU需要切换至核心态,但系统调用(或者引用、调用)是在用户态发生的,是系统特意为用户态设计的,因此系统调用可以发生在用户态。

外部中断,大家一听到“中断”很容易认为涉及中断的都应该是核心态的事情,而不能在用户态执行,错了!中断在系统中经常发生,如键盘输入会引发外部中断(外部中断是指由外部事件引起的中断,比如单击鼠标和键盘输入等操作引起的中断),进程缺页会产生缺页中断等,这些都经常发生在用户进程中,自然这些也都是用户态的事件。

以键盘输入举例,一个用户进程需要用户输入一串命令,当用户用键盘输入时会引发外部中断(此时CPU还是用户态),此时系统会切换至核心态执行中断处理程序(这时CPU转变为核心态),处理程序处理之后将输入结果返回给用户程序并将CPU状态切换为用户态,中断处理结束。由此过程可见,中断的发生和处理与系统调用类似,都是发生在用户态,通过切换至核心态完成对应功能,然后返回至用户态。系统调用和中断的发生是在用户态,处理是在核心态。

再来看缺页,与外部中断类似,用户态执行进程缺页时会产生缺页中断(中断发生在用户态),然后系统转入核心态进行缺页中断处理,再返回用户态,将控制权交还给用户进程。因此缺页也可以发生在用户态。

那为什么进程切换不能发生在用户态。进程切换实际上是对于程序状态的修改,因此要修改程序状态字,这是特权指令,必须在核心态执行。

大家是否理解我上面说的内容?

下面来看一下计算例子。一个多道批处理系统中仅有P1和P2两个作业,P2比P1晚5ms到达。他们的计算和I/O操作顺序如下:

P1:计算 60ms,I/O 80ms,计算 20ms。

P2:计算 120ms,I/O 40ms,计算 40ms。

若不考虑调度和切换时间,则完成两个作业需要的时间最少是多少呢?我们来画一下图:

 经过图这么一画,就知道完成两个作业需要的时间最少是260ms。

中断的发生通常是突然的,如地址越界等,往往是系统无法预知的(外部输入中断也是无法预知的,计算机不会知道用户什么时候用键盘输入)。当系统发生中断时要转入中断处理程序,处理完之后要返回到发生中断时的指令处继续执行,由于处理中断时CPU可能会切换状态(如果在核心态发生中断则始终为核心态,不需要切换),因此中断处理返回时就需要还原当时的程序状态,包括处理器信息等,这就用到了程序状态字寄存器所存储的内容。程序状态字寄存器用于记录当前处理器的状态和控制指令的执行顺序,并且保留和指示与运行程序有关的各种信息,其主要作用是实现程序状态的保护和恢复,所以中断处理时一定要将PSW压栈保存。子程序调用是系统能够预知的,而且子程序调用通常是在进程内部执行,不会更改程序状态,即便更改程序状态,只要更新寄存器就行,而不需要保存,因为一切都是系统预料到的,不需要保护和恢复,所以,子程序调用主要保存局部参数信息等,不需要将程序状态字压栈。

所以,中断处理和子程序调用都需要压栈以保护现场。中断处理一定会保存而子程序调用不需要保存其内容的是程序状态字寄存器。中断处理和子程序调用对程序计数器、通用数据寄存器、通用地址寄存器的操作都是相同的。


  22.D。用户平时开机时首先启动的是存于主板上ROM中的BIOS程序(它被固化在主板的ROM芯片上,保存着计算机最基本的输入/输出程序、开机后自检程序和系统自启动程序,其主要功能是为计算机提供最底层的、最直接的硬件设置和控制),其次再由它去调用硬盘中的操作系统(如Windows系统),将操作系统的程序自动加载到内存中的系统区,这段区域是RAM,答案选D。
  23.B。当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时,处理器处于特权级最高的(0级)内核代码中执行。
  当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态),即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序时突然被中断程序中断,此时用户程序也可以象征性地称为处于进程的内核态,因为中断处理程序将使用当前进程的内核栈。
  这与处于内核态的进程的状态有些类似:
  ●用系统调用时进入核心态。Linux对硬件的操作只能在核心态,这可以通过写驱动程序来控制。在用户态操作硬件会造成coredump。
  22
  要注意区分系统调用和一般的函数。系统调用由内核提供,如read()、write()、open()等。而一般的函数由软件包中的函数库提供,如sin()、cos()等。在语法上两者没有区别。
  ●一般情况下,系统调用运行在核心态,函数运行在用户态。但也有一些函数在内部使用了系统调用(如fopen(),这样的函数在调用系统调用时进入核心态,其他时候运行在用户态。
  经过上述讲解,我们来看选项I,整数除以零,会引发中断,会进入内核态。
  选项Ⅱ,sin()函数调用,是由软件包中的函数库提供,在用户态下即可执行。
  选项Ⅲ,系统调用,肯定需要进入内核态。
  综上所述,本题应选B。
  24.D。trap指令、跳转指令和压栈指令均可以在用户态执行,其中trap指令负责由用户态转换成为内核态。而关中断指令为特权指令,必须在核心态才能执行,选D。
  25.B。外部中断处理过程,程序计数器的内容由中断隐指令自动保存,通用寄存器的内容由操作系统保存。
  26.C。A选项中若R1中的内容为0,则会出现内中断,从用户态变为内核态;B选项软中断在内核态执行;C选项寄存器取非不会产生中断,且不属于其他操作系统内核,故不会变为内核态;D选项addr是主存地址,访存需要进入内核态。
  27.A。批处理系统中,将作业依次以脱机输入方式输入到磁带上,监督程序依次执行磁带上的作业,作业执行时用户无法干预其运行,I错误。批处理系统按照发展历程可分为单道批处理系统和多道批处理系统,主要区别为内存中同时存在单个或多个作业,Ⅱ正确。
  多道批处理系统中的一道程序因I/O请求而暂停执行时,借助中断技术,CPU转而去运行另一道程序,Ⅲ正确。
  28.C。正如1.3.3小节系统调用提到的执行流程一样,执行系统调用时,首先将系统调用所需的参数传递至系统内核,然后通过陷入指令进入内核态,将返回地址压入栈中以备使

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/756845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 磁盘满了的解决方案

步骤说明: 第一步:查看磁盘情况 我们要知道哪个磁盘,我们首先要知道各个磁盘占用情况!可以使用以下命令 # 查看磁盘状态 df -h 解释一下: df: 用于显示目前在Linux系统上的文件系统的磁盘使用情况统计。 -h&…

为 GitHub 设置 SSH 密钥

1. 起因 给自己的 github 改个名,顺便就给原来 Hexo 对应的仓库也改了个名。然后发现 ubhexo clean && hexo generate && hexo deploy 失败了,报错如下: INFO Deploying: git INFO Clearing .deploy_git folder... INFO …

【淘宝API接口系列】,商品详情接口响应参数有哪些?响应示例是否满足

商品数据:淘宝提供了商品的基本信息,包括商品名称、描述、规格、价格、销量、库存等信息。此外,也可以通过淘宝提供的API接口来获取商品的图片、评价、物流信息等详细数据。 响应参数 Version: Date:2022-04-04 名称类型必须示例值描述 ite…

设计模式概述及七大原则

一、设计模式的目的 编写软件过程中,我们会面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好: 代码重用性 (即&a…

微信小程序下拉刷新获取数据和触底事件刷新实现

一、下拉刷新 1.json文件 说明:开启下拉刷新,然后设置窗口的背景色,方便观看。 "enablePullDownRefresh": true,"backgroundColor":"#FFC0CB" 2. js文件 说明:重新发起请求,并显示加…

c++11 标准模板(STL)(std::basic_istream)(八)

定义于头文件 <istream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的…

【AT89C52单片机项目】音乐播放器的设计

实验目的 用51系列单片机设计一个可以切歌的音乐播放器。 实验仪器 AT89C52单片机。 音乐播放模块。 设计要求 采用重装定时器计数方式1的初值来实现发出不同频率的声音&#xff0c;通过控制延时长度来实现不同的节拍&#xff0c;之后将音乐数据表填入&#xff0c;即可实…

【python】python汽车保险数据分析(数据+代码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、51CTO技术博主 &#x…

【C++/嵌入式笔试面试八股】三、01.ARM体系架构 | 中断与异常

ARM体系架构 ARM 01.ARM产品线、 02.ARM体系结构 03.ARM硬件系统组成和运行原理🍊 直接在flash上执行较慢(NOR flash可以直接运行,NAND flash不行,按块访问),搬到内存运行,叫重定位 控制器负责取值译码 ALU负责运算 寄存器负责暂存数据 一条机器指令的执行过程,包含

SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文

场景 为防止数据泄露&#xff0c;需要在插入等操作时将某表的字段在数据库中加密存储&#xff0c;在需要查询使用时明文显示。 Sharding Sphere ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈&#xff0c; 它由Sharding-JDBC、Sharding-Proxy和Shardi…

如何采集来赞达Lazada虾皮shopee各区域商品详情页面数据

以虾皮shopee根据ID取商品详情 API 返回值说明为例 shopee.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;注册Key和secret接入secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&am…

C++学习之static关键字小结

static在C编程中随处可见&#xff0c;但是其真实的使用方式没有总结过&#xff0c;因此在使用中经常出一些问题&#xff0c;下面就C编程中static关键字在的几种用法进行相关总结说明如下。 1、在函数内部定义带有static关键字的变量时&#xff0c;则变量是保存在静态存储区的&…

[QT编程系列-13]:QT快速学习 - 1- 初识

目录 第1章 QT的介绍 1.1 QT VS MFC 1.2 QT历史 1.3 QT的应用 1.4 QT学习方法 1.5 QT对象树 1.6 2-8定律 1.7 QT优势&#xff1a; 1.8 QT支持的平台 第2章 QT UI是各种控件对象的堆积 第3章 QT UI是各种控件的堆积 第4章 控件窗口的控制 第1章 QT的介绍 1.1 QT V…

【广州华锐互动】VR石油化工作业实训平台

VR石油化工作业实训平台是一种基于虚拟现实技术的教学、科研辅助工具&#xff0c;可以提供交互式的实验环境&#xff0c;让学生和研究人员在虚拟环境中进行实验。该系统可以帮助学生更好地理解石油炼制过程中的各个环节&#xff0c;包括原油加工、分离、精制等。 通过这种方式…

Python 数据管理

数据管理是收集、收集原始数据并将其转换为另一种格式的过程&#xff0c;以便在更短的时间内更好地理解、决策、访问和分析。 数据管理的重要性 数据管理是数据科学项目中非常重要的一步。下面的例子将解释它的重要性&#xff1a; 图书销售网站希望显示不同领域的畅销书&#…

推荐一款IDEA神级插件【Bito】而且免费!

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…

轮播图,用vue来写一个简单的轮播图

轮播图&#xff0c;用vue来写一个简单的轮播图 写的很简单&#xff0c;就是一个小练习&#xff0c;哈哈哈&#xff0c;下面的几张图分别是轮播图的第一张&#xff0c;中间图&#xff0c;最后一张的效果图。 使用了vue 中的属性绑定 v-bind ,v-show 以及 事件监听 v-on 指令。 思…

NZ13:VBA给数据加密处理

【分享成果&#xff0c;随喜正能量】爱出者爱返&#xff0c;福往者福来。怀揣一颗善良的心&#xff0c;本本分分&#xff0c;坦坦荡荡&#xff0c;多去帮助需要的人&#xff0c;坚持善良做人&#xff0c;才能不负于人&#xff0c;不负自己。。 我的教程一共九套及VBA汉英手册一…

黄皮书-线接触热弹流润滑 Fortran+Matlab转译代码

原Fortran代码有错误&#xff0c;进行了修改&#xff0c;数值上差别不大。根据Fortran代码转的Matlab&#xff0c;可以完美运行&#xff0c;但是因为精度问题有差异&#xff0c;只能说趋势是一致的。 需要私我-资源里只是Fortran运行结果

Spark(25):Spark部署模式对比

目录 0. 相关文章链接 1. Spark支持的集群管理器 2. YARN 模式运行机制 2.1. YARN Cluster 模式 2.2. YARN Client 模式 3. Standalone 模式运行机制 3.1. Standalone Cluster 模式 3.2. Standalone Client 模式 0. 相关文章链接 Spark文章汇总 1. Spark支持的集群管…