什么是外部碎片,内部碎片?
外部碎片,是由于大量信息由于先后写入、置换、删除而形成的空间碎片。为了便于理解,我们将信息比作货物,将存储空间比作仓库来举例子。假设,我们有编号为1、2、3、4、5、6的6间仓库库房,前天送来了一大宗货,依次装入了1、2、3、4、5号仓库,昨天又因故将4号库房的货物运走了,那么数值上说我们还有两间空仓库的空间,但是如果这时候送来两间仓库容量的货物但要求必须连续存放的话,我们实际上是装不下的。这时的4、6号仓库,就成为一种空间的碎片。由于这样的原因形成的空间碎片,我们称之为外部碎片。从上面的例子我们可以理解,外部碎片是可以通过一些措施来改善或者解决的。对于在硬盘上的外部碎片,我们通常用磁盘碎片整理来解决,对应上面的例子,就是将5号仓库的货物及时移动到新腾出的4号仓库,这样,1-4号仓库都是满的,而5、6号仓库则形成了有效的、连续的空间,能够适应新的应用要求了;对于内存中的外部碎片,我们内存管理中常用的页面管理形式,就是为了解决这个问题的。这里就不详述了。
内部碎片,是由于存量信息容量与最小存储空间单位不完全相符而造成的空间碎片。还是沿用上面的例子,这次我们的6间仓库目前都是空置的,但是假设我们管理仓库的最小空间单位是间,今天运来了容量为2.5间仓库的货物,那也要占用我们1-3号3间仓库,尽管3号仓库还闲置着一半的空间,但是这半间仓库已经不能再利用了(因为是以间为最小单位么);这时,我们的仓库中就形成了半间仓库的空间碎片,仓库的有效容量只剩下3间仓库了。
以上来自:http://zhidao.baidu.com/question/337634817.html
已知一组关键字为(26,36,41,38,44,15,68,12,06,51),用除余法构造散列函数,用线性探查法解决冲突构造这组关键字的散列表。
解答:为了减少冲突,通常令装填因子α<l。这里关键字个数n=10,不妨取m=13,此时α≈0.77,散列表为T[0..12],散列函数为:h(key)=key%13。
由除余法的散列函数计算出的上述关键字序列的散列地址为(0,10,2,12,5,2,3,12,6,12)。
前5个关键字插入时,其相应的地址均为开放地址,故将它们直接插入T[0],T[10),T[2],T[12]和T[5]中。
当插入第6个关键字15时,其散列地址2(即h(15)=15%13=2)已被关键字41(15和41互为同义词)占用。故探查h1=(2+1)%13=3,此地址开放,所以将15放入T[3]中。
当插入第7个关键字68时,其散列地址3已被非同义词15先占用,故将其插入到T[4]中。
当插入第8个关键字12时,散列地址12已被同义词38占用,故探查hl=(12+1)%13=0,而T[0]亦被26占用,再探查h2=(12+2)%13=1,此地址开放,可将12插入其中。
类似地,第9个关键字06直接插入T[6]中;而最后一个关键字51插人时,因探查的地址12,0,1,…,6均非空,故51插入T[7]中。
原文:http://hi.baidu.com/jiang_yy_jiang/blog/item/931d763ed8edc8f2838b13c3.html
关于Unix系统中进程间通信
名称 | 说明 | 范围 | 用途 |
---|---|---|---|
文件 | 在典型的 UNIX 文件中读写数据。任意数量的进程都可以互操作。 | 本地 | 共享大数据集 |
管道 | 使用专用的文件描述符在两个进程之间传输数据。通信只在父进程和子进程之间进行。 | 本地 | 简单的数据共享,比如生产者和消费者 |
命名管道 | 通过专用的文件描述符在进程之间交换数据。通信可以在同一主机上的任意两个对等进程之间进行。 | 本地 | 生产者和消费者或命令-控制,比如 MySQL 和它的命令行查询工具 |
信号 | 通过中断通知应用程序某一情况。 | 本地 | 无法在信号中传输数据,所以信号主要用于进程管理 |
共享内存 | 通过在同一内存段中读写数据共享信息。 | 本地 | 任何类型的协作,尤其适合需要安全性的情况 |
套接字 | 完成特殊的设置过程之后,使用一般的输入/输出操作传输数据。 | 本地或远程 | FTP、ssh 和 Apache Web Server 等网络服务 |
正如前面提到的,每种技术满足不同的需求。假设多个进程之间的协作的复杂性大体相当,每种方法的优点和缺点如下:
- 通过一般的 UNIX 文件共享数据很简单,因为它使用大家熟悉的文件操作。但是,通过文件系统共享数据很慢,因为磁盘输入和输出操作的效率远远比不上内存。另外,只通过文件读写数据很难协调。最后,在文件中保存敏感数据是不安全的,因为根用户和拥有特权的其他用户可以访问这些信息。对于只读或只写的数据,适合使用文件。
- 管道和命名管道也很简单。它们在连接的两端使用两个标准的文件描述符 — 一个只执行读操作,另一个只执行写操作。但是,管道只能在父进程和子进程之间使用,不能在任意两个进程之间使用。命名管道克服了这个缺点,是在同一系统上交换数据的好方法。但是,管道和命名管道都不提供随机访问,因为它们都作为先入先出 (FIFO) 设备。
- 信号无法在进程之间传输数据。一般情况下,信号应该只用于在进程之间通知异常情况。
- 共享内存适合比较大的数据集,因为它使用内存,支持快速的随机访问。共享内存的实现有点儿复杂,尽管如此,对于多个进程之间的主机内 协作,共享内存是不错的方法。
- 套接字的功能与命名管道很相似,但是可以跨主机。本地套接字 (也称为 UNIX 套接字)只能进行本地(同一主机上的)连接。Inet 和 Inet6 套接字分别使用 IPv4 和 IPv6 协议,它们接受远程连接(也可以通过本地机器的 Internet 寻址机制接受本地连接)。网络应用程序显然应该选择套接字,比如分布式处理或 web 浏览器。所需的代码比命名管道复杂一点儿,但是模式是固定的,在任何 UNIX 网络编程书中都有介绍。
现在不考虑主机间 应用程序通信,看看如何通过共享内存在同一主机上进行进程间通信。
详见:http://www.ibm.com/developerworks/cn/aix/library/au-spunix_sharedmemory/
线程同步?通常用到的一些线程同步方法包括:Event, Mutex, 信号量Semaphore, 临界区资源等
XML的两种常用解析方法?
DOM,SAX。还有另一种选择,即 XML 编组库形式的解析,如 Castor
详见:http://www.ibm.com/developerworks/cn/xml/x-wxxm38.html
IT地址的划分?什么是A类地址,B类地址,C类地址……
A类地址
B类地址
C类地址
D类地址
E类地址
操作系统同步机制遵循的原则
1,空闲让进
2,忙则等待
3,有限等待
4,让权等待