概念
哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。
使用哈希查找有两个步骤:
- 使用哈希函数将被查找的键转换为数组的索引,在理想的情况下,不同的键会被转换为不同的索引值,但是在有些情况下我们需要处理多个键被哈希到同一个索引值的情况,所以哈希查找的第二个步骤就是处理冲突。
- 处理哈希碰撞冲突。有很多处理哈希碰撞冲突的方法,本文后面会介绍拉链法和线性探测法
哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。
使用哈希查找有两个步骤:
前面所讲的内存管理策略都是为同一目的:同时将多个进程存放在内存中,以便允许多道程序设计,不过这些策略都需要在进程执行之前将这个进程放进内存中。
虚拟内存技术允许执行进程不必完全在内存中,这种方案的一个显著的优点就是程序可以比物理内存大,而且,虚拟内存将内存抽象成一个巨大的,同统一的存储数组,进而将用户看到的逻辑内存与物理内存分开,这种技术允许程序员不受内存存储的限制,虚拟内存页允许进程很容易的共享文件和地址空间,还为创建进程提供了有效的机制,但是,虚拟内存的实现并不容易,如果使用不当可能会大大的降低性能。
在Java学习的路线图中,分布式计算是一个非常好的一个方向。那么在做分布式计算的工具有许多, 现在最流行的也就是 Hadoop 了。
Java 的学习中如果没有接触过Hadoop那么无疑是一个遗憾的事情,如果在面试,求职中有学习过Hadoop,那么这对自己肯定有强势的竞争力的。(这个是阿里面试官对我说的,一位非常好的面试官)。
那么我么现在就来尝试一下使用Hadoop吧!
Java1.4 之前的早期版本,Java对I/O的支持并不完善,开人员在开发高性能I/O程序时是有非常大的困难的,总结有以下几点:
因为以上的一些缺陷,所以在很长的一段时间内,服务器端的开发领域一直被C++和C长期占据。
Linux的内核将所有的外部设备都看作一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个 file descriptor(fd, 文件描述符)。而对一个socket的读写也会有相应的描述符,称为 socketfd(socket 描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等属性)。
我们学习计算机,或者学习每一门语言的时候为什么要学习并行呢? 而且我们的计算机为什需要并行的处理机制呢? 其实这里是有原因的。原因有以下几点:
我们都知道,在计算机硬件行业,有著名的摩尔定律: 每18个月,芯片的性能将会提高一倍。 但是事实上并不是这样的,这个定律只是理论上的,因为在过去的10年内,我们的电脑CPU处理器的还停留在4GHZ 上,
分页(paging)内存管理方案允许进程的物理地址空间可以是非连续的。分页避免了将不同大小的内存块大小匹配到交换空间上这样的麻烦,前面所诉的内存管理方案都有这个问题,当位于内存中的代码或数据需要交换出时,必须先在备份存储上找到空间。这时问题就产生了。备份存储也有前面所诉与内存相关的碎片问题,只不过访问更慢,因此不适宜采用合并。各种形式的分页由于其优越性,因此通常为绝大多数操作系统所采用。
传统上的分页技术的支持是由硬件来支持的,然而,最近的设计是通过将硬件和操作系统相配合来实现分页。
内存必须容纳操作系统和各种用户进程,因此应该尽可能有效的分配内存的各个部分。
内存通常分为两个区域,一个用于驻留操作系统,另一个用于用户进程。操作系统可以位于低内存,也可以位于高内存,影响这一决定的主要因素是中断向量的位置,由于中断向量通常位于低内存,因此程序员通常将操作系统页放在低内存。
内存管理的算法有很多,从简单的裸机方法,到分页分段策略,各种方法都有其优缺点。为特定系统选择内存管理方法取决于很多因素,特别是系统的硬件设计,尽管现在的设计已经将硬件和操作系统紧密的结合在一起,但是很多算法仍然需要硬件的支持。
内存是现代计算机的运行的中心,内存由很大一组字或字节组成,每个字节或字都有他们的自己的地址,CPU根据程序计数器(PC)的值从内存中提取指令,这些指令可能会进一步对特定内存地址的读取和写入。
对于单处理器系统,每次只允许一个进程运行,任何其他进程必须等待,直到CPU空闲能被调度为止,多道程序的目的是在任何时候都有某些进程在运行,以使CPU使用率最大化。
线程是CPU使用的基本单元,它由线程ID、程序计数器、寄存器集合和栈组成。它与属于同一进程的其他线程共享代码段,数据段和其他操作系统资源,如打开文件和信号。一个传统重量级的进程只有单个控制线程,如果进程有多个控制线程,那么它能够同时做多个任务。