Java EE知识储备(五)
参考文献:[1]蒋本珊.计算机组成原理(第3版)[M].北京:清华大学出版社,2013;
[2] 汤小丹 梁红兵 哲凤屏 汤子瀛.计算机操作系统(第四版) [M].陕西:西安电子科技大学出版社,2014;
目录:
1、静态链接库和动态链接库:
2、带权哈夫曼树:
3、概率论:
4、读取磁盘上多个顺序数据块效率较高:
5、进程通信方式:
6、大端(big-endian)和小端(little-endian):
7、二叉树遍历问题:
8、C语言数据类型占字节数:
9、同一个进程中的线程共享的数据:
10、系统调用与内核:
1、静态链接库和动态链接库:
答:(1)静态链接库的优点:
①代码装载速度快,执行速度略比动态链接库快;
②只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱(DLL HELL,导出类的DLL在维护和修改时如增加成员变量、修改导出类的基类等操作所可能导致的意想不到的后果)等问题。
(2)动态链接库的优点:
①程序复用的重要方式。
②节省内存并减少页面交换;
③ DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;
④不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;
⑤适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
(3)不足之处:
①使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;
②使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统去除,这在早期Windows中很常见。
2、带权哈夫曼树:
答:(1)基本定义:
①树的路径长度:从树根到每一结点的路径长度之和。
②哈夫曼树:带权路径长度WPL(Weight Path Length)最小的二叉树,也称为最优二叉树。
(2)构造哈夫曼树的算法:
①根据给定的n个权值{w[1],w[2],…,w[n]}构成n棵二叉树的集合F={T[1],T[2],…T[n]}, 其中每棵二叉树T[i];中只有一个带权为w[i]的根结点,其左右子树均为空。
②在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
③在F中删除这两棵树,同时将新得到的二叉树加入F中。
④重复②和③步骤,直到F只含一棵树为止。这棵树便是哈夫曼树。
(3)示例:由权值分别为1、12、13、4、8的叶子节点生成一颗哈夫曼树,它的带权路径长度为
图2.1 哈夫曼树1
图2.2 哈夫曼树2
图2.1:带权路径为:1 * 13 + 2 * 12 + 3 * 8 + 4 * 1 + 4 * 4 = 13 + 24 + 24 + 4 + 16 = 81
图2.2:带权路径为:2 * 8 + 2 * 12 + 2 * 13 + 3 * 1 + 3 * 4 = 16 + 24 + 26 + 3 + 12 = 81
3、首位为1的4位数,且恰巧有且仅有1个数字出现了两次的数字的个数。
答:①1重复:C(2,9)*C(1,1)*A(3,3) = 216
C(9,2):除了1以外的9个数字取两个
C(1,1):数字1
A(3,3):三个数字进行排列,有6中排列方法。
②非1重复:C(1,9)*C(1,8)*C(1,3) = 216
C(1,9):选择重复的那个数字,非1的9个数字中选1个
C(1,8):剩下的8个数字中选一个
C(1,3):理解为那1个数字是放在两个重复数字的左边,中间还是右边,共三种排列方法。
所以综合①②,共有432个。
4、读取磁盘上多个顺序数据块效率较高:
对比:中断控制方式、DMA方式、通道方式、程序直接访问方式
(1)中断控制方式:
指计算机执行现行程序的过程中,出现某些急需处理的异常情况和特殊请求,CPU将暂时中止现行程序,而转去对随机发生的更紧迫的事件进行处理,在处理完毕后,CPU将自动返回原来的程序继续执行。IO设备和CPU可以并行工作,只有在开始IO和结束IO时,才需要CPU。中断控制方式是以字节为单位的。
参考文献:蒋本珊.计算机组成原理(第3版)[M].北京:清华大学出版社,2013 P289;
(2)DMA方式(Direct Memory Access,直接存储器访问):
在外设和主存之间开辟一条“直接数据通道”,在不需要CPU干预也不需要软件介入的情况下载两者之间进行的高速数据传送方式。DMA方式一般应用于主存与高速外设之间的简单数据传送。高速外设如磁盘、磁带、光盘等辅助存储器以及其他带有局部存储器的外设、通信设备等。DMA对磁盘的读写时以数据块为单位进行的,一旦找到数据块起始位置,就连续性地读写。DMA方式是以一个连续的数据块为单位的。
参考文献:蒋本珊.计算机组成原理(第3版)[M].北京:清华大学出版社,2013 P301;
(3)通道方式:
是DMA方式的进一步发展,通道也是实现外设和主存之间直接交换数据的控制器。DMA控制器通常只能控制一台或少数几台同类设备,而一个通道则可以同时控制许多同类或不同类的设备。通道方式是以一组数据块为单位的,即可以连续读取多个数据块。
参考文献:蒋本珊.计算机组成原理(第3版)[M].北京:清华大学出版社,2013 P307-308;
(4)程序直接访问方式:
①CPU执行初始化程序,并预置传输参数。
②向I/O接口发出命令字,启动I/O设备。
③从外设接口取回状态字。
④CPU不断查询外设状态标识,直到外设准备就绪。
⑤传送一次数据。
⑥修改地址和计数器参数。
⑦判断传输是否结束,若没有结束转第三步,继续传送,直到计数器为0;
参考文献:蒋本珊.计算机组成原理(第3版)[M].北京:清华大学出版社,2013 P285;
综合(1)(2)(3)(4),效率最高的是通道方式。
5、进程通信方式:
答:低级进程通信:信号量机制
高级通信机制:共享存储器系统、管道通信系统、消息传递系统、客户机-服务器系统
(1)信号量机制:
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
(2)共享存储器系统:
相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。共享内存时最快的IPC方式。
参考文献:汤小丹 梁红兵 哲凤屏 汤子瀛.计算机操作系统(第四版) [M].陕西:西安电子科技大学出版社,2014 P67;
(3)管道通信系统:
管道,用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,即pipe文件,向管道(共享文件)提供输入的发送进程(即写进程)以字符流形式将大量的数据送入管道;而接收管道输出的接收进程(即读进程)则从管道中接收(读)数据管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
参考文献:汤小丹 梁红兵 哲凤屏 汤子瀛.计算机操作系统(第四版) [M].陕西:西安电子科技大学出版社,2014 P68;
(4)消息传递系统:
进程以格式化的消息为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令(原语),在进程间进行消息传递,完成进程间的数据交换。为当前应用最为广泛的一种进程间通信的机制。
参考文献:汤小丹 梁红兵 哲凤屏 汤子瀛.计算机操作系统(第四版) [M].陕西:西安电子科技大学出版社,2014 P68;
(5)客户机-服务器系统:
其主要的实现方法包括三类:套接字(Socket)、远程过程调用和远程方法调用。套接字不仅适用于同一台计算机内部的进程通信,也适用于网络环境中不同计算机间的通信。
参考文献:汤小丹 梁红兵 哲凤屏 汤子瀛.计算机操作系统(第四版) [M].陕西:西安电子科技大学出版社,2014 P69;
6、大端(big-endian)和小端(little-endian):
答:大端法:数据的低位(权值较小的后面几位)保存在内存的高地址,数据的高位,保存在内存的低地址。
小端法:数据的低位保存在内存的低地址。
例如:字0x01234567
大端法:地址0x100:01 地址0x101:23 地址0x102:45 地址0x103:67
小端法:地址0x100:67 地址0x101:45 地址0x102:23 地址0x103:01
7、已知一棵二叉树的先序和中序遍历序列如下:先序:A、B、C、D、E、F、G、H、I,J;中序:C、B、A、E、F、D、I、H、J、G,其后序遍历序列为:
答:①由先序遍历确认根节点A,其左子树根节点B
②由中序遍历,A左边的为左子树,A右边的为右子树
③因为中序遍历C在B之前,所以C为B的左节点
④所以D为根节点A的右子树的根节点
⑤根据中序遍历,所以EF为D的左子树,根须先序遍历,确定EF排列方式
⑥根据先序遍历,G为D的右子树的根节点,H为G的左子树
⑦根据中序遍历,G为最后遍历的元素,所以I、H、J均为G的左子树
⑧由中序遍历和先序遍历I、H、J的排列,确定树结构。
所以后序遍历序列为:CBFEIJHGDA
图7.1 二叉树
8、C语言数据类型占字节数:
答:64位编译器下:
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
union:当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union);
它有以下特点:
(1)它是一个结构;
(2)它的所有成员相对于基地址的偏移量都为0;
(3)此结构空间要大到足够容纳最"宽"的成员;
(4)其对齐方式要适合其中所有的成员
enum:内存中当作int来存储,为4个字节
9、同一个进程中的线程共享的数据:
答:线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号处理器、进程的当前目录和进程用户ID与进程组ID、堆。
线程独有的:线程ID、寄存器组的值、线程的栈、错误返回码、线程的信号屏蔽码
栈是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe 的。
10、系统调用与内核:
答:(1)内核:内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
(2)在计算机系统中,通常运行着两类程序:系统程序和应用程序。为了防止应用程序对操作系统的破坏,应用程序和操作系统的内核是运行在不同的状态,即操作系统的内核是运行在系统态,而应用程序是运行在用户态。
(3)在操作系统中提供系统调用的目的,是使应用程序可以通过它间接调用操作系统的相关过程,取得相应的服务。系统调用在本质上是应用程序请求操作系统内核完成某功能时的一种过程调用。
(4)系统调用提供了用户程序和操作系统内核之间的接口。
(5)系统调用给用户屏蔽了设备访问的细节。
参考文献:汤小丹 梁红兵 哲凤屏 汤子瀛.计算机操作系统(第四版) [M].陕西:西安电子科技大学出版社,2014 P293-294;