• Vector源码分析

    Vector简介Vector在JDK 1.0被引入,基于数组实现,并且是一个动态数组,其容量可以自动增长。在很多方法的实现上,Vector加入了同步语句,因此一般来说Vector是线程安全的,可以在多线程环境中运用。本文对Vector源码的分析基于JDK 1.8.0_111,并仅对常用的方法进行分析。public class Vector<E> extends AbstractList<E> implements List<E>, Rando...

  • Java对象内存布局

    JVM将内存划分为程序计数器(Program Counter Register)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)、堆(Heap)以及方法区(Method Area)。作为开发者,我们最关注的是虚拟机栈以及堆这两块区域。虚拟机栈所需要的内存空间在编译期间即可明确,而堆内存所需要的空间需要在运行时才可确定。堆内存用于存放我们在程序中创建的对象,一旦没有足够的空间用于存放这些对象,即会抛出OutOfMemoryError异常。在这种情况下,我们...

  • Linux C 线程池实现

    学习网络编程时,自己动手实现一个Web Server是一个很有意思的经历。大多数Web Server都有一个特点:在单位时间内需要处理大量的请求,并且处理这些请求的时间往往还很短。《深入理解计算机系统》 (CSAPP) 在讲解网络编程时实现了一个经典的Web Server,这个Web Server不仅满足了静态请求,同时还满足了动态请求 (CGI)。虽然这个Web Server能够正常使用,但是仍存在一个明显的缺陷:它是一个迭代式的Web Server,这意味着在一个请求处理完毕前,不能同...

  • Java泛型总结

    Java泛型是JDK5引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用的时候使用具体的类型来替换。泛型最主要的应用是在JDK5中的新集合类框架中。对于泛型概念的引入,开发社区的观点是褒贬不一。从好的方面上说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多明显的错误。从不好的方面说,为了保证与旧版本的兼容性,Java泛型的实现上还存在着不够优雅的地方。类型擦除正确理解泛...

  • I/O重定向和管道

    标准I/O与重定向的若干概念3个标准文件描述符所有的Unix工具都使用文件描述符0、1和2。如下图所示,标准输入文件的描述符是0,标准输出的文件描述符是1,标准错误输出的文件描述符则是2。Unix假设文件描述符0、1和2都已经被打开,可以分别进行读、写和写的操作。重定向I/O的是shell而不是程序通过使用输出重定向标志,命令cmd>filename告诉shell将文件描述符1定位到文件。于是shell就将文件描述符与指定的文件连接起来。程序持续不断地将数据写到文件描述符1中,根本没...

  • TCP拥塞控制

    TCP基础网络的传输层有两种方式——TCP和UDP,其中TCP是基于连接的,而UDP不需要连接。它们各自支持一些应用层协议,但也有些协议是两者都支持的,比如DNS,我们通过DNS来比较TCP和UDP的差别。当前我的计算机的ip为192.168.199.134,向DNS服务器发起一个DNS查询,以期获得tinylcy.me所对应的ip地址。DNS默认使用UDP的情况如下所示:通过Wireshark抓取这个过程的网络包,如下所示:使用set vc强制DNS使用TCP:这个过程所有的网络包如下所...

  • 目录与文件属性:编写ls

    问题ls命令可以列出目录中所有文件的名字,以及这些文件的其它信息。注意,ls对文件和目录所做的操作是不同的,ls能判定参数指定的是文件还是目录。如果要自己编写ls,需要掌握三点: 如何列出目录的内容。 如何读取并显示文件的属性。 给出一个名字,如何能够判断出它是目录还是文件。编写ls目录是一种特殊的文件,它的内容是文件和目录的名字。与普通文件不同的是,目录文件永远不会为空,每个目录至少包含两个特殊的项目:.和..,分别代表当前目录和上一级目录。什么函数可以读目录?在联机帮助中根据关键...

  • 用机器指令和汇编指令编程(三)

    程序执行过程的跟踪可以使用Debug来跟踪一个程序的执行过程,示例程序1.asm如下所示。assume cs:codesgcodesg segment mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21hcodesg endsend使用masm编译1.asm,生成1.obj,然后将1.obj使用连接器Link.exe连接,生成1.exe。输入debug 1.exe,将程序载入...