关于IO会涉及到阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO等几个知识点。知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉。
阻塞IO情况下,当用户调用 read 后,用户线程会被阻塞,等内核数据准备好并且数据从内核缓冲区拷贝到用户态缓存区后 read 才会返回。可以看到是阻塞的两个部分。
非阻塞IO发出read请求后发现数据没准备好,会继续往下执行,此时应用程序会不断轮询polling内核询问数据是否准备好,当数据没有准备好时,内核立即返回EWOULDBLOCK错误。直到数据被拷贝到应用程序缓冲区,read请求才获取到结果。并且你要注意!这里最后一次 read 调用获取数据的过程,是一个同步的过程,是需要等待的过程。这里的同步指的是 内核态的数据拷贝到用户程序的缓存区这个过程 。
非阻塞情况下无可用数据时,应用程序每次轮询内核看数据是否准备好了也耗费CPU,能否不让它轮询,当内核缓冲区数据准备好了,以事件通知当机制告知应用进程数据准备好了呢?应用进程在没有收到数据准备好的事件通知信号时可以忙写其他的工作。此时 IO多路复用 就派上用场了。
IO多路复用中文比较让人头大,IO多路复用的原文叫 I/O multiplexing,这里的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流 发明它的目的是尽量多的提高服务器的吞吐能力。实现一个线程监控多个IO请求,哪个IO有请求就把数据从内核拷贝到进程缓冲区,拷贝期间是阻塞的!现在已经可以通过采用mmap地址映射的方法,达到内存共享效果,避免真复制,提高效率。
像 select、poll、epoll 都是I/O多路复用的具体的实现。
select是第一版IO复用,提出后暴漏了很多问题。
poll 修复了 select 的很多问题。
但是poll仍然不是线程安全的, 这就意味着不管服务器有多强悍,你也只能在一个线程里面处理一组 I/O 流。你当然可以拿多进程来配合了,不过然后你就有了多进程的各种问题。
epoll 可以说是 I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题, 比如:
横轴 Dead connections 是链接数的意思,叫这个名字只是它的测试工具叫deadcon。纵轴是每秒处理请求的数量,可看到epoll每秒处理请求的数量基本不会随着链接变多而下降的。poll 和/dev/poll 就很惨了。但 epoll 有个致命的缺点是只有 linux 支持。
比如平常Nginx为何可以支持4W的QPS是因为它会使用目标平台上面最高效的I/O多路复用模型。
然后你会发现上面的提到过的 *** 作都不是真正的异步,因为两个阶段总要等待会儿!而真正的异步 I/O 是内核数据准备好和数据从内核态拷贝到用户态这两个过程都不用等待。
很庆幸,Linux给我们准备了 aio_read 跟 aio_write 函数实现真实的异步,当用户发起aio_read请求后就会自动返回。内核会自动将数据从内核缓冲区拷贝到用户进程空间,应用进程啥都不用管。
我强力推荐C++后端开发免费学习地址:C/C++Linux服务器开发/后台架构师零声教育-学习视频教程-腾讯课堂
同步跟异步的区别在于 数据从内核空间拷贝到用户空间是否由用户线程完成 ,这里又分为同步阻塞跟同步非阻塞两种。
我们以同步非阻塞为例,如下可看到,在将数据从内核拷贝到用户空间这一过程,是由用户线程阻塞完成的。
可发现,用户在调用之后会立即返回,由内核完成数据的拷贝工作,并通知用户线程,进行回调。
在Java中,我们使用socket进行网络通信,IO主要有三种模式,主要看 内核支持 哪些。
同步阻塞IO ,每个客户端的Socket连接请求,服务端都会对应有个处理线程与之对应,对于没有分配到处理线程的连接就会被阻塞或者拒绝。相当于是 一个连接一个线程 。
BIO特点 :
常量:
主类:
服务端监听线程:
服务端处理线程:
客户端:
同步非阻塞IO之NIO :服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时说明读就绪,则调用该socket连接的相应读 *** 作。如果发现某个 Socket端口上有数据可写时说明写就绪,则调用该socket连接的相应写 *** 作。如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到了很大提高,在进行IO *** 作请求时候再用个线程去处理,是 一个请求一个线程 。Java中使用Selector、Channel、Buffer来实现上述效果。
每个线程中包含一个 Selector 对象,它相当于一个通道管理器,可以实现在一个线程中处理多个通道的目的,减少线程的创建数量。远程连接对应一个channel,数据的读写通过buffer均在同一个 channel 中完成,并且数据的读写是非阻塞的。通道创建后需要注册在 selector 中,同时需要为该通道注册感兴趣事件(客户端连接服务端事件、服务端接收客户端连接事件、读事件、写事件), selector 线程需要采用 轮训 的方式调用 selector 的 select 函数,直到所有注册通道中有兴趣的事件发生,则返回,否则一直阻塞。而后循环处理所有就绪的感兴趣事件。以上步骤解决BIO的两个瓶颈:
下面对以下三个概念做一个简单介绍,Java NIO由以下三个核心部分组成:
channel和buffer有好几种类型。下面是Java NIO中的一些主要channel的实现:
正如你所看到的,这些通道涵盖了UDP和TCP网络IO,以及文件IO。以下是Java NIO里关键的buffer实现:
在微服务阶段,一个请求可能涉及到多个不同服务之间的跨服务器调用,如果你想实现高性能的PRC框架来进行数据传输,那就可以基于Java NIO做个支持长连接、自定义协议、高并发的框架,比如Netty。Netty本身就是一个基于NIO的网络框架, 封装了Java NIO那些复杂的底层细节,给你提供简单好用的抽象概念来编程。比如Dubbo底层就是用的Netty。
AIO是异步非阻塞IO,相比NIO更进一步,进程读取数据时只负责发送跟接收指令,数据的准备工作完全由 *** 作系统来处理。
推荐一个零声教育C/C++后台开发的免费公开课程,个人觉得老师讲得不错,分享给大家:C/C++后台开发高级架构师,内容包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,C/C++Linux服务器开发/后台架构师零声教育-学习视频教程-腾讯课堂 立即学习
原文:阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
本文主要包括tomcat服务器的目录结构、工作模式、整体架构、I/O模型以及NIO、NIO2、APR三者的对比介绍。
我们先来看一下tomcat85和tomcat9中的home目录中的文件:
可以看到除掉一些说明文件之后,还有7个目录:
实际上除了主目录里有lib目录,在webapps目录下的web应用中的WEB-INF目录下也存在一个lib目录:
两者的区别在于:
● Tomcat主目录下的lib目录:存放的JAR文件 不仅能被Tomcat访问,还能被所有在Tomcat中发布的Java Web应用访问
● webapps目录下的Java Web应用的lib目录:存放的JAR文件 只能被当前Java Web应用访问
既然有多个lib目录,那么肯定就有使用的优先顺序,Tomcat类加载器的目录加载优先顺序如下:
Tomcat的类加载器负责为Tomcat本身以及Java Web应用加载相关的类。假如Tomcat的类加载器要为一个Java Web应用加载一个类,类加载器会按照以下优先顺序到各个目录中去查找该类的class文件,直到找到为止,如果所有目录中都不存在该类的class文件,则会抛出异常:
Tomcat不仅可以单独运行,还可以与其他的Web服务器集成,作为其他Web服务器的进程内或进程外的servlet容器。集成的意义在于:对于不支持运行Java Servlet的其他Web服务器,可通过集成Tomcat来提供运行Servlet的功能。
Tomcat有三种工作模式:
我们先从tomcat的源码目录来分析一下tomcat的整体架构,前面我们配置jsvc运行tomcat的时候,我们知道tomcat中启动运行的最主要的类是 orgapachecatalinastartupBootstrap ,那么我们在tomcat的源码中的java目录下的org目录的apache目录可以找到主要的源码的相对应的类。
图中的目录如果画成架构图,可以这样表示:
Tomcat 本质上就是一款Servlet 容器,因此 catalina 才是Tomcat的核心 ,其他模块都是为 catalina 提供支撑的。
单线程阻塞I/O模型是最简单的一种服务器I/O模型,单线程即同时只能处理一个客户端的请求,阻塞即该线程会一直等待,直到处理完成为止。对于多个客户端访问,必须要等到前一个客户端访问结束才能进行下一个访问的处理,请求一个一个排队,只提供一问一答服务。
如上图所示:这是一个同步阻塞服务器响应客户端访问的时间节点图。
这种模型的特点在于单线程和阻塞I/O。 单线程即服务器端只有一个线程处理客户端的所有请求,客户端连接与服务器端的处理线程比是 n:1 ,它无法同时处理多个连接,只能串行处理连接。而阻塞I/O是指服务器在读写数据时是阻塞的,读取客户端数据时要等待客户端发送数据并且把 *** 作系统内核复制到用户进程中,这时才解除阻塞状态。写数据回客户端时要等待用户进程将数据写入内核并发送到客户端后才解除阻塞状态。 这种阻塞带来了一个问题,服务器必须要等到客户端成功接收才能继续往下处理另外一个客户端的请求,在此期间线程将无法响应任何客户端请求。
该模型的特点:它是最简单的服务器模型,整个运行过程都只有一个线程,只能支持同时处理一个客户端的请求(如果有多个客户端访问,就必须排队等待), 服务器系统资源消耗较小,但并发能力低,容错能力差。
多线程阻塞I/O模型在单线程阻塞I/O模型的基础上对其进行改进,加入多线程,提高并发能力,使其能够同时对多个客户端进行响应,多线程的核心就是利用多线程机制为每个客户端分配一个线程。
如上图所示,服务器端开始监听客户端的访问,假如有两个客户端同时发送请求过来,服务器端在接收到客户端请求后分别创建两个线程对它们进行处理,每条线程负责一个客户端连接,直到响应完成。 期间两个线程并发地为各自对应的客户端处理请求 ,包括读取客户端数据、处理客户端数据、写数据回客户端等 *** 作。
这种模型的I/O *** 作也是阻塞的 ,因为每个线程执行到读取或写入 *** 作时都将进入阻塞状态,直到读取到客户端的数据或数据成功写入客户端后才解除阻塞状态。尽管I/O *** 作阻塞,但这种模式比单线程处理的性能明显高了,它不用等到第一个请求处理完才处理第二个,而是并发地处理客户端请求,客户端连接与服务器端处理线程的比例是 1:1 。
多线程阻塞I/O模型的特点:支持对多个客户端并发响应,处理能力得到大幅提高,有较大的并发量,但服务器系统资源消耗量较大,而且如果线程数过多,多线程之间会产生较大的线程切换成本,同时拥有较复杂的结构。
在探讨单线程非阻塞I/O模型前必须要先了解非阻塞情况下套接字事件的检测机制,因为对于单线程非阻塞模型最重要的事情是检测哪些连接有感兴趣的事件发生。一般会有如下三种检测方式。
当多个客户端向服务器请求时,服务器端会保存一个套接字连接列表中,应用层线程对套接字列表轮询尝试读取或写入。如果成功则进行处理,如果失败则下次继续。这样不管有多少个套接字连接,它们都可以被一个线程管理,这很好地利用了阻塞的时间,处理能力得到提升。
但这种模型需要在应用程序中遍历所有的套接字列表,同时需要处理数据的拼接,连接空闲时可能也会占用较多CPU资源,不适合实际使用。
这种方式将套接字的遍历工作交给了 *** 作系统内核,把对套接字遍历的结果组织成一系列的事件列表并返回应用层处理。对于应用层,它们需要处理的对象就是这些事件,这是一种事件驱动的非阻塞方式。
服务器端有多个客户端连接,应用层向内核请求读写事件列表。内核遍历所有套接字并生成对应的可读列表readList和可写列表writeList。readList和writeList则标明了每个套接字是否可读/可写。应用层遍历读写事件列表readList和writeList,做相应的读写 *** 作。
内核遍历套接字时已经不用在应用层对所有套接字进行遍历,将遍历工作下移到内核层,这种方式有助于提高检测效率。 然而,它需要将所有连接的可读事件列表和可写事件列表传到应用层,假如套接字连接数量变大,列表从内核复制到应用层也是不小的开销。 另外,当活跃连接较少时, 内核与应用层之间存在很多无效的数据副本 ,因为它将活跃和不活跃的连接状态都复制到应用层中。
通过遍历的方式检测套接字是否可读可写是一种效率比较低的方式,不管是在应用层中遍历还是在内核中遍历。所以需要另外一种机制来优化遍历的方式,那就是 回调函数 。内核中的套接字都对应一个回调函数,当客户端往套接字发送数据时,内核从网卡接收数据后就会调用回调函数,在回调函数中维护事件列表,应用层获取此事件列表即可得到所有感兴趣的事件。
内核基于回调的事件检测方式有两种
第一种是用 可读列表readList 和 可写列表writeList 标记读写事件, 套接字的数量与 readList 和 writeList 两个列表的长度一样 。
上面两种方式由 *** 作系统内核维护客户端的所有连接并通过回调函数不断更新事件列表,而应用层线程只要遍历这些事件列表即可知道可读取或可写入的连接,进而对这些连接进行读写 *** 作,极大提高了检测效率,自然处理能力也更强。
单线程非阻塞I/O模型最重要的一个特点是,在调用读取或写入接口后立即返回,而不会进入阻塞状态。虽然只有一个线程,但是它通过把非阻塞读写 *** 作与上面几种检测机制配合就可以实现对多个连接的及时处理,而不会因为某个连接的阻塞 *** 作导致其他连接无法处理。在客户端连接大多数都保持活跃的情况下,这个线程会一直循环处理这些连接,它很好地利用了阻塞的时间,大大提高了这个线程的执行效率。
单线程非阻塞I/O模型的主要优势体现在对多个连接的管理,一般在同时需要处理多个连接的发场景中会使用非阻塞NIO模式,此模型下只通过一个线程去维护和处理连接,这样大大提高了机器的效率。一般服务器端才会使用NIO模式,而对于客户端,出于方便及习惯,可使用阻塞模式的套接字进行通信。
在多核的机器上可以通过多线程继续提高机器效率。最朴实、最自然的做法就是将客户端连接按组分配给若干线程,每个线程负责处理对应组内的连接。比如有4个客户端访问服务器,服务器将套接字1和套接字2交由线程1管理,而线程2则管理套接字3和套接字4,通过事件检测及非阻塞读写就可以让每个线程都能高效处理。
多线程非阻塞I/O模式让服务器端处理能力得到很大提高,它充分利用机器的CPU,适合用于处理高并发的场景,但它也让程序更复杂,更容易出现问题(死锁、数据不一致等经典并发问题)。
最经典的多线程非阻塞I/O模型方式是Reactor模式。首先看单线程下的Reactor,Reactor将服务器端的整个处理过程分成若干个事件,例如分为接收事件、读事件、写事件、执行事件等。Reactor通过事件检测机制将这些事件分发给不同处理器去处理。在整个过程中只要有待处理的事件存在,即可以让Reactor线程不断往下执行,而不会阻塞在某处,所以处理效率很高。
基于单线程Reactor模型,根据实际使用场景,把它改进成多线程模式。常见的有两种方式:一种是在耗时的process处理器中引入多线程,如使用线程池;另一种是直接使用多个Reactor实例,每个Reactor实例对应一个线程。
Reactor模式的一种改进方式如下图所示。其整体结构基本上与单线程的Reactor类似,只是引入了一个线程池。由于对连接的接收、对数据的读取和对数据的写入等 *** 作基本上都耗时较少,因此把它们都放到Reactor线程中处理。然而,对于逻辑处理可能比较耗时的工作,可以在process处理器中引入线程池,process处理器自己不执行任务,而是交给线程池,从而在Reactor线程中避免了耗时的 *** 作。将耗时的 *** 作转移到线程池中后,尽管Reactor只有一个线程,它也能保证Reactor的高效。
Reactor模式的另一种改进方式如下图所示。其中有多个Reactor实例,每个Reactor实例对应一个线程。因为接收事件是相对于服务器端而言的,所以客户端的连接接收工作统一由一个accept处理器负责,accept处理器会将接收的客户端连接均匀分配给所有Reactor实例,每个Reactor实例负责处理分配到该Reactor上的客户端连接,包括连接的读数据、写数据和逻辑处理。这就是多Reactor实例的原理。
Tomcat支持的I/O模型如下表(自85/90 版本起,Tomcat移除了对BIO的支持),在 80 之前 , Tomcat 默认采用的I/O方式为 BIO , 之后改为 NIO。 无论 NIO、NIO2 还是 APR, 在性能方面均优于以往的BIO。
Tomcat中的NIO模型是使用的JAVA的NIO类库,其内部的IO实现是同步的(也就是在用户态和内核态之间的数据交换上是同步机制),采用基于selector实现的异步事件驱动机制(这里的异步指的是selector这个实现模型是使用的异步机制)。 而对于Java来说,非阻塞I/O的实现完全是基于 *** 作系统内核的非阻塞I/O,它将 *** 作系统的非阻塞I/O的差异屏蔽并提供统一的API,让我们不必关心 *** 作系统。JDK会帮我们选择非阻塞I/O的实现方式。
NIO2和前者相比的最大不同就在于引入了异步通道来实现异步IO *** 作,因此也叫AIO(Asynchronous I/O)。NIO2 的异步通道 APIs 提供方便的、平台独立的执行异步 *** 作的标准方法。这使得应用程序开发人员能够以更清晰的方式来编写程序,而不必定义自己的 Java 线程,此外,还可通过使用底层 OS 所支持的异步功能来提高性能。如同其他 Java API 一样,API 可利用的 OS 自有异步功能的数量取决于其对该平台的支持程度。
异步通道提供支持连接、读取、以及写入之类非锁定 *** 作的连接,并提供对已启动 *** 作的控制机制。Java 7 中用于 Java Platform(NIO2)的 More New I/O APIs,通过在 javaniochannels 包中增加四个异步通道类,从而增强了 Java 14 中的 New I/O APIs(NIO),这些类在风格上与 NIO 通道 API 很相似。他们共享相同的方法与参数结构体,并且大多数对于 NIO 通道类可用的参数,对于新的异步版本仍然可用。主要区别在于新通道可使一些 *** 作异步执行。
异步通道 API 提供两种对已启动异步 *** 作的监测与控制机制。第一种是通过返回一个 javautilconcurrentFuture 对象来实现,它将会建模一个挂起 *** 作,并可用于查询其状态以及获取结果。第二种是通过传递给 *** 作一个新类的对象, javaniochannelsCompletionHandler ,来完成,它会定义在 *** 作完毕后所执行的处理程序方法。每个异步通道类为每个 *** 作定义 API 副本,这样可采用任一机制。
Apache可移植运行时(Apache Portable Runtime,APR) 是Apache >
很多Java初学者会关心这么一个问题——Java学到什么程度就可以出去找工作了大家的目标都很明确,也很实在,学习Java无非就是为了找个工作,使自己和家人生活更好。那到底要学到那些Java知识,就可以去找第一份工作了呢下面咱们就以公司大小运用到的技术来解答,为什么这样说呢,小型的公司肯定没有大型公司运用到的知识多,从另一个角度来看,大家也可以来测试一下自我学到的知识符合去一个什么样的企业。下面是我给大家总结和介绍。1、中小型公司:这类公司可以说特别的多,招聘和培训可能会有自己的一套标准,比如学历上可能稍微做一些要求,技术上的把关也会有一定的方法,除了Java基础知识和项目经历之外,可能还会考查你的debug能力,代码规范、异常处理能力,以及对一些Java高级特性的理解能力,可能最好多用过一些框架。总而言之,这类公司选人的标准已经拥有了自我体系,不会像一些特别小的公司,招人很随意,领导拍个板就行。当然,这类公司也吸引不到太多优秀人的人才,但是也确实可能会有一些踏实能干的勤奋员工。2、大中型公司:这类公司一般都会要求本科学历,对Java基础知识要比较熟悉,最好能够看过源码,如果没看过,那么源码方面的面试题好歹也要准备一下,除此之外,一般来说还会考察你的后端技术知识,比如数据库、网络、 *** 作系统,考察的不会太难,能把面经上的知识点掌握了就算是比较扎实了。这类公司一般不会考太复杂的题目,更希望招一些水平能力都是中等的人才,只要知识面能比较广,题目都能说到点子上,不需要掌握得特别深入,也可以有机会拿到offer。其实归结原因,就是因为二三线互联网不太可能和一线公司争夺一线人才,所以一般争取的都是二线人才,不需要太优秀,但是至少要是中等水平,所以这些公司对很多程序员来说还是比较有机会的。3、特大型公司:要进这些公司,不仅要做到之前那些事情:掌握Java基础、计算机基础知识,并且是非常熟练地掌握,你需要深入理解每一个知识点,因为面试官会不断深入地向你提问,了解你的知识深度,同时,你需要对源码有所理解,在读懂源码的基础上去理解框架的实现、JDK的实现。另外,你需要对JVM有一个清晰的认识,不仅要了解其结构,垃圾回收原理,甚至还要知道如何在遇到线上问题时通过JVM调优来解决它们。同理,你还需要对Java并发编程和网络编程的使用方法与底层实现原理非常熟悉,不仅仅答出NIO和BIO的区别,或者是synchronized和lock的区别,你还需要知道NIO的底层实现epoll是什么,synchronized对应的mutexlock是什么,lock和condition的实现原理又是什么,而lock本身也是通过AQS、CAS *** 作类等组件来实现的,其中的内容实在太多,绝不只是几道面试题就可以搞定的。当然,除此之外,这些公司对数据库、缓存、分布式技术等方面的要求都会比其他公司要高得多,你最好要搞懂MySQL的存储引擎、索引和锁的实现原理,Redis缓存的数据结构、备份方式、底层实现。同时如果你能理解负载均衡算法、CAP理论,甚至是raft和paxos算法,以及分布式常用技术如消息队列、zookeeper等等,那么无疑也是可以为你加分的技能。为什么大公司的要求这么高,因为它们是最好的互联网公司,要招的自然也是最优秀的人才,如果考察底层原理还不能满足他们筛选人才的需要,他们也会考察面试者的算法能力,比如LeetCode上medium难度的原题,或者是剑指offer的变式题等等,算法题相对考察理论基础而言,筛选度更高,可以淘汰的人也更多。
java Netty实战课程java高性能分布式RPC教程课程 免费下载
kvvv
Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程
核武器自上世纪40年代诞生以来,一颗原子d便能摧毁一座城市的巨大威力震惊了世界。
美苏两国进入冷战后,双方足以摧毁人类文明数次的庞大核武库,更是令全球都笼罩在了核战争的巨大阴影之下,讲述以核战为背景的后启示录风格文学与影视作品就这样诞生了。
其中的代表作《疯狂麦克斯》影响了后续诸多末世风格的作品,其中就包括《辐射》系列的前身《废土》系列。
1998年发售的《废土》,是由Interplay制作,EA发行的RPG类游戏。
本作最大的特点便是背景设定,与当时市面上大多数老套的剑与魔法类RPG游戏不同,《废土》背景设定在21世纪的美国西部地区,美苏之间的核战争使全球大部分地区变为了焦土。
玩家将控制沙漠游骑兵——一伙在浩劫中幸存下来的人们,在这个政府已不复存在,没有法律与道德约束的庞大废土世界中任意探索。
游戏中有着众多NPC与丰富的剧情,整体基调较为黑暗,和当时多数作品中黑白对立、善恶分明不同,废土世界中的正义少得可怜。
凭借新颖的设定与优秀的玩法,《废土》获得了巨大的成功,不仅荣获了1988年度最佳RPG游戏奖,且在后来众多的“最佳游戏”榜单上也出现了它的名字。
《废土》的成功让当时只是游戏开发商的Interplay决定自立门户成为游戏发行商,这也导致了《废土》因版权问题直到2014年才迎来续作,不过这就是另一段故事了。
辐射诞生
由于《废土》的版权一直在EA手中,于是1997年Interplay发行了其精神续作《Fallout(辐射)》。
《辐射》的背景设定与《废土》有很多相似之处,同样是一款末日题材RPG,故事都发生在核战后的美国废土,游戏中各个势力为了利益互相争斗,玩家需要在一个残酷的世界中穿插游走。
上世纪50年代是美国人对核战争最恐惧的时期,《辐射》的世界观设定就充满了那时的味道,游戏中的爵士乐,大字报(宣传画),单色CRT显示屏计算机,有核子引擎外观却是50年代风格的汽车,各类憨憨的铁皮机器人在外观上也与当年的科幻**一致。
作为一款RPG游戏,《辐射》自创了一套SPECIAL属性系统,七个字母分别代表Strength力量、Perception感知、Endurance耐力、Charisma魅力、Agility敏捷与Luck运气,这一创新的属性系统为游戏增加了不少乐趣,如角色智力属性为1,会让玩家与多数NPC无法正常对话,运气为1会给自己上一些Debuff等。
真空管朋克风、末世氛围加黑色幽默成为了《辐射》的特有风格,众多亮点使其受到了媒体的广泛赞誉,也赢得了大量玩家的口碑,并获得1997年度最佳RPG游戏,这也促成了Interplay旗下黑岛工作室的成立。
Interplay趁热打铁于1998年发行了《辐射2》,那时也是国内游戏审核较为“神奇”的一个年代,《辐射2》在国内发行过正版,且自带官方中文,大众软件甚至还为其发行过攻略。
这也使得国内多数玩家都是通过本作接触到了辐射系列,也让辐射在国内有了一定的群众基础,相比《辐射》1代在国内的待遇就差多了,直到2007年才由13号避难所论坛推出汉化。
《辐射2》的开发与1代几乎是同步的,所以画面上并没多少提升,但可玩性却得到了增强,2代有着改良过的界面、更多的任务、更广阔的地图、更高的自由度,物品数量也是前作中的几倍,变得更加丰富有趣,直到今天也鲜有RPG游戏能与《辐射2》的开放性与自由度媲美。
虽然《辐射2》因为画面简陋让媒体的评价略逊于1代,但在玩家中口碑依然良好,可见只要游戏本身够优秀,画质真的不是最大的问题。《辐射2》的出现让欧美RPG游戏进入了一个黄金时期,黑岛工作室也因为其处女作而名声大振。
胎死腹中
1998年Interplay在纳斯达克挂牌上市,并在同年与99年先后发行了由BioWare制作的《博德之门》和黑岛制作的《异域镇魂曲》两款RPG佳作。
但Interplay看似风光的表面却难掩盖背后的危机,因游戏销量未能达到预期,公司股价一路下跌,这时法国公司Titus趁虚而入,收购了Interplay超半数的股权,创始人布雷·法戈的CEO之位也被埃尔韦卡昂取而代之。
就在玩家们期盼《辐射》系列新作放出新消息时,Interplay内部却爆发了危机,2002年创始人布雷·法戈因为和法国人的矛盾,选择离开了自己创建的公司,之后成立了一家新公司,名为与放逐同音的——Inxile。
虽说道不同不相为谋,但事实证明布雷·法戈的这次出走是明智的,因为在法国人一系列的 *** 作下,Interplay最终走向了破产的结局。
因旗下游戏销量不佳,常年亏损的Interplay为了获得一些短期利益,开始出售转让手中游戏的发行权,在未告知Bioware工作室的情况下,就将《无冬之夜》的发行权转让给了第三方,这让Bioware非常愤怒,从此与Interplay从此恩断义绝,并将其告上法庭。
在损失了日后的RPG巨匠Bioware工作室后,2002年10月Interplay因股价不足一美元而遭到纳斯达克摘牌,并且一路持续亏损。
最终《辐射》系列玩家们最不愿看到的事情发生了,Interplay关闭了黑岛工作室,这让完成度已经很高的《辐射3》胎死腹中,成为了众多老玩家心中的一大遗憾。
黑岛工作室解散后,神奇的法国人却没有放弃辐射这个IP,将辐射新作搬到了家用主机上,玩家们苦苦等待后迎来了质量不佳的《辐射:钢铁兄弟会》。与前作不同,本作并非RPG而是一款动作射击游戏,这让辐射老玩家并不买账,甚至不将本作视为辐射系列,最终游戏销量和口碑暴死。真不知道为什么Interplay会放下已经快要完成的《辐射3》,反而花费资源在这款粪作上。
经过此次失利的Interplay再也没有制作或发行任何新游戏,转而依靠兜售《辐射》与《博德之门》等游戏的版权度日。
重获新生
时间来到了2004年,此时正是《上古卷轴》系列的开放商Bethesda(简称B社)春风得意的时候,颇有眼光的B社看中了《辐射》这块肥肉,于同年七月份从囊中羞涩的Interplay那里以不到120万美元的低价,购买了开发三款辐射系列游戏的权利。
经过4年的开发,2008年《辐射3》终于来到了玩家的面前,为方便就地取材,总部位于兰州马里兰州的B社将辐射的舞台搬到了他们熟悉的东海岸,游戏也与原先的回合制战斗不同,变为了类似《老滚》系列的第一人称游戏。
经过4年的开发,2008年《辐射3》终于来到了玩家的面前,为方便就地取材,总部位于兰州马里兰州的B社将辐射的舞台搬到了他们熟悉的东海岸,游戏也与原先的回合制战斗不同,变为了类似《老滚》系列的第一人称游戏。
为防止《辐射3》变成一款FPS游戏,也为尽量还原前作设定,B社给辐射添加了“避难所辅助瞄准系统”。
这一系统开启后游戏会进入类似暂停的“慢放”,并将画面拉至被瞄准的敌人,玩家可以选择任意部位进行攻击,人物的各项属性会影响攻击的次数与命中率,这一设定与前作中精确瞄准十分相似。
辐射这一IP在B社手中重获新生,但是很多黑岛版辐射的老玩家却对《辐射3》展开了口诛笔伐,批评B社毁了辐射,辐射3是老头打q等等。
虽然相比黑岛的《辐射》B社制作的《辐射3》在很多方面确实有些不足,比如“小主角找爸爸”的主线剧情有些单薄,纵横交错的地铁隧道钻的玩家头晕眼花,还有B社并没有很好地理解special系统,让魅力与幸运等属性变成了鸡肋,但《辐射》系列好歹是重生了,比烂在Interplay手中要强多了。
虽然一众老玩家对《辐射3》不满,但并没有影响《辐射3》发售后的市场表现和媒体评价,本作同时登陆PC、PS3与XBOX360平台,仅几天时间销量便超过了辐射1/2的总和,总销量超800万套,并获得了08年度最佳RPG游戏与年度最佳PC游戏等奖项。
《辐射3》取得销量丰收后,B社也许为了照顾老玩家的感受,让辐射新作更加原汁原味,这次把游戏授权给了由黑岛工作室元老们组成的黑曜石工作室。时隔两年后,《辐射:新维加斯》发售。
《辐射:新维加斯》剧情和3代的关联不大,故事也重新回到了1/2代里的美国西海岸,一个叫作莫哈维废土的地方。
黑曜石工作室在本作中展现了他们强大的实力,游戏中多条任务线与剧情环环相扣,解决也比3代更加丰富,就连DLC也有多种不同的结局供玩家探索,与NPC的对话也更加丰富。
《辐射:新维加斯》让新老玩家都颇感满意,不少老玩家表示,新维加斯才是真正的《辐射3》,后来黑曜石工作室的员工也表示,新维加斯的剧情就是他们当年想在未完成的3代中讲述的故事。
虽然新维加斯足够原汁原味,但黑曜石工作室是个小作坊,美工与程序员的实力与B社这种大厂存在着差距,游戏中众多的BUG与屎**画面都影响了作品的表现,尽管新维加斯的可玩性超过了3代,但媒体评分还是略低于前作。
在新维加斯发售后,B社在几年时间里都未公布过任何有关辐射系列的新消息,玩家们等待的同时,也相信B社一定在开发《辐射4》了,更是有一些好事者做出了假的倒计时网站来吊玩家们的胃口。
终于在2015年6月,B社公布了玩家们期盼已久的《辐射4》,一时间引起了广泛关注。
《辐射4》于2015年11月发售,首周销售便突破了1200万套,故事讲述了主角“老冰棍”捡垃圾找儿子的艰辛历程。
相比3代与新维加斯,《辐射4》在玩法与画面上有不少改进,比如高清画面与明亮的色调,新增加的建造系统,玩家可以自己改造武器、动力装甲,甚至可以建造自己的村落,全新的perk系统也让special属性不再鸡肋,更大的世界,更多可探索的事物等,让辐射4颇具可玩性。
《辐射4》在光鲜靓丽的外表下却也难盖其缺点,如主线剧情相比前作略显单薄,严重的bug和糟糕的优化,上下左右的对话选项也被玩家诟病。
本作也优化了武器的射击手感,玩起来更像是一款突突突游戏,失去了RPG游戏本身的味道,各派系五颜六色的激光q光束好像让玩家穿越到了星球大战……
不可否认《辐射4》是款优秀的游戏,不过也许是期望越大,失望越大,优点与缺点交织的《辐射4》与几位前辈不同,失去了年度最佳RPG游戏的桂冠。但优异的销售成绩也代表了玩家们对辐射系列的喜爱。
时间来到了2018年,B社公布了系列新作《辐射76》的消息,《辐射76》脱胎于《辐射4》,所以多数系统没有很大区别,但本作颠覆了原有的玩法,玩家需要在线上世界里建立自己的基地、和其他玩家协作或进行对战。
“网游”版的辐射是一次有风险的尝试,显然B社也没有从本作中得到什么回报,游戏始发时充满了层出不穷的Bug,一个死气沉沉没有NPC的世界,令人失望的联机系统等,让游戏的口碑一再突破人们的底线,导致销量不佳。
希望B社能从《辐射76》的失利中吸取教训,总结好经验踏踏实实地制作《辐射5》,不要将这一传奇系列变成历史中只能供后来者凭吊的一堆遗骨。
究竟未来辐射系列将何去何从,现在还是个未知数,不过我相信,战争从未改变,续写辐射废土世界传奇的那天终将到来……
1、语法:必须比较熟悉,在写代码的时候,IDE(Integrated Development Environment,集成开发环境)的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误,并且知道任何修正。
2、命令:必须熟悉JDK(Java Development Kit,Java开发工具箱——JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。JDK是学好Java的第一步。)带的一些常用命令及其常用选项,命令至少需要熟悉:appletviewer、HtmlConverter、jar、 java、javac、javadoc、javap、javaw、native2ascii、serialver,如果这些命令你没有全部使用过,那么你对java实际上还很不了解。
3、工具:必须至少熟练使用一种IDE的开发工具,例如Eclipse、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop,包括进行工程管理、常用选项的设置、插件的安装配置以及进行调试。
4、API(Application Programming Interface,应用程序编程接口):Java的核心API是非常庞大的,但是有一些内容笔者认为是必须熟悉的,否则不可能熟练的运用Java,包括:
◆javalang包下的80%以上的类的功能的灵活运用。
◆javautil包下的80%以上的类的灵活运用,特别是集合类体系、规则表达式、zip、以及时间、随机数、属性、资源和Timer
◆javaio包下的60%以上的类的使用,理解IO体系的基于管道模型的设计思路以及常用IO类的特性和使用场合。
◆javamath包下的100%的内容。
◆javanet包下的60%以上的内容,对各个类的功能比较熟悉。
◆javatext包下的60%以上的内容,特别是各种格式化类。
◆熟练运用JDBC 80%、javasecurity包下40%以上的内容,如果对于安全没有接触的话根本就不可能掌握java
◆AWT的基本内容,包括各种组件事件、监听器、布局管理器、常用组件、打印。
◆Swing的基本内容,和AWT的要求类似。
◆XML处理,熟悉SAX、DOM以及JDOM的优缺点并且能够使用其中的一种完成XML的解析及内容处理。
5、测试:Junit测试是程序员测试,即所谓白盒测试。一位合格的Java开发工程师必须熟悉使用junit编写测试用例完成代码的自动测试。
6、管理:必须熟悉使用Ant(中文译为蚂蚁,是一种基于Java的build工具。)完成工程管理的常用任务,例如工程编译、生成javadoc、生成jar、版本控制、自动测试。
7、排错:应该可以根据异常信息比较快速的定位问题的原因和大致位置。
8、思想:必须掌握OOP(Object Oriented Programming,面向对象编程)的主要要求,这样使用Java开发的系统才能是真正的Java系统。
9、规范:编写的代码必须符合流行的编码规范,例如类名首字母大写,成员和方法名首字母小写,方法名的第一个单词一般是动词,包名全部小写等,这样程序的可读性才比较好。
10、博学:掌握J2EE 、Oracle 、WebLogic、Jboss、Spring、Struts、Hibernate 等流行技术,掌握软件架构设计思想、搜索引擎优化、缓存系统设计、网站负载均衡、系统性能调优等实用技术。
大数据技术体系庞大,包括的知识较多
1、学习大数据首先要学习Java基础
Java是大数据学习需要的编程语言基础,因为大数据的开发基于常用的高级语言。而且不论是学hadoop,
2、学习大数据必须学习大数据核心知识
Hadoop生态系统;HDFS技术;HBASE技术;Sqoop使用流程;数据仓库工具HIVE;大数据离线分析Spark、Python语言;数据实时分析Storm;消息订阅分发系统Kafka等。
3、学习大数据需要具备的能力
数学知识,数学知识是数据分析师的基础知识。对于数据分析师,了解一些描述统计相关的内容,需要有一定公式计算能力,了解常用统计模型算法。而对于数据挖掘工程师来说,各类算法也需要熟练使用,对数学的要求是最高的。
4、学习大数据可以应用的领域
大数据技术可以应用在各个领域,比如公安大数据、交通大数据、医疗大数据、就业大数据、环境大数据、图像大数据、视频大数据等等,应用范围非常广泛。
以上就是关于阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一文搞定全部的内容,包括:阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一文搞定、Tomcat篇02-整体架构和I/O模型、Java学会那些知识找工作才不费力等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)