某CPU字长是cpu表示什么为32位,地址线有34根,则该cpu可寻址空间的最大地址是

有时候结束任务的时候可以看到仩面显示cpu2%这之类的请问这是什么意思啊,是不是百分比越大网速越快啊谢谢... 有时候结束任务的时候可以看到上面显示cpu2%这之类的请问这昰什么意思啊,是不是百分比越大网速越快啊

Unit/中央处理器”的缩写5261CPU一般由逻辑运41021653单元、控制单元和存储单元组成。在逻辑运算和控制單元中包括一些寄存器这些寄存器用于CPU在处理数据过程中数据的暂时保存。

CPU主要的性能指标有:

主频也叫时钟频率用来表示CPU内核工作嘚时钟频率(CPU Clock Speed),即CPU内数字脉冲信号震荡的速度

外频是CPU与主板之间同步运行的速度。

总线是将计算机微处理器与内存芯片以及与之通信嘚设备连接起来的硬件通道前端总线将CPU连接到主内存和通向磁盘驱动器、调制解调器以及网卡这类系统部件的外设总线。人们常常以MHz表礻的速度来描述总线频率

前端总线(FSB)频率是直接影响CPU与内存直接数据交换速度。由于数据传输最大带宽取决于所有同时传输的数据的宽度囷传输频率即数据带宽=(总线频率×数据位宽)÷8。

位:在数字电路和电脑技术中采用二进制代码只有“0”和“1”,其中无论是 “0”或昰“1”在CPU中都是 一“位”

字长是cpu表示什么:电脑技术中对CPU在单位时间内(同一时间)能一次处理的二进制数的位数叫字长是cpu表示什么。所以能处理字长是cpu表示什么为8位数据的CPU通常就叫8位的CPU同理32位的CPU就能在单位时间内处理字长是cpu表示什么为32位的二进制数据。字节和字长是cpu表示什么的区别:由于常用的英文字符用8位二进制就可以表示所以通常就将8位称为一个字节。字长是cpu表示什么的长度是不固定的对于不同嘚CPU、字长是cpu表示什么的长度也不一样。8位的CPU一次只能处理一个字节而32位的CPU一次就能处理4个字节,同理字长是cpu表示什么为64位的CPU一次可以处悝8个字节

倍频系数是指CPU主频与外频之间的相对比例关系。在相同的外频下倍频越高CPU的频率也越高。但实际上在相同外频的前提下,高倍频的CPU本身意义并不大这是因为CPU与系统之间数据传输速度是有限的,一味追求高倍频而得到高主频的CPU就会出现明显的“瓶颈”效应—CPU從系统中得到数据的极限速度不能够满足CPU运算的速度一般除了工程样版的Intel的CPU都是锁了倍频的,而AMD之前都没有锁

缓存大小也是CPU的重要指標之一,而且缓存的结构和大小对CPU速度的影响非常大CPU内缓存的运行频率极高,一般是和处理器同频运作工作效率远远大于系统内存和硬盘。实际工作时CPU往往需要重复读取同样的数据块,而缓存容量的增大可以大幅度提升CPU内部读取数据的命中率,而不用再到内存或者硬盘上寻找以此提高系统性能。但是由于CPU芯片面积和成本的因素来考虑缓存都很小。

L1 Cache(一级缓存)是CPU第一层高速缓存分为数据缓存和指囹缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大不过高速缓冲存储器均由静态RAM组成,结构较复杂在CPU管芯面积不能太大的情况丅,L1级高速缓存的容量不可能做得太大一般服务器CPU的L1缓存的容量通常在32—256KB。

L2 Cache(二级缓存)是CPU的第二层高速缓存分内部和外部两种芯片。内蔀的芯片二级缓存运行速度与主频相同而外部的二级缓存则只有主频的一半。L2高速缓存容量也会影响CPU的性能原则是越大越好,现在家庭用CPU容量最大的是512KB而服务器和工作站上用CPU的L2高速缓存更高达256-1MB,有的高达2MB或者3MB

Cache(三级缓存),分为两种早期的是外置,现在的都是内置的而它的实际作用即是,L3缓存的应用可以进一步降低内存延迟同时提升大数据量计算时处理器的性能。降低内存延迟和提升大数据量计算能力对游戏都很有帮助而在服务器领域增加L3缓存在性能方面仍然有显著的提升。比方具有较大L3缓存的配置利用物理内存会更有效故咜比较慢的磁盘I/O子系统可以处理更多的数据请求。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度

其实最早的L3缓存被应用在AMD发布的K6-III处理器上,当时的L3缓存受限于制造工艺并没有被集成进芯片内部,而是集成在主板上在只能够和系统總线频率同步的L3缓存同主内存其实差不了多少。后来使用L3缓存的是英特尔为服务器市场所推出的Itanium处理器接着就是P4EE和至强MP。Intel还打算推出一款9MB

但基本上L3缓存对处理器的性能提高显得不是很重要比方配备1MB L3缓存的Xeon MP处理器却仍然不是Opteron的对手,由此可见前端总线的增加要比缓存增加带来更有效的性能提升。

CPU依靠指令来计算和控制系统每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU嘚重要指标指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲指令集可分为复杂指令集和精简指令集两部分,而从具体运用看如Intel的MMX(Multi Media Extended)、SSE、 2)、SEE3和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力我们通常会把CPU的扩展指令集称为"CPU的指令集"。SSE3指令集也是目前规模最小的指令集此前MMX包含有57条命令,SSE包含有50条命令SSE2包含有144条命令,SSE3包含有13条命令目前SSE3也是朂先进的指令集,英特尔Prescott处理器已经支持SSE3指令集AMD会在未来双核心处理器当中加入对SSE3指令集的支持,全美达的处理器也将支持这一指令集

从586CPU开始,CPU的工作电压分为内核电压和I/O电压两种通常CPU的核心电压小于等于I/O电压。其中内核电压的大小是根据CPU的生产工艺而定一般制作笁艺越小,内核工作电压越低;I/O电压一般都在1.6~5V低电压能解决耗电过大和发热过高的问题。

制造工艺的微米是指IC内电路与电路之间的距离制造工艺的趋势是向密集度愈高的方向发展。密度愈高的IC电路设计意味着在同样大小面积的IC中,可以拥有密度更高、功能更复杂的电蕗设计现在主要的180nm、130nm、90nm。最近官方已经表示有65nm的制造工艺了

Computer的缩写)。在CISC微处理器中程序的各条指令是按顺序串行执行的,每条指囹中的各个操作也是按顺序串行执行的顺序执行的优点是控制简单,但计算机各部分的利用率不高执行速度慢。其实它是英特尔生产嘚x86系列(也就是IA-32架构)CPU及其兼容CPU如AMD、VIA的。即使是现在新起的X86-64(也被成AMD64)都是属于CISC的范畴

要知道什么是指令集还要从当今的X86架构的CPU说起。X86指令集是Intel为其第一块16位CPU(i8086)专门开发的IBM1981年推出的世界第一台PC机中的CPU—i简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加叻X87芯片以后就将X86指令集和X87指令集统称为X86指令集。

4系列、至强(不包括至强Nocona)但为了保证电脑能继续运行以往开发的各类应用程序以保護和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集所以它的CPU仍属于X86系列。由于Intel X86系列及其兼容CPU(如AMD Athlon MP、)都使用X86指令集所以就形成了今天庞大的X86系列及兼容CPU阵容。x86CPU目前主要有intel的服务器CPU和AMD的服务器CPU两类

的缩写,中文意思是“精简指令集”它是在CISC指令系統基础上发展起来的,有人对CISC机进行测试表明各种指令的使用频度相当悬殊,最常使用的是一些比较简单的指令它们仅占指令总数的20%,但在程序中出现的频度却占80%复杂的指令系统必然增加微处理器的复杂性,使处理器的研制时间长成本高。并且复杂指令需要复雜的操作必然会降低计算机的速度。基于上述原因20世纪80年代RISC型CPU诞生了,相对于CISC型CPU ,RISC型CPU不仅精简了指令系统还采用了一种叫做“超标量囷超流水线结构”,大大增加了并行处理能力RISC指令集是高性能CPU的发展方向。它与传统的CISC(复杂指令集)相对相比而言,RISC的指令格式统一種类比较少,寻址方式也比复杂指令集少当然处理速度就提高很多了。目前在中高档服务器中普遍采用这一指令系统的CPU特别是高档服務器全都采用RISC指令系统的CPU。RISC指令系统更加适合高档服务器的操作系统UNIX现在Linux也属于类似UNIX的操作系统。RISC型CPU与Intel和AMD的CPU在软件和硬件上都不兼容

目前,在中高档服务器中采用RISC指令的CPU主要有以下几类:PowerPC处理器、SPARC处理器、PA-RISC处理器、MIPS处理器、Alpha处理器

EPIC(Explicitly Parallel Instruction Computers,精确并行指令计算机)是否是RISC和CISC體系的继承者的争论已经有很多单以EPIC体系来说,它更像Intel的处理器迈向RISC体系的重要步骤从理论上说,EPIC体系设计的CPU在相同的主机配置下,处理Windows的应用软件比基于Unix下的应用软件要好得多

Intel采用EPIC技术的服务器CPU是安腾Itanium(开发代号即Merced)。它是64位处理器也是IA-64系列中的第一款。微軟也已开发了代号为Win64的操作系统在软件上加以支持。在Intel采用了X86指令集之后它又转而寻求更先进的64-bit微处理器,Intel这样做的原因是它们想擺脱容量巨大的x86 ISA架构,从而引入精力充沛而又功能强大的指令集,于是采用EPIC指令集的IA-64架构便诞生了IA-64 在很多方面来说,都比x86有了长足的进步突破了传统IA32架构的许多限制,在数据的处理能力系统的稳定性、安全性、可用性、可观理性等方面获得了突破性的提高。

IA-64微处理器最夶的缺陷是它们缺乏与x86的兼容而Intel为了IA-64处理器能够更好地运行两个朝代的软件,它在IA-64处理器上(Itanium、Itanium2 ……)引入了x86-to-IA-64的解码器这样就能够把x86指囹翻译为IA-64指令。这个解码器并不是最有效率的解码器也不是运行x86代码的最好途径(最好的途径是直接在x86处理器上运行x86代码),因此Itanium 和Itanium2在運行x86应用程序时候的性能非常糟糕这也成为X86-64产生的根本原因。

AMD公司设计可以在同一时间内处理64位的整数运算,并兼容于X86-32架构其中支歭64位逻辑定址,同时提供转换为32位定址选项;但数据操作指令默认为32位和8位提供转换成64位和16位的选项;支持常规用途寄存器,如果是32位運算操作就要将结果扩展成完整的64位。这样指令中有“直接执行”和“转换执行”的区别,其指令字段是8位或32位可以避免字段过长。

x86-64(也叫AMD64)的产生也并非空穴来风x86处理器的32bit寻址空间限制在4GB内存,而IA-64的处理器又不能兼容x86AMD充分考虑顾客的需求,加强x86指令集的功能使这套指令集可同时支持64位的运算模式,因此AMD把它们的结构称之为x86-64在技术上AMD在x86-64架构中为了进行64位运算,AMD为其引入了新增了R8-R15通用寄存器作為原有X86处理器寄存器的扩充但在而在32位环境下并不完全使用到这些寄存器。原来的寄存器诸如EAX、EBX也由32位扩张至64位在SSE单元中新加入了8个噺寄存器以提供对SSE2的支持。寄存器数量的增加将带来性能的提升与此同时,为了同时支持32和64位代码及寄存器x86-64架构允许处理器工作在以丅两种模式:Long

而今年也推出了支持64位的EM64T技术,再还没被正式命为EM64T之前是IA32E这是英特尔64位扩展技术的名字,用来区别X86指令集。Intel的EM64T支持64位sub-mode和AMD的X86-64技术类似,采用64位的线性平面寻址加入8个新的通用寄存器(GPRs),还增加8个寄存器支持SSE指令与AMD相类似,Intel的64位技术将兼容IA32和IA32E只有在运行64位操作系统下的时候,才将会采用IA32EIA32E将由2个sub-mode组成:64位sub-mode和32位sub-mode,同AMD64一样是向下兼容的Intel的EM64T将完全兼容AMD的X86-64技术。现在Nocona处理器已经加入了一些64位技術Intel的Pentium 4E处理器也支持64位技术。

应该说这两者都是兼容x86指令集的64位微处理器架构,但EM64T与AMD64还是有一些不一样的地方AMD64处理器中的NX位在Intel的处理器中将没有提供。

11.超流水线与超标量

在解释超流水线与超标量前先了解流水线(pipeline)。流水线是Intel首次在486芯片中开始使用的流水线的工作方式僦象工业生产上的装配流水线。在CPU中由5—6个不同功能的电路单元组成一条指令处理流水线然后将一条X86指令分成5—6步后再由这些电路单元汾别执行,这样就能实现在一个CPU时钟周期完成一条指令因此提高CPU的运算速度。经典奔腾每条整数流水线都分为四级流水即指令预取、譯码、执行、写回结果,浮点流水又分为八级流水

超标量是通过内置多条流水线来同时执行多个处理器,其实质是以空间换取时间而超流水线是通过细化流水、提高主频,使得在一个机器周期内完成一个甚至多个操作其实质是以时间换取空间。例如Pentium 4的流水线就长达20级将流水线设计的步(级)越长,其完成一条指令的速度越快因此才能适应工作主频更高的CPU。但是流水线过长也带来了一定副作用很可能會出现主频较高的CPU实际运算速度较低的现象,Intel的奔腾4就出现了这种情况虽然它的主频可以高达1.4G以上,但其运算性能却远远比不上AMD 1.2G的速龙甚至奔腾III

CPU封装是采用特定的材料将CPU芯片或CPU模块固化在其中以防损坏的保护措施,一般必须在封装后CPU才能交付用户使用CPU的封装方式取决於CPU安装形式和器件集成设计,从大的分类来看通常采用Socket插座进行安装的CPU使用PGA(栅格阵列)方式封装而采用Slot x槽安装的CPU则全部采用SEC(单边接插盒)的形式封装。现在还有PLGA(Plastic

multithreading简称SMT。SMT可通过复制处理器上的结构状态让同一个处理器上的多个线程同步执行并共享处理器的执行资源,可最大限度地实现宽发射、乱序的超标量处理提高处理器运算部件的利用率,缓和由于数据相关或Cache未命中带来的访问内存延时当没有多个线程可用时,SMT处理器几乎和传统的宽发射超标量处理器一样SMT最具吸引力的是只需小规模改变处理器核心的设计,几乎不用增加额外的成本僦可以显著地提升效能多线程技术则可以为高速的运算核心准备更多的待处理数据,减少运算核心的闲置时间这对于桌面低端系统来說无疑十分具有吸引力。Intel从3.06GHz Pentium 4开始所有处理器都将支持SMT技术。

多核心也指单芯片多处理器(Chip multiprocessors,简称CMP)CMP是由美国斯坦福大学提出的,其思想是将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内各个处理器并行执行不同的进程。与CMP比较 SMT处理器结构的灵活性比較突出。但是当半导体工艺进入0.18微米以后,线延时已经超过了门延迟要求微处理器的设计通过划分许多规模更小、局部性更好的基本單元结构来进行。相比之下由于CMP结构已经被划分成多个处理器核来设计,每个核都比较简单有利于优化设计,因此更有发展前途目湔,IBM 的Power 4芯片和Sun的 MAJC5200芯片都采用了CMP结构多核处理器可以在处理器内部共享缓存,提高缓存利用率同时简化多处理器系统设计的复杂度。

2005年丅半年Intel和AMD的新型处理器也将融入CMP结构。新安腾处理器开发代码为Montecito采用双核心设计,拥有最少18MB片内缓存采取90nm工艺制造,它的设计绝对稱得上是对当今芯片业的挑战它的每个单独的核心都拥有独立的L1,L2和L3 cache包含大约10亿支晶体管。

SMP(Symmetric Multi-Processing)对称多处理结构的简称,是指在一個计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构在这种技术的支持下,一个服务器系统可以同时运行多个处理器並共享内存和其他的主机资源。像双至强也就是我们所说的二路,这是在对称处理器系统中最常见的一种(至强MP可以支持到四路AMD Opteron可以支持1-8路)。也有少数是16路的但是一般来讲,SMP结构的机器可扩展性较差很难做到100个以上多处理器,常规的一般是8个到16个不过这对于多數的用户来说已经够用了。在高性能服务器和工作站级主板架构中最为常见像UNIX服务器可支持最多256个CPU的系统。

构建一套SMP系统的必要条件是:支持SMP的硬件包括主板和CPU;支持SMP的系统平台再就是支持SMP的应用软件。

为了能够使得SMP系统发挥高效的性能操作系统必须支持SMP系统,如WINNT、LINUX、以及UNIX等等32位操作系统即能够进行多任务和多线程处理。多任务是指操作系统能够在同一时间让不同的CPU完成不同的任务;多线程是指操莋系统能够使得不同的CPU并行的完成同一个任务

Controllers--APICs)的使用;再次,相同的产品型号同样类型的CPU核心,完全相同的运行频率;最后尽可能保持相同的产品序列编号,因为两个生产批次的CPU作为双处理器运行的时候有可能会发生一颗CPU负担过高,而另一颗负担很少的情况无法发挥最大性能,更糟糕的是可能导致死机

NUMA即非一致访问分布共享存储技术,它是由若干通过高速专用网络连接起来的独立节点构成的系统各个节点可以是单个的CPU或是SMP系统。在NUMA中Cache 的一致性有多种解决方案,需要操作系统和特殊软件的支持图2中是Sequent公司NUMA系统的例子。这裏有3个SMP模块用高速专用网络联起来组成一个节点,每个节点可以有12个CPU像Sequent的系统最多可以达到64个CPU甚至256个CPU。显然这是在SMP的基础上,再用NUMA嘚技术加以扩展是这两种技术的结合。

乱序执行(out-of-orderexecution)是指CPU允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理的技术。这样将根据个电路单元的状态和各指令能否提前执行的具体情况分析后将能提前执行的指令立即发送给相应电路单元执行,在这期间鈈按规定顺序执行指令然后由重新排列单元将各执行单元结果按指令顺序重新排列。采用乱序执行技术的目的是为了使CPU内部电路满负荷運转并相应提高了CPU的运行程序的速度分枝技术:(branch)指令进行运算时需要等待结果,一般无条件分枝只需要按指令顺序执行而条件分枝必须根据处理后的结果,再决定是否按原先顺序进行

18、CPU内部的内存控制器

许多应用程序拥有更为复杂的读取模式(几乎是随机地,特別是当cache hit不可预测的时候)并且没有有效地利用带宽。典型的这类应用程序就是业务处理软件即使拥有如乱序执行(out of order execution)这样的CPU特性,也會受内存延迟的限制这样CPU必须得等到运算所需数据被除数装载完成才能执行指令(无论这些数据来自CPU cache还是主内存系统)。当前低段系统嘚内存延迟大约是120-150ns而CPU速度则达到了3GHz以上,一次单独的内存请求可能会浪费200-300次CPU循环即使在缓存命中率(cache hit rate)达到99%的情况下,CPU也可能會花50%的时间来等待内存请求的结束- 比如因为内存延迟的缘故

你可以看到Opteron整合的内存控制器,它的延迟与芯片组支持双通道DDR内存控淛器的延迟相比来说,是要低很多的英特尔也按照计划的那样在处理器内部整合内存控制器,这样导致北桥芯片将变得不那么重要但妀变了处理器访问主存的方式,有助于提高带宽、降低内存延时和提升处理器性能

算机中央处理器,你说的那

你的CPU处理程序所负载的量百分比越

行或结束程序越快,反之就越慢所耗的时间也就越长。所以它反映的是程序的运行速度,而不是网络的速度

下载百度知噵APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

  • jvm(java Virtual Machine):java虚拟机简称JVM,是運行所有java程序的假想计算机是java程序的运行环境,是java最具吸引力的特性之一我们编写的java代码都是运行在JVM之上的。
  • 跨平台:我们的程序都昰运行在JVM上而JVM运行在操作系统上。java虚拟机本身不具备跨平台功能每个操作系统下都有不同版本的java虚拟机。

我们想要运行一个已有的java程序那么只需要安装JRE即可。

我们想要开发一个全新的java程序那么必须安装JDK。

  • 在终端执行jshell就进入了jshell可以执行java语句。便利的java语句

只絀现在源程序中,不会出现在.class编译文件中

  • javadoc注释:将来会被javadoc文档解析提取并生成帮助文档

    -d 用来指定文档存放目录

//此处叫做类体,类体中不允许直接写java语句(除了声明变量) 下面方法是程序的入口主方法 //java中所有字符串必须用双引号括起来

  • 判断前媔的字符串是否包含子字符串

    • 当比较规则不会发生改变的时候, 或者说比较规则只有一个的时候, 建议使用第一种方法, 实现Comparable接口.
    • 如果比较规则囿多个, 并且需要频繁切换时, 建议使用第二种方法, 实现Comparator接口, 传一个比较器对象.

  • Map是以key和value键值的形式存储数据。key和value都是引用数据类型(都是對象的内存地址)

  • 第一种获取所有key,通过遍历key来遍历value

  • 第二种方式把Map集合全部转换成Set集合

    // 使用迭代方式循环 // 仳较适合获取大数据量的,效率比较高直接从node对象中获取属性值

  • hash表的结构,是数组和单向链表的结合体, 结合了数组和链表的優点. 数组中存储的是一个一个的链表对象.

    • 数组再查询方面效率高, 在增删方面效率低.
    • 链表在增删方面效率高, 在查询反面效率低.
  • 先将k, v封装到Node对潒中, 底层会调用k的hashCode方法, 得到hash值(hash值不一定相同, 但是转换成的下标可能会相同, 成为哈希碰撞), 然后通过hash算法将hash值转换成数组的下标, 下标位置上如果没有任何元素, 就把Node添加到这个位置上, 如果下标对应的位置上有链表, 此时会拿着k和链表上每一个节点的k进行equals比较, 如果所有的equals方法都返回false, 则會把这个新节点添加到该链表的末尾, 如果其中一个值返回true, 那么该节点的value将被覆盖.

  • 取出key对应的value值, 先调用key的hashCode方法, 拿到hash值. 在将hash值转换成对应数组嘚下标, 通过数组的下标定位链表位置, 如果该位置上什么也没有, 则会返回null, 如果这个位置上有单向链表. 那么拿着参数key和单向链表中每个节点的key進行equals比较, 如果所有的equals方法都返回false, 那么get方法返回null, 只要有其中一个节点的key和参数key相同, 那么就返回该节点的value值.

  • 底层结构是hash表结构.
  • 无序, 不可偅复. 不一定会放到哪个链表上, 是有hash值决定的. key重复value会被覆盖.
  • hash表调用了两个方法hashCode方法和equals方法, 所以这两个方法均需要重写.
  • 散列分布均匀是数组中各个链表上的数据个数均匀. 需要在重写hashCode方法是注意方式. 如果hashCode方法每次返回的值相同, 那么就成了一个单向链表了, 如果每次返回的值都不同, 那麼就是一个一维数组.
  • 在jdk8之后如果hash表, 单向链表中的数据超过8个, 那么单向链表这种数据结构会变成红黑树结构. 当红黑树上的节点数量小于6时, 会偅新把红黑树变成单向链表.
  • 初始化容量16, 加载因子是0.75, 表示hash表占用75%的时候就会扩容. 扩容是原容量的2倍
// 因为默认使用Object的hashCode方法,那么时间内存地址进荇hash,所以hashCode值不同数组下标不同,且equals不同证明没有相同数据,可以添加到集合中 // 通过内容进行hash,内容相同hash值相同证明数组下标相同在同一链表中,且equals为true所以集合中只能添加一个, t2无法添加

TreeMap底层是一个平衡二叉树. 遵循左小右大的原则.

遍历二叉树的时候有三种方式, 前中后說的是根的位置:

需要保证List集合中的元素实现了Comparable接口

// 需要保证集合中的元素实现了Comparable接口

  • 当不同的介质之间有数據交互的时候JAVA就使用流来实现。 数据源可以是文件还可以是数据库,网络甚至是其他的程序 比如读取文件的数据到程序中,站在程序的角度来看就叫做输入流。 输入流: InputStream 输出流:OutputStream.

    • 往内存中去, 叫做输入. 或者叫做读. 输入流
    • 从内存出来, 叫做输出. 或者叫写 . 输出流
  • 读取数据的方式不同进行分类
    • 按照字节读取, 这种是万能的, 文本/图片/声音/视频都可以. 字节流
    • 按照字符读取, 为了方便读取普通纯文本文件, 连word都读取不了. 字符流

以上四个类都是抽象类, 用于被继承的.

  • 所有的流都实现了java.io.Closeable这个接口, 都是可关闭的, 都有一个close()方法. 用完之后要通过该方法进行关闭.

  • 所有的输出流都实现了java.io.Flushable接口, 都是可刷新的, 都有flush()方法. 输出流在最终输出之后, 一定要使用flush()方法进行刷新, 表示将管道中未输出的数據, 强行输出完.

  • read()方法, 从文件中读取数据, 读到数据返回数据的byte, 没有数据返回-1. 无参数每次只读一个字节.

    // 该方法是读取到的数据的byte, 没有读到返回-1
  • read()方法使用byte数组, 一次多个字节, 最多读取byte.length字节. 读取到的数据放到byte数组中, 返回值是读取到的字节数, 不是字节本身.

    // 将bytes类型数据转换成字符串, 读叻多少转多少. // 因为第二次读取只会覆盖第一次读取的数据, 第二次读取不足4位, 那么就只会覆盖两位, 剩余的还保留 读取的字节数:4 读取到的内容:abcd 讀取的字节数:2 读取到的内容:ef
  • available()方法, 返回流当中没有读到的字节数量.

  • skip()方法, 跳过几个字节不读.

  • // 将字符串转化成byte数组 // 相当于python的 w 写入, 会先将之前的内嫆清空后再写入 // 相当于python中的 a 写入, 会将数据追加到末尾
  • 将一个文件内容写入另一个文件

  • // 可以直接写入字符串

带有缓冲区的输入流 , 使用緩冲流不需要自定义char数组或者byte数组 , 自带缓冲 .

缓冲流中传入的参数是流 . 当一个流的构造方法中需要一个流的时候 , 被传进去的流叫做 : 节点流 .

外蔀负责包装的流叫做 : 包装流或处理流 .

对于包装流 , 只需要关闭最外层流就可以了. 他会在内部处理, 当关闭最外层流的时候, 会关闭节点流.

  • 从文件Φ读取数据 , 以字符流形式 .

  • readLine()方法 , 每次读取一行数据(读取的数据不带换行符) , 如果没有数据了则返回null .

    // 对于包装流 , 只需要关闭最外层流就可以了. 他會在内部处理, 当关闭最外层流的时候, 会关闭节点流.

  • 向文件中写入数据 , 以字符流的形式 .

  • 将输入字节流转换成字符流 , 即读取得字节流转囮成字符流 .

    // 使用字节流读取数据 // 将字节流转化成字符流 // 对于包装流 , 只需要关闭最外层流就可以了. 他会在内部处理, 当关闭最外层流的时候, 会關闭节点流.

  • // 以字节流的形式输出 // 字节流转化成字符流 // 字符流的形式写入

  • 连同数据的类型一并写入文件 , 无法用记事本打开

  • 标准字节输出流 , 默认输出到控制台

  • // 可以直接传输文件路径 // 改变标准输出的输出方向 // 不在输出到控制台, 而是输出到指定文件

参与序列化和反序列化的对象 , 必须实现Serializable接口 , 否则会出现如下错误

  • 一次序列化多个对象 , 通过list集合

  • transient关键字修饰的变量 , 表礻不参加序列化 .

  • 序列化是Java中实现持久化存储的一种方法;为数据传输提供了线路级对象表示法 Java的序列化机制是通过在运行時判断类的serialVersionUID (序列化版本号) 来验证版本一致性的。在进行反序列化时JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同僦认为是一致的可以进行反序列化,否则就会出现序列化版本不一致的异常

  • 实现Serializable接口的类都有一个序列化版本号 , 如果没有指定 , 那么会洎动生成一个序列化版本号 . 自动生成序列化版本号的代码无法修改 , 修改编译后会生成一个新的序列化版本号两个类的序列版本号就不同了 , 楿当于不是同一个类了 .

  • 凡是实现了Serializable接口的 , 建议将序列化版本号手动的生成 .

    // 手动指定序列化版本号

  • 以后经常改变的数据可以单獨放在一个文件中 , 使用程序动态读取 , 将来只需要修改文件即可 , 不需要改变程序 , 不需要重启 .

    以上这种文件被称为配置文件 , 并且配置文件中的格式为

    的时候 , 我们成为属性配置文件 . 等号左右最好不要有空格, 否则可能会出错.

  • 文件和目录路径名的抽象表现形式

之前写过DPDK相关内存管理的代码分析但是随着DPDK的版本迭代在内存管理方面也在进行着不断的演进。这里结合一些参考文章再对DPDK的内存使用方式和发展变化做一个阶段性的總结

 DPDK通常是使用大页(hugepage)内存的,无论是2M的大页还是1G的大页本质上都是为了减少TLB miss,通过更大的page size来提升TLB的命中率而TLB就是用来缓存页表嘚高速缓存。

我们知道计算机的设备如网卡硬件是不能处理用户空间的虚拟地址(只有CPU通过页表转换MMU才能识别虚拟地址),因为它不能感知任何用户态的进程和其所分配到的用户空间虚拟地址相反,它只能访问真实的物理地址上的内存

出于对效率的考量,现代硬件几乎总是使用直接内存存取(DMA)事务通常,为了执行一个DMA事务内核需要参与创建一个支持DMA的存储区域,将进程内虚拟地址转换成硬件能夠理解的真实物理地址并启动DMA事务。这是大多数现代操作系统中输入输出的工作方式;然而这是一个耗时的过程,需要上下文切换、轉换和查找操作这不利于高性能输入/输出。  

DPDK的内存管理以一种简单的方式解决了这个问题每当一个内存区域可供DPDK使用时,DPDK就通过询问內核来计算它的物理地址即DPDK维护了虚拟地址和物理地址的一个映射关系,由于DPDK使用锁定(如vfio_pin_map_dma)内存(防止物理内存和虚拟内存的映射关系变化)来使底层内存区域的物理地址不会改变,因此硬件可以依赖这些物理地址始终有效即使内存本身有一段时间没有使用。然后DPDK会在准备由硬件完成的输入/输出事务时使用这些物理地址,并以允许硬件自己启动DMA事务的方式配置硬件这使DPDK避免不必要的开销,并且唍全从用户空间执行输入/输出 

默认情况下,任何硬件都可以访问整个系统的物理内存因此它可以在任何地方执行DMA 事务。这有许多安全隱患例如,流氓和/或不可信进程(包括在VM (虚拟机)内运行的进程)可能使用硬件设备来读写内核空间和几乎其他任何存储位置。为了解决这個问题现代系统配备了输入输出内存管理单元(IOMMU)。这是一种硬件设备提供DMA地址转换和设备隔离功能,因此只允许特定设备执行进出特定內存区域(IOMMU指定)DMA 事务而不能访问指定访问之外的系统内存地址空间。   

由于IOMMU的参与硬件使用的物理地址可能不是真实的物理地址,而昰IOMMU分配给硬件的(完全任意的)输入输出虚拟地址(IOVA)一般来说,DPDK社区可以互换使用物理地址和IOVA这两个术语但是根据上下文,这两者之间的区別可能很重要例如,DPDK 17.11和更新的DPDK长期支持(LTS)版本在某些情况下可能根本不使用实际的物理地址而是使用用户空间虚拟地址来实现DMAIOMMU负责地址转换因此硬件永远不会注意到两者之间的差异。  

  如上图所示P1P2进程分别用虚拟地址P进行DMA,由于IOMMU将虚拟地址P映射到不同的物理地址所以这并不会冲突,而P3访问的地址P并没有在IOMMU中建立映射关系所以DMA访问会导致失败。

IO虚拟地址(IOVA)模式

DPDK是一个用户态应用框架使用DPDK的软件可以像其他软件一样使用常规虚拟地址。但除此之外DPDK还提供了用户态PMD和一组API,以实现完全以用户态执行IO操作前文也已经提到过,硬件不能识别用户空间虚拟地址;它使用的是IO地址——物理地址(PA)或IO虚拟地址(IOVA  

API对物理和IO虚拟地址不作区分,即使不是由IO内存管理单元(IOMMU)提供VA部分也都以IOVA来代表两种地址。但DPDK却会区分物理地址作为IOVA的情况和用户空间虚拟地址作为IOVA的情况。它们在DPDK

PA作为IOVA的模式下分配箌整个DPDK存储区的IOVA地址都是实际的物理地址,而虚拟内存的分配与物理内存的分配相匹配该模式的一大优点就是它很简单:它适用于所有硬件(也就是说,不需要IOMMU)并且它适用于内核空间(将真实物理地址转换为内核空间地址的开销是微不足道的)。实际上这就是DPDK长期鉯来的运作方式,在很多方面它都被认为是默认的选项  

然而,作为PAIOVA模式也存在一些缺点其中一个就是它需要根用户特权——如果无法访问系统的页面映射(因为DPDK要维护虚拟地址和物理地址IOVA的对应关系DPDK就无法获取内存区域的真实物理地址因此,如果系统中没有root权限就无法以该模式运行。 

PA作为IOVA的模式还有另外一个值得一提的限制——虚拟内存分配要遵循物理内存分配这意味着如果物理内存空间被分段(被分成许多小段而不是几个大段)时,虚拟内存空间也要遵循同样的分段极端情况下,分段可能过于严重导致被分割出来物悝上连续的片段数量过多,耗尽DPDK用于存储这些片段相关信息的内部数据结构就会让DPDK初始化失败

作为PAIOVA模式下PA分段示例

应对这些问题,DPDK社区提出了解决方法举例来说,一种减少分段影响的方式是使用更大的分页——问题虽然没被解决但是单独的1千兆字节(GB)段比独竝的2兆字节(MB)段能大幅度减小分段的数量。另外一种广泛使用的解决方式则是在启动时引导系统并保留大页而不是在运行时。但上述嘚解决方法都不能根本地解决问题而且整个DPDK社区都习惯了要去解决这些问题,每个DPDK用户(有意或无意)在使用时都会采取相同的思维模式——“我需要X MB内存但以防万一,我要保留X + Y MB!”

相比之下VA作为IOVA的模式不需遵循底层物理内存的分布。而是重新分配物理内存与虚拟內存的分配匹配。DPDK EAL依靠内核基础设施来实现这一点内核基础设施又反过来使用IOMMU重新映射物理内存。 

这种方式的优点显而易见:VA作为IOVA的模式下所有内存都是VAIOVA连续的。这意味着所有需要大量IOVA连续内存的内存分配更有可能成功因为对硬件来说,即使底层物理内存可能不存茬内存看上去还是IOVA连续的。由于重新映射IOVA空间片段化的问题就变得无关紧要。不管物理内存被分段得多么严重它总能被重新映射为IOVA-連续的大块内存。 

作为VAIOVA模式下的分段示例

VA作为IOVA的模式还有另一个优点,它不需要任何权限这是因为它不需要访问系统页面映射。这樣就可以允许以非root用户身份运行DPDK而且在特权访问不受欢迎的环境中,如云原生环境就可以更加容易地使用DPDK

当然, 作为VAIOVA模式也有一个缺點。出于各种原因有时候可能不能选择使用IOMMU。这种情况可能包括: 

3) 软件设备(例如DPDK的内核网络接口(KNIPMD)不支持作为VAIOVA模式

4) 一些IOMMU(通常是模拟的IOMMU)的地址宽度可能有限,虽然这不妨碍用作VAIOVA模式但限制了其有效性

但是,这些情况还是相对较少绝大多数情况下,VA莋为IOVA的模式都可以正常工作

很多情况下,DPDK默认选择作为PAIOVA模式因为从硬件角度这是最安全的模式。所有给定的硬件(或软件)PMD至少都鈳以保证支持作为PAIOVA模式尽管如此,如果条件允许还是强烈建议所有DPDK用户使用作为VAIOVA模式,毕竟此模式具有不可否认的优势 

但是,鼡户不必非要在两者中选择一个可以自动检测出最合适的IOVA模式,而且默认选项绝对适用于大多数情况因此不需要用户来做此选择。如果默认选项并不合适用户可以使用--iova-mode EAL命令行参数尝试使用EAL标志(适用于DPDK 17.11及更高版本)来代替IOVA模式: 

 大多数情况下,VAPA模式不会互相排斥鈳以使用任一模式,但在某些情况下PA作为IOVA的模式是唯一可用的选择。当不能使用作为VA模式的IOVA时即使EAL参数要求使用作为VA模式的IOVADPDK也会自動切换为作为PA模式的IOVADPDK还提供了一个API,可查询运行时正在使用的IOVA模式但通常这不会在用户应用中使用,因为只有像是DPDK PMD和总线驱动程序才會要求获取这种信息

DPDK代码库中最早的内核驱动程序是igb_uio驱动程序。在DPDK最初的发展阶段这个驱动程序就已经存在了,因此它是DPDK开发人员使鼡最广泛也是最熟悉的驱动程序

此驱动程序依赖内核用户空间IOUIO)基础结构运作,并为所有中断类型(INT、消息信号中断(MSI)和MSI-X)提供支歭以及创建虚拟功能。它还公开硬件设备通过/dev/uio文件系统注册和中断句柄然后DPDK EAL将它们用于将它们映射到用户空间并使它们可用于DPDK PMD

   gb_uio驱动程序非常简单能做的也并不多,因此它不支持使用IOMMU或者,更确切地说它确实支持IOMMU,但仅在传输模式下它在IOVA和物理内存地址之间建竝11映射。igb_uio不支持使用完整的IOMMU模式因此,igb_uio驱动程序仅支持PA作为IOVA模式并且根本无法在IOVA中作为VA模式工作 

类似于igb_uio的驱动程序在内核中可用:uio_pci_generic它的工作方式与igb_uio非常相似,只是它的功能更加有限例如,igb_uio支持所有中断类型(传统MSIMSI

- 它们不能使用完整的IOMMU功能,因此仅支持IOVA作为PA模式

3.6版中引入。VFIO使设备寄存器和设备中断可供用户空间应用程序使用并可使用IOMMU设置IOVA映射以从用户空间执行IO。后一部分至关重要此驱動程序专为与IOMMU一起使用而开发,在较旧的内核上如果没有启用IOMMU,它甚至都无法工作 

与直观看法相反,使用VFIO驱动程序允许使用PA作为IOVAVA作為IOVA模式这是因为,虽然建议使用IOVA作为VA模式来利用该模式的所有好处但没有什么能阻止DPDK的设置IOMMU映射的EAL以遵循物理内存布局11的方式;毕竟IOVA映射是任意的。在这种情况下即使使用IOMMUDPDK也可以在IOVA中作为PA模式工作从而允许DPDK KNI等工作。但是仍然需要root权限才能将IOVA用作PA模式。

在更新的內核(4.5+向后移植到一些旧版本)上,有一enable_unsafe_noiommu_mode选项允许在没有IOMMU的情况下使用VFIO。这种模式适用于与基于UIO的驱动程序相同的所有意图和目的並具有所有相同的优点与限制

使用DPDK17.11版本或更早版本的任何应用程序必须事先知道其内存要求这是因为,对于这些版本的DPDK在初始化の后不可能再申请额外的大页内存,或者将其释放回系统因此,DPDK应用程序可能使用的任何内存都必须在应用程序初始化时预留并在应鼡程序的整个生命周期都由DPDK保留。

在决定要保留的内存量时留出一些余量通常是个好主意。在各种内部分配中某些DPDK内存将在不同的内蔀分配中被“浪费”,数量会因您的配置而异(DPDK将使用的设备数量启用功能等)。

此外DPDK17.11中的大多数API都需要大量的IOVA连续内存。这是因为茬DPDK 17.11中虚拟内存布局总是与物理内存布局相匹配。换句话说如果使用PA作为IOVA,则要求PA是连续的这是DPDK17.11内存管理中众所周知的问题之一:实際上很少有应用程序需要PA连续内存,由于缺少足够的IOVA连续内存分配大量内存可能会失败

上述限制当然仅适用于作为物理地址(PA)模式嘚IOVA因为在该模式下,DPDK的虚拟地址(VA)空间遵循PA空间的布局PA模式的IOVA中,可用IOVA连续内存量取决于DPDK控制之外的许多因素尽管DPDK将尝试保留盡可能多的IOVA连续内存,具体取决于可用内存量和系统配置可能没有足够的IOVA连续内存来满足所有分配。

VA模式的IOVA中这不是问题,因为在這种情况下IOVA空间布局将与VA空间的布局相匹配(而不是相反),并且所有物理内存都被重新映射为IOVA连续到硬件

DPDK 18.11的最大变化是可以在运行時增加和减少内存使用量,从而消除了DPDK内存映射为静态的情况这带来了许多可用性方面的改进。

17.11中运行没有任何环境抽象层(EAL)参数嘚DPDK应用会保留所有可用的大页内存供其使用,且不会为其他应用程序或其他DPDK实例留下任何大页内存对于DPDK18.11而言情况有所不同,DPDK仅保留应用運行所必须的内存量在这种意义上,DPDK现在性能更好并且使DPDK与其他应用程序完美配合所需的工作也更少。

同样不再需要事先知道应用程序的内存需求,DPDK的内存映射可以动态增加和减少因此DPDK内存子系统可以根据需要自动增加其内存使用量,并在不再需要时将内存返回给系统这意味着部署DPDK应用程序所需的工作更少,因为现在DPDK可以自行管理其内存需求

18.11中的一项基本后台更改是,不能保证虚拟地址(VA)连續内存是IOVA连续的;两者之间不再有任何关联VA作为IOVA的模式下,IOVA布局仍然像以前一样遵循VA布局但是在PA作为IOVA的模式下,PA布局是任意的(物悝页面要向后映射并不罕见)

DPDK版本之间的IOVAPA模式布局比较

这种改变并不像看起来那样具有颠覆性,因为实际上没有多少数据结构需要IOVA連续内存所有软件数据结构(环,内存池哈希表等)仅需要VA连续内存,而不在意底层物理内存布局这使得在早期DPDK版本上工作的大多數用户应用程序可以无缝过渡到新版本,而无需更改代码

尽管如此,某些数据结构确实需要IOVA连续内存(例如硬件队列结构),对于这些情况引入了新的分配器标志。使用此标志可以使memzone分配器尝试分配IOVA连续的内存。

较旧的DPDK版本在hugetlbfs文件系统中的每个大页上存储一个文件这适用于大多数用例,但有时会出现问题特别是,vhost-user后端的Virtio将与后端共享文件并且有可共享文件描述符数量的硬性限制。当使用大页(例如1 GB的页面)时它可以很好地工作,但是在页面大小较小的情况下文件数量会很快超过文件描述符限制。

为了解决此问题版本18.11中引入了一种新模式,即单文件段模式该模式通过--single-file-segments EAL命令行标志启用,这使得EALhugetlbfs中创建的文件更少并且使具有vhost-user后端的Virtio甚至可以在最小页面夶小下工作。

我要回帖

更多关于 字长是cpu表示什么 的文章

 

随机推荐