标准服务器技术是网络功能虚拟化(NFV)实现的一个关键因素,了解一些x86架构的基础知识对大家后续了解电信云关键技术,尤其是掌握虚拟化技术原理和关键优化方案是必须具备的。本文接着上篇从x86架构的中断和异常、IO架构等部分进行阐述讲解。
绿园网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站等网站项目制作,到程序开发,运营维护。创新互联公司于2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
程序的执行往往不只是按顺序执行那么简单,一些异常和中断会打断顺序执行的程序流,转而进入一条完全不同的执行路径。中断提供给外部设备一种“打断CPU当前执行任务,并响应自身服务”的手段。中断(interrupt)是异步的事件,典型的比如由I/O设备触发;异常(exception)是同步的事件,典型的比如处理器执行某条指令时发现出错了等等,其实异常的本质就是同步中断。
中断通常被定义为一个打断CPU芯片指令执行的事件,该事件对应到CPU芯片内部或者外部的电路产生的电子信号。
中断信号可以被划分为同步中断和异步中断:
对于Intel的CPU而言,它将同步中断称作异常,而将异步中断称作中断。
通常中断(即异步中断)由时钟定时器或者其他I/O设备产生,如键盘接收到敲击某个按键的信号后产生的中断信号。而异常(即同步中断)则通常由于编程错误或者由CPU检测到异常条件需要内核进行处理而产生,如上面讲到的Page Fault Exception(缺页异常),异常可以由程序通过int或者sysenter指令主动产生。
对于Intel x86 CPU而言,它将中断和异常进行了如下归类:
中断,即异步中断,中断信息随着CPU的时钟信号传递到CPU内部。中断分为可屏蔽中断和不可屏蔽中断两类。
异常,即同步中断,中断信号在CPU执行完某个指令后产生并接收到。处理器检测到的异常,即当CPU执行指令的时候检测到硬件上存在一些异常条件的时候就会产生该信号。这种类型的异常根据产生时在内核堆栈中保存的EIP寄存器的值(即异常恢复后CPU重新执行的位置)进行细分:
我们在写程序时,经常会在容易产生错误的地方进行异常抛出,然后针对抛出的异常定义执行策略。这类编程产生的异常,由程序主动执行int或者int3之类的指令产生。CPU像处理Traps一样处理这些程序主动产生的异常,该类异常通常被称为软件中断(software interrupt)。这类异常主要有两种用途:实现系统调用和通知某个debugger特定的事件发生。
这些异常或中断由0~255的数字唯一标识,也就是经常说的中断信号量。对于不可屏蔽中断和异常来说,相应的中断信号量是固定的,而可屏蔽中断对应的中断信号量则可以通过设置中断控制器来更改。
计算机所处理的任务其实只有两种:CPU运算和I/O操作。这部分内容是后续学习计算虚拟化中I/O虚拟化的基础。I/O(输入/输出)是CPU访问外部设备的方法。设备通常通过寄存器和设备RAM将自身功能展现给CPU,CPU通过读/写这些寄存器和RAM完成对设备的访问及其他操作。按访问方式的不同,x86架构的I/O分为如下两类:
即通过I/O端口访问设备寄存器。x86有65536个8位的I/O端口,编号为0x0~0xFFFF。CPU将端口号作为设备端口的地址,进而对设备进行访问。这65536个端口构成了64KB的I/O端口地址空间。I/O端口地址空间是独立的,不是线性地址空间或物理地址空间的一部分。需要使用特定的操作命令IN/OUT对端口进行访问,此时CPU通过一个特殊的芯片管脚标识这是一次I/O端口访问,于是芯片组知道地址线上的地址是I/O端口号并相应地完成操作。此外,2个或4个连续的8位I/O端口可以组成16位或32位的I/O端口。
即通过内存访问的形式访问设备寄存器或设备RAM。MMIO要占用CPU的物理地址空间,它将设备寄存器或设备RAM映射到物理地址空间的某段地址,然后使用MOV等访存指令访问此段地址,即可访问到映射的设备。MMIO方式访问设备也需要进行线性地址到物理地址的转换,但是这个转换过程中的MMIO地址不可缓存到TLB中。MMIO是一种更普遍、更先进的I/O访问方式,很多CPU 架构都没有Port I/O,采用统一的MMIO方式。
直接内存访问(Direct Memory Access,后文简称为DMA)是所有现代计算机的重要特色。DMA允许设备绕开CPU直接向内存中复制或读取数据。如果设备向内存复制数据都经过CPU,则CPU会有大量中断负载,中断过程中,CPU对其他任务来讲无法使用,不利于系统性能的提高。通过DMA,CPU只负责初始化这个传输动作,而传输动作本身由DMA 控制器(简称为DMAC)来实行和完成。在实现DMA传输时,由DMAC直接控制总线,在DMA传输前,CPU要把总线控制权交给DMAC,结束DMA传输后,DMAC立即把总线控制权交回给CPU。
一个完整的DMA 传输过程的基本流程如下:
由此可见,DMA无须CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件(DMAC)为RAM与I/O设备开辟了一条直接传送数据的通路,极大地提高了CPU效率。需要注意的是,DMA操作访问的必须是连续的物理内存。DMA 传输的过程如下图所示。
DMA技术
进程是什么呢?大白话讲,进程就是应用程序的启动实例。比如我们运行一个游戏,打开一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源、数据资源、独立的内存空间。
线程又是什么呢?线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。线程拥有自己的栈空间。
进程示意图
对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。无论进程还是线程,都是由操作系统所管理的。线程一般具有五种状态:初始化>>>可运行>>>运行中>>>阻塞>>>销毁。线程不同状态之间的转化均需要CPU开销来完成。
协程英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。最重要的是,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。
协程示意图
在Python语言中有个生成器的概念,里面有个关键字yield,当程序执行到yield关键字时,会暂停在那一行,等到主线程调用send方法发送了数据,协程才会接到数据继续执行。但是,yield让程序暂停,和线程的阻塞是有本质区别的。通过yield关键字的暂停完全由程序控制,线程的阻塞状态是由操作系统内核来进行切换。大家可以在Python脚本中写入如下代码并执行体验下:
- def consume():
- while True:
- # consume等待接收数据
- number = yield
- print("我要执行啦。。。。开始计数:",number)
- consumer = consume()
- next(consumer)
- for num in range(0,100):
- print("开始执行:",num)
- consumer.send(num)
协程Python代码
NFV关键技术:X86架构基础(上篇)
【本文为专栏作者“移动Labs”原创稿件,转载请联系原作者】
戳这里,看该作者更多好文
名称栏目:NFV关键技术:x86架构基础(下篇)
本文来源:http://www.gawzjz.com/qtweb2/news35/12835.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联