计算机部分概念(5)一、理解面向对象的语言...................................................................................................1二、node.js和JavaScript的关系..................................................................................3三、Java单例模式的正确实现..........................................................................................4四、I/O事件........................................................................................................................5五、异步事件驱动模型.......................................................................................................6六、事件轮询(Eventloop).......................................................................................7七、API和RESTfulAPI...................................................................................................9八、IMPL是什么?............................................................................................................10九、container与channel的区别..................................................................................11十、DockerCLI命令小结................................................................................................11十一、几个概念.................................................................................................................16十二、Docker.....................................................................................................................15一、理解面向对象的语言javajavascript认识:面向对象是当今主流的一种程序设计理念和设计规范,它取代了早期的结构化过程设计开发技术,主张一切皆为对象,程序以人的思维模式去解决问题。面向对像的程序是由类组成的,每个类包含对用户公开的特定功能部分和隐藏的实现部分。传统的结构化程序设计通过设计一系列的过程(即算法)来求解问题。这一些过程一旦被确定,就要开始考考虑存储数据的方式,这就明确的表述了程序员的工作方式。但面相对像却调换了这个顺序,它不必关心数据对象的具体实现,只要能满足用户的需求即可。从世界观的角度可以认为:1、面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;2、不同对象之间的相互作用和通讯构成了完整的现实世界。因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。这样建立起来的系统才能符合现实世界的本来面目。从方法学的角度可以认为:1、面向对象的方法是面向对象的世界观在开发方法中的直接运用;2、它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。二、特点:面向对象有三个最基本的特性,即:封装,继承,多态。这也是我们判断一门语言是不是面向对象语言的依据!封装(Encapsulation):使用方法把类的数据隐藏起来,让普通类型上升为对象级;封装控制用户对类的修改和访问数据的程度,增强了程序的可维护性。继承(Implementation):发生在类和类之间,可分为单继承和多层继承描述父子对象之间的血缘关系,最终达到的目的是:一旦使用了继承,子类便获得了父类所有的成员(变量和方法),但是父类的私有的方法和属性不能被访问,父类的final成员不能被重写。一旦使用了继承,父类的实例能指向派生类(子类)的引用。多态(Multipart):对象在运行期和编译期具有的两种状态,使代码具有灵活性和重用性。编译时多态,也就是函数重载,所谓函数重载就是指同一个函数名可以对应多个函数的实现具体调用哪个按照由参数个数,参数类型等来决定。运行时多态:用一个基类的指针或引用来操纵多个派生类型的能力被称为多态性。学习网址推荐版本更新二、node.js和JavaScript的关系node.js是一个基于ChromeV8引擎的JavaScript运行时环境。一、类比JavaScript和java语言JavaScriptjava引擎V8JVM开发平台node.jsJRE、IDEA(java语言的开发集成环境)开发工具包JDK(java语言的软件开发工具包)JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。1.JavaScript和java都是一门编程语言,至于两者的关系,是雷锋和雷峰塔的关系2.V8是google开源的JavaScript引擎,用于执行JavaScript,类似JVM执行java字节码。在node.js诞生之前,V8是内置于Chromium中的,现在也内置于node.js中3.node.js诞生之前,JavaScript只能运行于浏览器,现在也可以在服务器端运行于node.js三、Java单例模式的正确实现Java单例模式:单例模式适合于应用中频繁创建的对象,如果是重量级的对象,更应该使用单例模式。比如配置文件,如果不采用单例模式的话,每个配置文件对象的内容都是一样的,创建重复的对象就会浪费宝贵的内存,所以有必要使用单例模式,达到性能的提升,减小了内存的开销和GC的压力。四、I/O事件非阻塞I/OI/O模型(输入输出模型)主要可以分为同步I/O,异步I/O两大类。同步I/O我们可以理解为,在I/O事件发生后(出现了I/O请求),由应用程序负责处理I/O,或者说,内核向应用程序通知I/O就绪事件。理论上来说,阻塞I/O(如read一直等待),I/O复用(如select,epoll),信号I/O都是同步I/O。异步I/O这俩当然是相反的咯,在I/O事件发生后(出现了I/O请求),由内核负责处理I/O,内核向应用程序通知I/O完成事件,比如Linux下的aio,(还有C++的asio??)理解之前对于同步和异步总是很混乱,看过之后才明白,同步I/O是由应用程序来处理,而异步只是应用程序将要做的I/O处理提前告诉了内核,一旦需要处理,内核直接按照之前的要求完成,然后将结果告诉应用程序。举个例子:康康到食堂点了一份黄焖鸡,对于同步I/O,鸡做好了(I/O事件发生),小姐姐喊号(内核通知应用程序I/O就绪),康康端着鸡回去了(应用程序自己处理I/O)。而对于异步I/O,康康在点鸡时就告诉了小姐姐,请送到FZ118(将请求告诉内核),鸡做好了(I/O事件发生),小姐姐直接端到FZ118(内核按照要求直接处理I/O),然后告诉康康,鸡送到了(内核通知应用程序I/O完成)。同步/异步和阻塞/非阻塞的关系?当初这两个也搞不明白,现在大致清楚了。异步I/O自然是非阻塞,因为应用程序只需通知内核,这一事件不需要什么前提,程序没有阻塞。同步I/O中的阻塞I/O,如read,没有数据则程序一直阻塞,自然是阻塞的。同样,程序也会阻塞在I/O复用(如select时间内一直没有事件发生),但是对于发生的I/O事件,并不是阻塞的,一旦出现了I/O,直接处理。信号I/O同理,出现事件直接处理。并且信号注册的过程也只是和通知一样,程序也不阻塞。五、异步事件驱动模型我们同样是要发起请求,等待服务器端响应;但是与银行例子不同的是,这次我们点完餐后拿到了一个号码,拿到号码,我们往往会在位置上等待,而在我们后面的请求会继续得到处理,同样是拿了一个号码然后到一旁等待,接待员能一直进行处理。等到饭菜做号了,会喊号码,我们拿到了自己的饭菜,进行后续的处理(吃饭)。这个喊号码的动作在NodeJS中叫做回调(Callback),能在事件(烧菜,I/O)处理完成后继续执行后面的逻辑(吃饭),这体现了NodeJS的显著特点,异步机制、事件驱动整个过程没有阻塞新用户的连接(点餐),也不需要维护已经点餐的用户与厨师的连接。六、事件轮询(Eventloop)一、概念理解事件轮询(EventLoop)是一个很重要的概念,指的是计算机系统的一种运行机制。JavaScript语言就是采用的这种机制,来解决单线程运行带来的一些问题。想要理解EventLoop,就要从程序的运行模式讲起。运行以后的程序叫做进程(process),一般情况下,一个进程一次只能执行一个任务。如果有很多任务需要执行,不外乎三种解决方法。(1)排队。因为一个进程一次只能执行一个任务,只好等前面的任务执行完了,再执行后面的任务。(2)新建进程。使用fork命令,为每个任务新建一个进程。(3)新建线程。因为进程太耗费资源,所以如今的程序往往允许一个进程包含多个线程,由线程去完成任务。以JavaScript语言为例,它是一种单线程语言,所有任务都在一个线程下完成,即采用上面的第一种方法,一旦遇到大量任务或者遇到一个耗时的任务,网页就会出现假死的状态,因为JavaScript停不下来,也就无法响应用户的行为。你也许会问,JavaScript为什么是单线程,难道不能实现为多线程吗?这跟历史有关系。JavaScript从诞生起就是单线程。原因大概是不想让浏览器变得太复杂,因为多线程需要共享资源、且有可能修改彼此的运行结果,对于一种网页脚本语言来说,这就太复杂了。后来就约定俗成,JavaScript为一种单线程语言。(WorkerAPI可以实现多线程,但是JavaScript本身始终是单线程的。)如果某个任务很耗时,比如涉及很多I/O(输入/输出)操作,那么线程的运行大概是下面的样子。上图的绿色部分是程序的运行时间,红色部分是等待时间。可以看到,由于I/O操作很慢,所以这个线程的大部分运行时间都在空等I/O操作的返回结果。这种运行方式称为同步模式(synchronousI/O)或堵塞模式(blockingI/O)。如果采用多线程,同时运行多个任务,那很可能就是下面这样。上图表明,多线程不仅占用多倍的系统资源,也闲置多倍的资源,这显然不合理。EventLoop就是为了解决这个问题而提出的。Wikipedia这样定义:EventLoop是一个程序结构,用于等待和发送消息和事件。