操作系统笔记(王道考研) 第一章:计算机系统概述_王道操作系统笔记cs_lee-程序员宅基地

技术标签: 学习  笔记  操作系统  王道考研  考研  

大部分内容基于中国大学MOOC的2021考研数据结构课程所做的笔记,后续又根据2023年考研的大纲增加了一些内容,主要有操作系统引导、虚拟机、多级队列调度算法、互斥锁、调度器和闲逛进程、内存映射文件、文件系统的全局结构、虚拟文件系统、固态硬盘SSD、输入输出应用程序接口 、驱动程序接口等等。

感谢我的室友HXN,他帮我写了一部分第五章的内容。

课程内容和西电平时讲课的内容大致重合,西电可能每章会多讲一点UNIX系统的实例,可以听完这课再快速过一遍老师的课件防止漏掉什么内容。

这门课讲的其实不算特别硬核,没怎么涉及具体的代码。不过我其实感觉操作系统是个大无底洞,能学到多深基本取决于愿意花多少时间和精力。如果有闲心,推荐看下南大蒋炎岩老师的《操作系统:设计与实现》和哈工大李治军老师的《操作系统》,讲的更深入,当然难度也相应的大的多。

 

其他各章节的链接如下:

操作系统笔记(王道考研) 第一章:计算机系统概述

操作系统笔记(王道考研) 第二章:进程管理(1)

操作系统笔记(王道考研) 第二章:进程管理(2)

操作系统笔记(王道考研) 第三章:内存管理

操作系统笔记(王道考研) 第四章:文件管理

操作系统笔记(王道考研) 第五章:输入输出(I/O)管理

其他各科笔记汇总

计算机系统概述

操作系统基本概念,功能

image-20210304193246989

操作系统的概念,定义

image-20210304183730825

image-20210304183907743

在任务管理器界面,我们就可以看到现在系统当中运行的进程有哪些。所谓进程就其实是正在运行的软件和程序,从这个地方可以看到操作系统肯定是在对软件进行管理。在右边这个界面可以看到操作系统对CPU,内存等等这一系列硬件资源的使用情况也是在监控的,操作系统肯定是在对硬件进行管理的。因此操作系统作为软件和硬件之间的层次,是系统资源的管理者,既管理软件资源也管理硬件资源。

接下来会对上图列出的操作系统3个功能进行更进一步的细分和分析,来更形象地体会操作系统的作用

操作系统的功能和目标——作为系统资源的管理者

首先要看的是操作系统作为软件和硬件中间的层次,它是系统资源的管理者。下图以QQ视频聊天为例

image-20210304184938750

各步体现的操作系统提供的功能如下,具体说明此处略过不计

Step1:文件管理

Step2:存储器管理(也叫做主存管理,内存管理)

Step3:处理机管理

Step4:设备管理

以上功能都会在后面几章做具体讲解,操作系统在后期要重点学习的就是它作为系统资源的管理者要如何设计和实现这些功能。

操作系统的功能和目标——向上层提供方便易用的服务

image-20210304190934307

image-20210304191031290

早期的一些操作系统并没有图形化界面,都是让用户通过命令接口的方式,也就是命令行的方式和操作系统进行交互。命令接口又可以分为联系命令接口和脱机命令接口,都是操作系统对上层提供的两种接口

image-20210304191502419

image-20210304191516323

.bat文件里有一堆命令,但本质上和time命令没有任何区别,我们只不过是把这一系列的命令罗列在了清单里,然后当我们执行.bat文件时操作系统其实就是根据这个文件当中的命令一条一条地往后执行。

 

刚才我们提到的三种接口都是可以让普通用户直接使用的,操作系统还有一种对外提供的接口叫做程序接口,这种接口是给程序员使用的。

image-20210304191848727

普通程序员使用了C语言提供的库函数printf。这个库函数在底层实现的时候其实是使用了操作系统提供的系统调用的功能,操作系统在收到系统调用的请求之后,它才会替我们去操作硬件显示器,并且在显示器上显示出“Hello world”。

很多操作系统中都提供了上百种的系统调用,由这些系统调用组成了所谓的程序接口。

 

总结一下

image-20210304192731730

操作系统的功能和目标——作为最接近硬件的层次

image-20210304193224343

 

操作系统的四个特征

image-20210304193325965

操作系统的特征——并发

image-20210304193451682

image-20210304193819959

操作系统的特征——共享

image-20210304193852502

有的时候这个同时共享也有可能是微观上也确实在同时地共享资源,比如边打游戏边听歌,扬声器设备一边在播放游戏的音效一边在播放音乐。在这种情况下,扬声器的声音输出设备是真的在微观上也是同时正在被音乐播放器和游戏这两个进程同时使用的

操作系统的特征——并发和共享的关系

image-20210304194546530

总之并发性和共享性互为存在条件

操作系统的特征——虚拟

image-20210304195356060

image-20210304195517013

image-20210304195619220

操作系统的特征——异步

image-20210304195648884

 

操作系统的发展与分类

image-20210304195750124

绿框内为重点内容

手工操作阶段

由有无小孔代表0和1

image-20210304201102886

批处理阶段——单道批处理系统

image-20210304201223792

image-20210304201252899

批处理阶段——多道批处理系统

image-20210304202212514

分时操作系统

image-20210304202357393

实时操作系统

image-20210304202445797

其他操作系统

image-20210304202524841

 

操作系统的运行机制

image-20210304202734063

预备知识——程序是如何运行的?

像我们平时用C语言代码写的程序都会经过编译器的编译工作把C语言代码翻译成二进制机器指令。像我们平时用C语言这种高级语言写的一条代码经过编译之后可能会对应很多机器指令。程序运行的过程其实就是CPU执行一条一条机器指令的过程。

“指令”就是处理器CPU能识别,执行的最基本命令。

注:很多人习惯把Linux,Windows,MacOS的“小黑框”中使用的命令也成为“指令”,其实这是“交互式命令接口”,注意与本节的“指令”区别开。本节中的“指令”指二进制机器指令

总之平时我们用高级语言编写的程序最后执行的时候肯定是要变成CPU能够读的懂的用二进制机器指令表现的这种形式,这就是程序运行的基本原理。

内核程序与应用程序

在操作系统这门课当中,我们要注意区分两种类型的程序,分别是内核程序和应用程序。我们普通程序员写的程序就是“应用程序”。微软、苹果有一帮人负责实现操作系统,他们写的是“内核程序”。由很多内核程序组成了“操作系统内核”,或简称“内核(Kernel)”。内核是操作系统最重要最核心的部分,也是最接近硬件的部分。甚至可以说,一个操作系统只要有内核就够了(eg:有的同学可能接触过容器技术,比如说Docker,在Docker容器里只需要有Linux的内核就可以实现Linux的所有功能了)。操作系统的功能未必都在内核中,如图形化用户界面 GUI。

即使没有图形化的界面我们依然可以用命令行(也就是之前说的“小黑框”)的方式来使用操作系统。所以操作系统的内核当中所包含的只是操作系统当中最重要最核心的功能

特权指令与非特权指令

既然操作系统内核是系统资源的管理者,它作为管理者的角色有时可能会让CPU执行一些比较特殊的指令

image-20210304204800786

内核态与用户态

虽然CPU能够分辨出特权指令和非特权指令,但是它又怎么分辨出此时正在执行的指令到底是一个“应用程序”的指令还是一个“内核程序”的指令呢?为了让CPU能够区分此时正在运行的指令是属于应用程序还是内核程序,CPU会被划分成两种状态,一种叫“内核态”,一种叫“用户态”。

image-20210304205515162

接下来我们要探讨的问题是CPU要怎么实现这两种状态间的切换

内核态,用户态的切换

image-20210304205722603

开机的时候需要加载我们的操作系统,然后操作系统要进行一些初始化的工作。系统初始化的工作其实就是由操作系统当中的某一些内核程序来完成的,所以在开机的过程当中需要执行内核程序,因此在这个时候,CPU肯定要处于“内核态”。

 

中断和异常

image-20210304210413584

中断的作用

image-20210304210606945

中断的类型

image-20210304210655850

内中断的例子

例子1:试图在用户态下执行特权指令(如上节中黑客攻击的例子)

例子2:执行除法指令时发现除数为0

总之若当前执行的指令本身或者指令的一些参数是非法的,则会引发一个中断信号

例子3:有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令陷入指令,该指令会引发一个内部中断信号。执行“陷入指令”,意味着应用程序主动地将CPU控制权还给操作系统内核。“系统调用”就是通过陷入指令完成的

注意陷入指令并不是特权指令。因为这个程序是运行在用户态的,而在用户态下可以执行的指令不可能是特权指令

外中断的例子

例子1:时钟中断,由时钟部件发来的中断信号

例子2:I/O中断,由输入/输出设备发来的中断信号

时钟部件每隔一个时间片(如50ms)会给CPU发送一个时钟中断信号。通过时钟中断信号就可以实现多道程序并发运行了。当某应用程序执行了几条指令后,时钟部件发现此时已经过了50ms,它会给CPU发送一个中断信号(注意这个中断信号和当前执行的指令是没有关系的,它来自CPU的外部)。然后根据我们之前学习的知识,CPU检测到该信号后会先暂停此时正在运行的应用程序,然后转而执行一个相应的内核程序来处理这个中断信号。所以接下来CPU会对时钟中断信号进行处理,并且转为内核态。在内核态下CPU开始执行内核程序来处理刚才收到的中断信号,这个内核程序执行的过程当中发现该应用程序已经用了50ms的时间,应该让下一个应用程序上CPU运行。于是接下来这个内核程序会把CPU的使用权给下一个应用程序,接下来又会切换回用户态,然后下一个程序上CPU运行。之后的过程都是类似的,通过这个例子可以看出应用程序是如何在中断机制的支持下一直不断地切换来实现并发运行的,以及中断在现代计算机中到底有多大的作用。

除了时钟发出的中断信号之外,有时候还会有来自I/O设备的中断信号。比如说某个应用程序可能会请求打印机的打印服务,打印机在打印输出完成之后会向CPU发出中断信号用来通知CPU任务完成。接下来CPU会用中断信号相对应的内核程序来对中断信号进行处理。

每一条指令执行结束时,CPU都会例行检查是否有外中断信号

image-20210304213052113

中断的分类

image-20210304213443197

中断机制的基本原理

image-20210304213512622

具体硬件上怎么实现见计算机组成原理

 

系统调用

image-20210304213800018

什么是系统调用,有何作用?

image-20210304221811746

系统调用与库函数的区别

其实我们在写程序的时候可以用汇编语言的方式来直接请求系统调用服务的,但是现在的编程更多地是使用高级语言来编程,所以我们一般会直接使用高级语言的库函数,但是这些高级语言的库函数在底层其实也会用到操作系统提供的系统调用功能来请求操作系统的服务。所以系统调用应该是比高级语言的库函数更为底层的接口。

我们的裸机之上是操作系统,操作系统向上层提供的接口是系统调用,使上面的库函数和应用程序能够通过系统调用的方式来请求操作系统的内核的服务。然后在操作系统之上各种各样的高级编程语言会用库函数的方式来封装这些系统调用,然后向更上层的应用程序的程序员来暴露一些更好用的编程接口。

不过也并不是所有的库函数都会使用系统调用

image-20210304221840615

小例子:为什么系统调用是必须的?

通过系统调用来实现并发进程对共享资源的互斥访问

image-20210304222801035

什么功能要用到系统调用?

image-20210304223050941

系统调用的过程

假设一个应用程序想要进行系统调用,它在背后需要做什么事情呢?

现有一个应用程序运行在用户态,然后这个应用程序的各个指令会被CPU依次执行。当它想要发出系统调用的时候,他需要用传参数的指令给CPU的寄存器当中传递一些必要的参数,比如说在某一个寄存器中放入了参数1,这个参数1是指明了此次要进行哪种类型的系统调用,比如说像Linux里的“folk”系统调用。传递参数的指令可能要有多条,主要看我们的系统调用需要传递几个参数。操作系统会根据应用程序提供的这些参数来判断它想要的到底是哪种服务,当这些参数都放入了寄存器之后,应用程序就会执行一条特殊的指令叫陷入指令,该指令会引发一个内中断,CPU在检测到这个内部中断信号之后,它发现这个内部中断信号是由陷入指令引起的,于是这个CPU接下来就会暂停运行这个应用程序,转而去执行处理陷入指令的那个处理程序,这个程序就是系统调用入口程序。显然接下来要执行的程序肯定是属于内核程序,因此它需要在内核态下运行,我们也可以说这个程序也是某一种中断处理程序,只不过它处理的是由陷入指令引发的那个内中断。接下来系统调用入口程序会检查寄存器里的参数,通过第一个参数它会知道此时这个应用程序想要的是这种类型的系统调用服务,于是接下来入口程序就会调用与特定的系统调用类型所对应的处理程序,然后让这个程序上CPU运行。那这个系统调用处理程序在执行的时候就可以根据应用程序传递的其他参数来看一下它所需要的具体是哪些服务。当系统调用被处理完之后CPU又会转回用户态,然后接着执行之前的那个应用程序。

image-20210304233543131

执行了陷入指令之后就意味着这个应用程序把CPU的控制权主动交还给了操作系统的内核,用这样的方式来请求操作系统的服务,注意它并不是特权指令。

image-20210304233616969
 

 
在这里插入图片描述

操作系统的体系结构(1)

image-20210304234126987

本节学习操作系统的内核应该如何设计,只需要做简要了解即可

操作系统的内核

image-20210304234312815

想要实现程序并发就必然离不开时钟管理内核功能

在执行原语的这一小段程序当中,即使有外部中断信号过来,CPU继续把原理处理完成,才去处理外部中断信号

上图提到的最底层的时钟管理,中断处理,原理这三个部分都是和硬件关联最为紧密的,所以它们必须放在内核当中。有的操作系统并不会把下面列出的几个不直接涉及硬件的管理功能放在内核当中,而只在内核当中保留与硬件接触最紧密的这些部分。

image-20210304234710784

因此这就引出了两种截然不同的内核设计方法。把所有的这些功能都包含在操作系统内核当中,这种结构就叫做大内核。而如果内核当中只保留与硬件关系最紧密的这些部分,这种内核就叫做微内核。需要注意的是如果采用的是微内核的这种结构的话,那么属于内核的这些功能是需要运行在内核态的,而不属于内核的上面的这些功能就需要运行在用户态,这会对我们系统的性能造成一定的影响,下小节会用更直观的例子来体会这点。

image-20210305001044301

操作系统的体系结构

假设现在有两种体系结构的系统。第一个系统采用的是大内核的体系结构,由于进程管理,存储管理这些功能都是被划分在内核当中的,所以这些功能的处理都需要运行在内核态,只有应用程序是运行在用户态的。而对于采用微内核结构的操作系统来说,只有和硬件联系最紧密的这些功能被划分在了内核当中,只有这些功能是需要在内核态下才可以执行的,而其他的这些功能模块在用户态下就可以运行。

假设现在一个应用程序想要请求操作系统的服务,并且这个服务的背后需要同时涉及到进程管理、存储管理、设备管理这几个功能。如果采用的是大内核的体系结构的话,那么应用程序向操作系统提出服务的请求,这个时候CPU会从用户态切换为内核态,然后开始运行这一系列的内核程序。应用程序的这个请求只需要两次变态就可以了。

而如果采用的是微内核的体系结构的话,应用程序向操作系统提出服务的请求,接下来操作系统的这几个模块都需要为操作系统服务。而进程管理这个模块在处理应用程序的请求的时候同样也需要得到内核的支持,所以这个模块对内核的访问就涉及到CPU从用户态转到内核态,服务完成之后又会从内核态转回用户态。然后同样地存储管理和设备管理这两个模块在完成相应的工作的时候也需要得到内核的支持,因此每一个模块都需要请求内核的服务,每一次请求内核的服务都会涉及到一个CPU状态转换的过程。整个过程处理需要六次变态。

 

image-20210305001314159

 

 
image-20210305003528634

后面的内容是2023年课程新加的

操作系统的体系结构(2)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hr4RYIuA-1662046315606)(操作系统.assets/image-20220901171632674.png)]

操作系统结构 —— 分层结构

每一层只能调用相邻低层所提供的接口,不能跨层调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4TdzQGn7-1662046315608)(操作系统.assets/image-20220901171724286.png)]

操作系统结构 —— 模块化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7QSFZ4xY-1662046315610)(操作系统.assets/image-20220901185516790.png)]

内核 = 主模块 + 可加载内核模块。设备驱动程序属于可加载内核模块

操作系统结构 —— 宏内核、微内核

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zaq7nQts-1662046315611)(操作系统.assets/image-20220901190208654.png)]

微内核各个模块间的调用没那么方便。如进程管理模块想要调用存储管理模块的功能只能通过消息传递的方式进行。进程管理模块向微内核发送消息,消息里面指明调用对象和参数,由微内核的进程间通信相关功能把消息传递给存储管理模块,该模块处理调用请求。如果要返回调用结果也要通过消息传递的方式

操作系统结构 —— 外核(exokernel)

应用程序可以通过系统提供的库函数调用普通内核和外核的功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eYP4UvjM-1662046315612)(操作系统.assets/image-20220901191038244.png)]

普通的操作系统用户进程想要申请一块内存空间,被分配的内存空间是经过抽象的。从用户进程的视角似乎自己拥有一整片连续的内存空间,但实际上这只是虚拟的地址空间,操作系统会把这些虚拟页面映射到实际的物理页框当中,这些物理页框在内存当中通常是离散的

除了内存空间之外,给进程分配的外存空间也是经过抽象的。从进程的视角似乎文件是连续的地址空间,但事实上文件的各个块在磁盘当中通常是离散存放的。用户进程的文件在外存当中零散地分布到哪些位置完全由操作系统决定,自己并不能控制

由于普通的操作系统给用户进程分配的都是抽象的硬件资源,一个用户进程在访问自己的用户空间时只能提供虚拟地址,而操作系统需要查页表通过多次访存才能够把虚拟地址转换成实际的物理地址。把虚拟地址映射到实际的物理地址的过程也需要时间代价,降低系统的整体效率

 

而外核可以直接给用户进程分配未经抽象的系统资源。这样的资源管理策略有时很有用,比如一个用户进程知道需要经常随机访问自身文件,就可以向外存申请分配一整片连续的磁盘块,随机访问时磁头移动的距离变少性能提升。应用程序也可以向外核申请分配一整片连续的物理内存

外核除了负责分配和回收这些未经抽象的硬件资源之外,还需要保证这些硬件资源的使用安全

在有外核的操作系统当中有的进程申请的是虚拟的地址空间,有的申请的是物理地址空间,给各个进程分配资源的策略以及后续的管理需要考虑各种情况,所以会降低系统的一致性,使系统变得更复杂

操作系统引导(Boot)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y8iJewId-1662046315614)(操作系统.assets/image-20220901220358928.png)]

 

安装操作系统后的磁盘(硬盘)

在一个新磁盘里安装操作系统,安装后磁盘里面可能是下图这样,除了能看见的C、D、E、F磁盘分区外,在磁盘开头位置会留出一片区域用于存储MBR

分区表是一个数据结构,说明每个分区分别占多大空间以及每个分区的地址范围

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qs9SDdfJ-1662046315616)(操作系统.assets/image-20220901220921159.png)]

C盘安装了操作系统,并且会使用C盘来启动操作系统,在这种情况下就可以把C盘称为这个磁盘的活动分区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2mx2aZBE-1662046315618)(操作系统.assets/image-20220901221111372.png)]

再把C盘内部进一步细分。根目录就是你双击打开C盘之后看见的那些内容,可能会包含一些文件夹和文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SoEZub49-1662046315620)(操作系统.assets/image-20220901221243951.png)]

操作系统引导(开机过程)

操作系统要启动,数据要被放到主存里面

计算机的主存由ROM和RAM两部分组成,平时说手机内存和电脑内存是多少通常说的是RAM,里面的数据一断电就被清空。ROM芯片被集成在电脑主板上,里面存储BIOS(Basic Input/Output System)基本输入输出系统,BIOS由一系列程序组成,其中最重要的是ROM引导程序,ROM芯片里的数据不会因为断电而丢失

开机时CPU通电就会从主存当中固定的位置找到并执行ROM引导程序

它会指示CPU把磁盘的MBR读入主存,CPU执行磁盘引导程序,磁盘引导程序根据分区表判断C盘的位置

接下来读入PBR,CPU执行PBR里面的程序,它会负责找到启动管理器程序,这个程序通常存放在更目录下面完成操作系统初始化的一系列工作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kY6Aq0Wu-1662046315625)(操作系统.assets/image-20220901221414820.png)]

硬件自检 —— 检查有没有插磁盘,有没有插内存条等等

例:Windows操作系统的自举程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJdeKMAS-1662046315628)(操作系统.assets/image-20220901223107600.png)]

虚拟机

传统计算机

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-at52sFAO-1662046315630)(操作系统.assets/image-20220901223152463.png)]

虚拟机

借助虚拟机管理程序把一台物理机器虚拟化为多台虚拟机器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zc1y9YG-1662046315632)(操作系统.assets/image-20220901225757889.png)]

第一类VMM类似传统的操作系统,负责直接管理并分配硬件资源

第一类VMM如何把硬件资源分配给各个VM,让每个VM都拥有各自独立的硬件资源?一个单核CPU也可以模拟多台VM,只需要划分CPU的时间片,给每个VM分配若干个时间片,在上层的操作系统看来似乎给自己分配的就是一个独立的CPU。磁盘和内存的分配则只需要划分空间分配给各个VM

只有VMM运行在内核态能够使用特权指令,而上层的的操作系统运行在用户态,当上层的操作系统想要使用特权指令时行为动作会被VMM截获,VMM负责判断使用是否合法和对指令进行等价转换模拟出执行效果

 

第二类VMM运行在Host OS上,想要给各个VM分配硬件资源只能申请Host OS给它分配,它再进行再分配。硬件资源的管理者依然是Host OS

第二类VMM在内核态的部分以VM驱动程序的形式加载到Host OS当中,当上层的Guest OS发出系统调用会被第二类VMM截获,然后由第二类VMM进行处理,代替它向底层的Host OS发出系统调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vpgS49dr-1662046315633)(操作系统.assets/image-20220901225833580.png)]

第一类VMM可以直接把未经抽象的物理资源分配给上层的VM

Host OS给申请分配物理资源的第二类VMM分配的资源是经过抽象的,第二类VMM把得到的虚拟硬件资源再分配给各个VM。上层的Guest OS使用硬件资源时地址需要先映射为VMM获得的虚拟地址空间,Host OS需要再将其映射到实际的物理地址空间。经过多层虚拟就意味着再使用这些硬件资源时需要经过多层映射才可以对应到最终的物理地址上,这就会导致第二类VMM性能更差

常用的虚拟机软件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f8bdCz1B-1662046315634)(操作系统.assets/image-20220901232746716.png)]

上图要迁移Guest OS,只需要将其导出为ISO镜像文件,拷贝到在另一台电脑后在该电脑的VirtualBox上加载安装就可以使用跟原来完全一样的Guest OS,包括在原Guest OS上安装的一些程序和数据

支持虚拟化的CPU通常分更多指令等级

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3H0fmheR-1662046315636)(操作系统.assets/image-20220901232827731.png)]

如让第一类VMM运行在Ring 0,让Guest OS的内核运行在Ring 1,用户进程运行在Ring2,这样第一类VMM就不用检查每一条特权指令的执行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zimuzi2019/article/details/126368288

智能推荐

解决win10/win8/8.1 64位操作系统MT65xx preloader线刷驱动无法安装_mt65驱动-程序员宅基地

文章浏览阅读1.3w次。转载自 http://www.miui.com/thread-2003672-1-1.html 当手机在刷错包或者误修改删除系统文件后会出现无法开机或者是移动定制(联通合约机)版想刷标准版,这时就会用到线刷,首先就是安装线刷驱动。 在XP和win7上线刷是比较方便的,用那个驱动自动安装版,直接就可以安装好,完成线刷。不过现在也有好多机友换成了win8/8.1系统,再使用这个_mt65驱动

SonarQube简介及客户端集成_sonar的客户端区别-程序员宅基地

文章浏览阅读1k次。SonarQube是一个代码质量管理平台,可以扫描监测代码并给出质量评价及修改建议,通过插件机制支持25+中开发语言,可以很容易与gradle\maven\jenkins等工具进行集成,是非常流行的代码质量管控平台。通CheckStyle、findbugs等工具定位不同,SonarQube定位于平台,有完善的管理机制及强大的管理页面,并通过插件支持checkstyle及findbugs等既有的流..._sonar的客户端区别

元学习系列(六):神经图灵机详细分析_神经图灵机方法改进-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏27次。神经图灵机是LSTM、GRU的改进版本,本质上依然包含一个外部记忆结构、可对记忆进行读写操作,主要针对读写操作进行了改进,或者说提出了一种新的读写操作思路。神经图灵机之所以叫这个名字是因为它通过深度学习模型模拟了图灵机,但是我觉得如果先去介绍图灵机的概念,就会搞得很混乱,所以这里主要从神经图灵机改进了LSTM的哪些方面入手进行讲解,同时,由于模型的结构比较复杂,为了让思路更清晰,这次也会分开几..._神经图灵机方法改进

【机器学习】机器学习模型迭代方法(Python)-程序员宅基地

文章浏览阅读2.8k次。一、模型迭代方法机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种:1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。优缺点:这也是实际最为常见的模型迭代方式,通常模型效果也是最好的,但这样模型迭代比较耗时,资源耗费比较多,实时性较差,特别是在大数据场景更为困难;2、模型融合的方法,将旧模..._模型迭代

base64图片打成Zip包上传,以及服务端解压的简单实现_base64可以装换zip吗-程序员宅基地

文章浏览阅读2.3k次。1、前言上传图片一般采用异步上传的方式,但是异步上传带来不好的地方,就如果图片有改变或者删除,图片服务器端就会造成浪费。所以有时候就会和参数同步提交。笔者喜欢base64图片一起上传,但是图片过多时就会出现数据丢失等异常。因为tomcat的post请求默认是2M的长度限制。2、解决办法有两种:① 修改tomcat的servel.xml的配置文件,设置 maxPostSize=..._base64可以装换zip吗

Opencv自然场景文本识别系统(源码&教程)_opencv自然场景实时识别文字-程序员宅基地

文章浏览阅读1k次,点赞17次,收藏22次。Opencv自然场景文本识别系统(源码&教程)_opencv自然场景实时识别文字

随便推点

ESXi 快速复制虚拟机脚本_exsi6.7快速克隆centos-程序员宅基地

文章浏览阅读1.3k次。拷贝虚拟机文件时间比较长,因为虚拟机 flat 文件很大,所以要等。脚本完成后,以复制虚拟机文件夹。将以下脚本内容写入文件。_exsi6.7快速克隆centos

好友推荐—基于关系的java和spark代码实现_本关任务:使用 spark core 知识完成 " 好友推荐 " 的程序。-程序员宅基地

文章浏览阅读2k次。本文主要实现基于二度好友的推荐。数学公式参考于:http://blog.csdn.net/qq_14950717/article/details/52197565测试数据为自己随手画的关系图把图片整理成文本信息如下:a b c d e f yb c a f gc a b dd c a e h q re f h d af e a b gg h f bh e g i di j m n ..._本关任务:使用 spark core 知识完成 " 好友推荐 " 的程序。

南京大学-高级程序设计复习总结_南京大学高级程序设计-程序员宅基地

文章浏览阅读367次。南京大学高级程序设计期末复习总结,c++面向对象编程_南京大学高级程序设计

4.朴素贝叶斯分类器实现-matlab_朴素贝叶斯 matlab训练和测试输出-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏12次。实现朴素贝叶斯分类器,并且根据李航《统计机器学习》第四章提供的数据训练与测试,结果与书中一致分别实现了朴素贝叶斯以及带有laplace平滑的朴素贝叶斯%书中例题实现朴素贝叶斯%特征1的取值集合A1=[1;2;3];%特征2的取值集合A2=[4;5;6];%S M LAValues={A1;A2};%Y的取值集合YValue=[-1;1];%数据集和T=[ 1,4,-1;..._朴素贝叶斯 matlab训练和测试输出

Markdown 文本换行_markdowntext 换行-程序员宅基地

文章浏览阅读1.6k次。Markdown 文本换行_markdowntext 换行

错误:0xC0000022 在运行 Microsoft Windows 非核心版本的计算机上,运行”slui.exe 0x2a 0xC0000022″以显示错误文本_错误: 0xc0000022 在运行 microsoft windows 非核心版本的计算机上,运行-程序员宅基地

文章浏览阅读6.7w次,点赞2次,收藏37次。win10 2016长期服务版激活错误解决方法:打开“注册表编辑器”;(Windows + R然后输入Regedit)修改SkipRearm的值为1:(在HKEY_LOCAL_MACHINE–》SOFTWARE–》Microsoft–》Windows NT–》CurrentVersion–》SoftwareProtectionPlatform里面,将SkipRearm的值修改为1)重..._错误: 0xc0000022 在运行 microsoft windows 非核心版本的计算机上,运行“slui.ex