聊聊java

1.java的发展历史现状

一、java的前身
1990年,由于单片式计算机系统的火爆,sun公司为了抢占市场,成立了包括詹姆斯·高斯林在内的green小组,主要攻克家电的嵌入式应用,这些家电由于当时硬件的限制,计算处理能力和内存都非常有限,这就要求在极为紧凑的硬件中必须写入大量代码,且当时的嵌入式处理器芯片的种类繁杂,这对跨平台性要求极高,所以采用的语言必须具备简单、可移植、高性能等特点。当时最流行的语言是C++,所以green小组优先考虑使用C++编写程序,但是在实践过程中却发现单片机的硬件资源极其匮乏,而C++有过于庞大复杂。于是green小组萌生了开发一门实用性更强的语言的想法。green小组在C++的基础上进行了改良,去除了不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言,这就是java的前身。

二、java诞生
1992年,green小组向硬件生产商展示采用Oak语言开发的Green操作系统,可是硬件生产商觉得对Oak语言一无所知,贸然生产风险太大,所以Oak语言坐上了冷板凳。
1993年,美国伊利诺州的伊利诺大学的NCSA组织,发表了第一个可以显示图片的浏览器,命名为MOSAIC浏览器,这是第一个万维网浏览器。
1994年,green小组受到Mosaic浏览器的启发,认为互联网应用前景巨大,改变了面向硬件编程的目标,转而研究怎么将技术运用于互联网,并开发了一个小型万维网浏览器WebRunner。
1995年,互联网蓬勃发展,许多公司看到了互联网的前景,纷纷投入大量人力、物力研究。这时Sun公司想到了冷板凳上的Oak,重新审视了一番Oak,发现其开发的应用特性刚好满足互联网的需求,所以加大力度开发了可以嵌入网页并且可以随同网页在网络上传输的Applet程序,并准备为Oak申请注册商标,但是发现该商标已被注册。一群程序员在那里左思右想,不知道该起什么名字,一人在看到咖啡的时候灵机一动,提议道:“要不就叫java吧”,其他人都表示赞同,于是Oak改名为JAVA,并与同年5月23日Sun world会议上正式发布Java和和HotJava浏览器。JAVA就此诞生!

 

三、java的发展历程

1995年5月23日,Sun公司在Sun world会议上正式发布Java和HotJava浏览器,宣告着JAVA的诞生,创始人为詹姆斯·高斯林

1996年,Sun公司正式发布独立的、可供下载的java开发工具JDK1.0版本,这是Java发展历程中的重要里程碑

1997年,JDK1.1发布,3周内下载量达22万次

1998年,第二代java平台发布,并发布了企业版java EE

1999年,Sun公司发布Java第二代平台的三大版本:

标准版(J2SE):桌面级 C/S

企业版(J2EE):企业级 B/S

微型版(J2ME):移动端

2000年,JDK1.3、JDK1.4和J2SE1.3相继发布,几周后其获得了Apple公司Mac OS X的工业标准的支持

2001年,J2EE1.3发布

2002年,J2SE1.4发布,自此Java的计算能力有了大幅提升

2004年,J2SE1.5发布,J2SE 1.5更名为Java SE 5.0(内部版本号1.5.0),成为Java语言发展史上的又一里程碑

2005年,在Java One大会上,Sun公司发布了Java SE 6。至此,Java的各种版本已经更名,已取消其中的数字2,如J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME

2009年,oracle公司收购了sun公司
2010年,Java编程语言的共同创始人之一詹姆斯·高斯林从Oracle公司辞职
2011年,oracle公司举行了全球性的活动,以庆祝Java7的推出,随后Java7正式发布
2014年,oracle公司发布了Java8正式版
2017年,oracle公司发布Java SE 9
2018年3月,oracle公司发布Java SE 10
2018年9月,oracle公司发布Java SE 11
2019年2月,oracle公司发布Java SE 12
2019年9月,oracle公司发布Java SE 13
2020年3月,oracle公司发布Java SE 14
2020年9月,oracle公司发布Java SE 15
2021年4月,oracle公司发布Java SE 16

1. 美国Segue公司的Silk系列产品
   Segue公司一直专注于软件质量优化领域。在Segue的产品套件中,拥有业内最强劲且最容易使用的、用于企业应用测试、调优和监测的自动化工具,能够帮助用户保障应用在其生命周期内的可靠性和性能。
  (1) SilkPerformer——企业级性能测试工具
  企业级自动化测试工具能够支持多种系统,如Java、.Net、Wireless、COM、CORBA、Oracle、Citrix、MetaFrame、客户机/服务器、以及各种ERP/CRM应用 
  多项专利技术精确模拟各种复杂的企业环境 
  可视化脚本记录功能及自定义工具简化了测试创建工作 
  SilkPerformer的Java/.NET浏览器以及JUnit/NUnit测试输入功能简化了对并发访问情况下远程应用组件的早期负载测试工作 
  方便易用,工作流向导会逐步引导用户完成整个测试流程 
  (2) SilkTest International——业内唯一的Unicode功能测试工具
  SilkBean 充分利用 Java 语言的“编写一次,随处使用”的优点,让用户不必修改现有的脚本而能够在多种基于 Unix 的系统上运行
  能够识别多种开发平台,如Java、JavaScript、HTML、ActiveX、Visual Basic 和C/C++等
  一套脚本可供所有支持的语言使用
  内置的错误恢复系统不仅具有自定义功能,可进行无人看守的自动测试
  赛格瑞(Segue)公司是全球范围内专注于软件质量优化解决方案的领导者。2005年,赛格瑞(Segue)公司在中国设立了专门的销售服务公司,因此,赛格瑞(Segue)公司的软件测试产品在中国有了更好的技术支持。
  参考网站:http://www.segue.com.cn/
  推荐指数:★★★★★

 MaxQ
  MaxQ是一个免费的功能测试工具。它包括一个HTTP代理工具,可以录制测试脚本,并提供回放测试过程的命令行工具。测试结果的统计图表类似于一些较昂贵的商用测试工具。MaxQ希望能够提供一些关键的功能,比如HTTP测试录制回放功能,并支持脚本。
  参考网站:http://maxq.tigris.org/ 
  推荐指数:★★★☆☆
  3. Httpunit
  HttpUnit是一个开源的测试工具,是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端。
  HttpUnit提供的帮助类让测试者可以通过Java类和服务器进行交互,并且将服务器端的响应当作文本或者DOM对象进行处理。HttpUnit还提供了一个模拟Servlet容器,让测试者不需要发布Servlet,就可以对Servlet的内部代码进行测试。本文中作者将详细的介绍如何使用HttpUnit提供的类完成集成测试。
  参考网站:http://www.httpunit.org/
  推荐指数:★★★☆☆
  4. Junit 
  是通用的测试 java 程序的测试框架JUnit可以对Java代码进行白盒测试。通过JUnitk可以用mock objects进行隔离测试;用Cactus进行容器内测试;用Ant和Maven进行自动构建;在Eclipse内进行测试;对Java应用程序、Filter、Servlet、EJB、JSP、数据库应用程序、Taglib等进行单元测试。
  参考网站:http://www.junit.org/
  推荐指数:★★★★★
  5. Jtest
  Jtest是Parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。Jtest先分析每个java类,然后自动生成junit测试用例并执行用例,从而实现代码的最大覆盖,并将代码运行时未处理的异常暴露出来;另外,它还可以检查以DbC(Design by Contract)规范开发的代码的正确性。用户还可以通过扩展测试用例的自动生成器来添加更多的junit用例。Jtest还能按照现有的超过350个编码标准来检查并自动纠正大多数常见的编码规则上的偏差,用户可自定义这些标准,通过简单的几个点击,就能预防类似于未处理异常、函数错误、内存泄漏、性能问题、安全隐患这样的代码问题。
  JTest最大的优势在于静态代码分析,至于自动生成测试代码,当然生成测试代码框架也是不错的,但要做好单元测试用户还要做大量的工作。
  参考网站:http://www.parasoft.com/jsp/aep/aep.jsp
  推荐指数:★★★★☆

6. Hansel
  Hansel 是一个测试覆盖率的工具——与用于单元测试的 JUnit framework 相集成,很容易检查单元测试套件的覆盖情况。
  参考网站:http://hansel.sourceforge.net/
  推荐指数:★★☆☆☆
  7. Cactus 
  Cactus是一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等针对外部可测试组件运行时,需要把JUnit测试运行为发送HTTP请求给组件的客户端进程。为了在服务器容器内部运行JUnit测试,可以用Cactus框架,它是一个免费的开源框架,是Apache Jakarta项目的一部分。Cactus 包含了关于JUnit客户端如何连接到服务器,然后使测试运行的详细信息。
  参考网站:http://jakarta.apache.org/cactus/
  推荐指数:★★★★☆
  8. JFCUnit
  JFCUnit使得你能够为Java偏移应用程序编写测试例子。它为从用代码打开的窗口上获得句柄提供了支持;为在一个部件层次定位部件提供支持;为在部件中发起事件(例如按一个按钮)以及以线程安全方式处理部件测试提供支持。
  参考网站:http://jfcunit.sourceforge.net/
  推荐指数:★★★☆☆
  9. StrutsTestCase
  StrutsTestCase(STC)框架是一个开源框架,用来测试基于 Struts 的 Web 应用程序。这个框架允许您在以下方面进行测试:
  在 ActionForm 类中的验证逻辑(validate() 方法)
  在 Action 类中的业务逻辑(execute() 方法) 
  动作转发(Action Forwards)。 
  转发 JSP
  STC 支持两种测试类型:
  Mock 方法 —— 在这种方法中,通过模拟容器提供的对象(HttpServletRequest、 HttpServletResponse 和 ServletContext),STC 不用把应用程序部署在应用服务器中,就可以对其进行测试。
  Cactus 方法 —— 这种方法用于集成测试阶段,在这种方法中,应用程序要部署在容器中,所以可以像运行其他 JUnit 测试用例那样运行测试用例。

参考网站:http:// strutstestcase.sourceforge.net/
  推荐指数:★★★★☆
  10. TestNG
  TestNG是根据JUnit 和 NUnit思想而构建的一个测试框架,但是TestNG增加了许多新的功能使得它变得更加强大与容易使用比如:
  支持JSR 175注释(JDK 1.4利用JavaDoc注释同样也支持)
  灵活的Test配置
  支持默认的runtime和logging JDK功能
  强大的执行模型(不再TestSuite)
  支持独立的测试方法
  参考网站:http://testng.org/
  推荐指数:★★★★☆ 93643251f46c4437992da5a415ac687a.jpg

 程序员编写.java文件
javac编译成字节码文件.class(JVM只认识.class文件)
在由JVM解释成电脑认识的机器语言

JVM,JRE,JDK

3b770b9ad80b44a0b9957f629eeb0a77.jpg

 JVM:Java虚拟机,运行Java字节码文件.calss的虚拟机。
Java针对不同的系统平台都开发了对应的虚拟机,实现跨平台,一次编写,多处运行。JVM使用GC垃圾回收器和自适应优化器。
JRE:Java运行环境是一个软件,JRE为Java运行提供了环境。内部有一个Java虚拟机,以及一些标准的类库(Class Library)。
JDK:Java软件开发工具包,用于各种环境下的Java程序开发。是整个Java开发的核心,包含了JRE(JVM+Java类库Java API)和Java工具(Javac)。
JDK目录下有四个文件夹:bin、include、lib、 jre。
bin:最主要的是编译器(javac.exe)
include:java和JVM交互用的头文件
lib:类库
jre:java运行环境
总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。
三、JVM内存结构4d019ccd0e8c4aecb2329c5f5def4d76.jpg

 

JVM根据存储数据划分:
堆 Heap:作用是存放对象实例和数组。所有线程共享的内存区域,存储程序运行时被创建的所有对象。在虚拟机启动时创建。分为新生代和老年代。GC管理的主要区域。
方法区 Method Area :存储被加载的类信息(元数据)、常量、静态变量、即时编译器编译后的代码等数据。所有线程共享的内存区域。方法区中有运行常量池,用于存放编译期的各种字面值和符号引用。别名叫作“非堆”。
栈 Stack :线程私有,存储局部变量和中间结果。Java方法执行的线程内存模型。每个线程有自己的Java栈区,所有的这些变量都是创建在他们的线程的本地变量,在线程创建时栈区被创建,所有这些本地变量被称为线程本地变量。栈的单位是栈帧,一个方法一个栈帧。
程序计数器 PC register:存储当前正在执行的字节码指令的位置(行号)。在Java中,每个线程有自己独立的程序计数器。
由于JVM的多线程是通过线程轮流切换并分配处理器执行时间来实现,一个处理器只能执行一条线程中的指令。为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储。也叫线程私有的内存。
本地方法栈:为虚拟机使用到的本地(Native)方法服务。Native 方法是 Java 通过 JNI 直接调用本地 C/C++ 库,如notify,hashcode,wait等都是native方法。
四、JVM垃圾回收机制

四种引用:

f7cadc67122742ce9645c69d3c056a0c.jpg

 

强引用:Object obj=new Object(),只要强引用关联还在,垃圾回收器永不回收被引用的对象。
软引用:系统将要发生内存溢出之前,软引用关联的对象会被回收。回收后还是空间不足,才会抛出内存溢出。
例如:一个程序用来处理用户上传的图片。若将所有图片读入内存,这样虽然可以很快的打开图片,但内存空间使用巨大,一些使用较少的图片浪费内存空间,需要手动从内存中移除。如果每次打开图片都从磁盘文件中读取到内存再显示出来,虽然内存占用较少,但一些经常使用的图片每次打开都要访问磁盘,代价巨大。这个时候就可以用软引用构建缓存。
弱引用:一些有用但并非必须,弱引用关联的对象,只能生存大下一次垃圾回收之前,GC发生时,不管内存够不够,都会被回收。
虚引用:幽灵引用,最弱,随时会被回收掉。垃圾回收时收到一个通知,为了监控垃圾回收器是否正常工作。
对象存活判断:
引用计算和根可达分析俩种算法。
引用计算:判断对象的引用数量来决定对象是否可以被回收、每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1。C++和Python采用这种算法,JVM并没有使用。
根可达分析:扫描堆中的对象,沿着GC Root对象为起点的引用链找该对象,找不到则证明此对象不可用。
垃圾回收算法:
当发生GC时,经过GC Roots算法判断为不可达的对象,就会进行对象回收。JVM对象回收主要有复制算法、标记清除、标记整理算法。
复制算法:将可用内存按容量划分为大小相等的两块,每次只使用其中一块。垃圾回收时,将所有存活的对象复制到另一块区域。然后对该区域进行整体清除。
标记-清除算法:标记所有需要回收的对象,标记完成后统一回收。
特点:会存在内存碎片,导致在程序运行中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发GC,执行效率不稳定,需要清理对象越多,效率越低。
标记-整理算法:
标记所有需要回收的对象,标记完成后,将存活对象整理到连续区域。然后将非存活对象清除。
特点:回收后堆空间规整,没有碎片。效率低,涉及到对象移动、引用更新、需要暂停用户线程。
五、Java内存管理

Java内存管理包括内存分配和内存回收两个方面。由JVM自动完成new一个Java对象时,即可视为为Java对象申请一个内存空间,JVM会在堆内存中为每个对象分配空间,当一个Java对象失去引用时,JVM的垃圾回收机制就会自动清除他们,并回收它们所占用的内存空间。
当Java对象被创建出来之后,垃圾回收机制GC会实时的监控每一个对象的运行状态。当监控到某个对象不在被引用变量所引用时,垃圾回收机制会立即回收它所占用的空间。
JVM的垃圾回收机制采用有向图方式来管理内存中的对象,可以方便的解决循环引用的问题。
当一个对象在堆内存中运行时,根据它有向图中的状态,可以把状态分为三种:
可达状态:当一个对象被创建后,有一个以上的变量引用它时。有向图中从起始顶点可以到该对象,那它就处于可达状态。程序可通过引用变量来调用该对象的属性和方法。
可恢复状态:若程序中某个对象不再有任何变量引用,它先进入可恢复状态。此时,系统的垃圾回收机制准备回收该对象所占用的内存。在回收之前,系统会调用该对象的finalize方法进行资源清理,如果在调用finalize方法重新让一个以上引用变量引用该对象,则这个对象会再次变为可达状态。否则,该对象将进入不可达状态。
当对象变成不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。

在Java的内存分配中,总共3种常量池:
Java 常量池详解(二)class文件常量池 和 Java 常量池详解(三)class运行时常量池

1.字符串常量池(String Constant Pool)
在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代
在JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代
在JDK1.8 hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace)

1.1:字符串常量池在Java内存区域的哪个位置?
在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中;
在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。
(堆内是可以进行回收的,然后方法区也是能回收的,但是本身区域内存比较少,如果用的字符串常量太多了,也会抛java.lang.OutOfMemoryError:PermGenspace 异常)
1.2:字符串常量池是什么?
在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个Hash表,默认值大小长度是1009;这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。字符串常量由一个一个字符组成,放在了StringTable上。
在JDK6.0中,StringTable的长度是固定的,长度就是1009,因此如果放入String Pool中的String非常多,就会造成hash冲突,导致链表过长,当调用String#intern()时会需要到链表上一个一个找,从而导致性能大幅度下降;
在JDK7.0中,StringTable的长度可以通过参数指定a261c3e17ce244c194a75ed48ea5faff.jpg

f6d697658c154a72abae2fc16292e44e.jpg 

6964ff31287a4883a44d2b206392f7e4.jpg 

 如何将String对象放入到常量池
“abc” 双引号String 对象会自动放入常量池
调用String的intern 方法也会将对象放入到常量池中
String 对象代码案例解析bf93e1dbba2a4085bec3a3edf5627ab1.jpg

 

public static void main(String[] args) {
    String a = "a";
    String b = "b";
    String c = "a" + "b";
    //生成两个对象 一个"ab" ,一个新的String 对象value 值是ab
    //public String(String original) {
    //   this.value = original.value;
    //   this.hash = original.hash;
    //}
    String d = new String("ab"); 
    
    String e = a + "b";
    String f = a + b;
    String g = "ab";
    
   System.out.println(e == c);
   System.out.println(c == d);
   System.out.println(f == c);
   System.out.println(g == c);
   
   String e1 = e.intern();
   String c2 = c.intern();
   System.out.println(e1 == c2);
   System.out.println(e1 == c);
}

//运行结果
false
false
false
true
true
true

String b = "b";
String c = "a" + "b"; 等价于 String c ="ab"
String c1 = "a" + b; 
 
// java 反编译的结果  
 0 ldc #3 <b> //load constant  加载常量 "b"
 2 astore_1   // 存入变量1中
 3 ldc #4 <ab> //自动识别了 
 5 astore_2
 6 new #7 <java/lang/StringBuilder>
 9 dup
10 invokespecial #8 <java/lang/StringBuilder.<init>>
13 ldc #2 <a>
15 invokevirtual #9 <java/lang/StringBuilder.append>
18 aload_1
19 invokevirtual #9 <java/lang/StringBuilder.append>
22 invokevirtual #10 <java/lang/StringBuilder.toString>
25 astore_3
26 return

(1) “a”+“b” 编译器自动识别了变成了 “ab” => 3 ldc #4 
(2) “a” + b(变量)

先new 了StringBuilder 对象,并初始化init
然后bulider.append(“a”)
从变量1(b)中取出值"b"
然后执行了bulider.append(“b”)
最后执行了builder.toString() 方法 给变量3( c1)进行赋值
new string(“abc”)创建了几个对象
答案:是两个 ,new string(xxxx)方法,xxxx传入的是String对象。说明xxxx也是String对象。

常量池设计的目的是什么:
在jvm规范中,每个类型都有自己的常量池。常量池是某类型所用常量的一个有序集合,包括直接常量(基本类型,String)和对其他类型、字段、方法的符号引用。之所以是符号引用而不是像c语言那样,编译时直接指定其他类型,是因为java是动态绑定的,只有在运行时根据某些规则才能确定具体依赖的类型实例,这正是java实现多态的基础。

为了对常量池有更具体的认识,下面引用几个例子

x86架构和arm架构的区别
  本文主要介绍的是arm架构和x86架构的区别,首先介绍了ARM架构图,其次介绍了x86架构图,最后从性能、扩展能力、操作系统的兼容性、软件开发的方便性及可使用工具的多样性及功耗这五个方面详细的对比了arm架构和x86架构的区别,具体的跟随小编一起来了解一下。
  什么叫arm架构
  ARM架构过去称作进阶精简指令集机器(AdvancedRISCMachine,更早称作:AcornRISCMachine),是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。由于节能的特点,ARM处理器非常适用于移动通讯领域,符合其主要设计目标为低耗电的特性。
  在今日,ARM家族占了所有32位嵌入式处理器75%的比例,使它成为占全世界最多数的32位架构

之一。ARM处理器可以在很多消费性电子产品上看到,从可携式装置(PDA、移动电话、多媒体播放器、掌上型电子游戏,和计算机)到电脑外设(硬盘、桌上型路由器)甚至在导弹的弹载计算机等军用设施中都有他的存在。在此还有一些基于ARM设计的派生产品,重要产品还包括Marvell的XScale架构和德州仪器的OMAP系列。
  ARM架构图
  下图所示的是ARM构架图。它由32位ALU、若干个32位通用寄存器以及状态寄存器、32&TImes;8位乘法器、32&TImes;32位桶形移位寄存器、指令译码以及控制逻辑、指令流水线和数据/地址寄存器组成。
  1、ALU:它有两个操作数锁存器、加法器、逻辑功能、结果以及零检测逻辑构成。
  2、桶形移位寄存器:ARM采用了32&TImes;32位的桶形移位寄存器,这样可以使在左移/右移n位、环移n位和算术右移n位等都可以一次完成。
  3、高速乘法器:乘法器一般采用“加一移位”的

当然,这个架构图并不是所有的都是如此,根据不同的主板,平台,架构是略有差别的比如说,目前很多主板已经将北桥集成到CPU当中,将南桥集成为PCH,但大致的框架还是如此的。下面对这个架构图上的各个内容分别进行一些简介。
  1:CPU,大家都不陌生的名词,中央处理器,计算机的核心大脑。
  2: 北桥(North Bridge Chipset):北桥是电脑主板上的一块芯片,位于CPU插座边,起连接作用。
  3:南桥芯片(South Bridge)是主板芯片组的重要组成部分,一般位于主板上离CPU插槽较远的下方,PCI插槽的附近,这种布局是考虑到它所连接的I/O总线较多,离处理器远一点有利于布线。
  4: 内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响

影响非常大。
  5:显卡(Video card,Graphics card)全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一。
  6:显示j接口
  7:网卡是工作在链路层的网络组件,是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉及帧的发送与接收、帧的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功能等。
  8:声卡的基本功能是把来自话筒、磁带、光盘的原始声音信号加以转换,输出到耳机、扬声器、扩音机、录音机等声响设备,或通过音乐设备数字接口(MIDI)使乐器发出美妙的声音。

arm架构和x86架构有什么区别
  一、性能
  X86结构的电脑无论如何都比ARM结构的系统在性能方面要快得多、强得多。X86的CPU随便就是1G以上、双核、四核大行其道,通常使用45nm(甚至更高级)制程的工艺进行生产;而ARM方面:CPU通常是几百兆,最近才出现1G左右的CPU,制程通常使用不到65nm制程的工艺,可以说在性能和生产工艺方面ARM根本不是X86结构系统的对手。
  但ARM的优势不在于性能强大而在于效率,ARM采用RISC流水线指令集,在完成综合性工作方面根本就处于劣势,而在一些任务相对固定的应用场合其优势就能发挥得淋漓尽致。
  二、扩展能力
  X86结构的电脑采用“桥”的方式与扩展设备(如:硬盘、内存等)进行连接,而且x86结构的电脑出现了近30年,其配套扩展的设备种类多、价格也比较便宜,所以x86结构的电脑能很容易进行性能

性能扩展,如增加内存、硬盘等。
  ARM结构的电脑是通过专用的数据接口使CPU与数据存储设备进行连接,所以ARM的存储、内存等性能扩展难以进行(一般在产品设计时已经定好其内存及数据存储的容量),所以采用ARM结构的系统,一般不考虑扩展。基本奉行“够用就好”的原则。
  三、操作系统的兼容性
  X86系统由微软及Intel构建的Wintel联盟一统天下,垄断了个人电脑操作系统近30年,形成巨大的用户群,也深深固化了众多用户的使用习惯,同时x86系统在硬件和软件开发方面已经形成统一的标准,几乎所有x86硬件平台都可以直接使用微软的视窗系统及现在流行的几乎所有工具软件,所以x86系统在兼容性方面具有无可比拟的优势。
  ARM系统几乎都采用Linux的操作系统,而且几乎所有的硬件系统都要单独构建自己的系统,与其他系统不能兼容,这也导致其应用软件不能方便移植,

这一点一直严重制约了ARM系统的发展和应用。GOOGLE开发了开放式的Android系统后,统一了ARM结构电脑的操作系统,使新推出基于ARM结构的电脑系统有了统一的、开放式的、免费的操作系统,为ARM的发展提供了强大的支持和动力。
  四、软件开发的方便性及可使用工具的多样性
  X86结构的系统推出已经近30年,在此期间,x86电脑经过飞速发展的黄金时期,用户的应用、软件配套、软件开发工具的配套及兼容等工作,已经到达非常成熟甚至可以说是完美的境界。所以使用X86电脑系统不仅有大量的第三方软件可供选择,也有大量的软件编程工具可以帮助您完成您所希望完成的工作。
  Arm结构的电脑系统因为硬件性能的制约、操作系统的精简、以及系统兼容等问题的制约,造成Arm结构的电脑系统不可能像X86电脑系统那样有众多的编程工具和第三方软件可供选择及使用,ARM的编编程语言大多采用C和JAVA。

  对这一点的比较,更直接的结论是:基于x86结构电脑系统平台开发软件比arm结构系统更容易、更简单、实际成本也更低,同时更容易找到第三方软件(免去自己开发的时间和成本),而且软件移植更容易。

  从以上对比分析,给了我们的一个很清晰的感觉,ARM和X86结构的电脑根本就无法对比,ARM根本就不是X86电脑的的对手。是的,如果只考虑上述几个方面的要数,ARM确实无法与X86电脑竞争,甚至连比较的资格都没有。但是近1、2年,ARM的产品在终端应用特别是手持终端应用飞速发展(如:智能手机、平板电脑等),其销售数量已经远远超出x86结构的电脑销售数量,可见ARM是具有其与X86结构电脑不可对比的优势。该优势就是:功耗。

  五、功耗
  X86电脑因考虑要适应各种应用的需求,其发展思路是:性能+速度。20多年来x86电脑的速度从原来8088的几M发展到现在随便就是几G,而且还是几核,其速度和性能已经提升了千、万倍,技术进步使x86电脑成为大众生活中不可缺少的一部分。但是x86电脑发展的方向和模式,使其功耗一直居高不下,一台电脑随便就是几百瓦,即使是号称低功耗节能的手提电脑或上网本,也有十几、二十多瓦的功耗,这与ARM结构的电脑就无法相比

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值