1. Mutex(互斥量) vs Semaphore(信号)
a. Mutex和Semaphore的主要区别是什么?count为1的semaphore是不是就是mutex?
严格来讲,mutex是锁的机制,semaphore是信号的机制。
mutex(locking mechanism)相当于给资源(resource)加了一把锁,每次只有一个task能够获取锁(mutex).也就相当于,获得这个锁的task就是这把锁的拥有者。只有它能够释放锁
Semaphore(signalling mechanism)可以有多个。某个资源可以有多个semaphore,当被取走了一个,计数就减一。还回来一个,计数就加一。但是semephore不像mutex那样有一个拥有者。也就是说,当你听歌的时候,如果有电话打进来,会有阻断的机制终止听歌,然后把电话处理唤醒。这里存在一个Interrupt Service Routine(ISR)。
b. 理论上来讲,mutex是允许递归的。递归的情况下,mutex可以锁多次。但它释放的时候也必须依次返回获得的锁操作。鉴于递归(recursion)这个概念的 特殊性,每个mutex仍然是独立的。与mutex,0或1,的特性不冲突。没有递归,mutex不可以被多次锁,否则就死锁了。
c. 进一步的概念:critical section(临界区)
2. Hash Table(哈希表)
a. HashTable的弊端: 浪费存储空间。一般来说,有一半的空间会浪费掉。存储的元素越多,发生哈希冲突hash collision(哈希冲突)的概率越大。可以一开 始开辟个小一些的空间,当元素越来越多的时候可以动态扩展。但仍然会浪费一些空间。
b. hash collision(哈希冲突)的解决办法:
1. Open addressing(开放地址): 发生冲突的时候继续检测可用位置(bucket),直到找到位置可以放为止
2. Seperate chaining(链地址): 给冲突的位置设置一个链表,把该位置冲突的元素全都放进相应的链表里面
3. 实现HashTable的一个简单例子
代码引自: http://www.algolist.net/Data_structures/Hash_table/Simple_example
public class HashEntry { private int key; private int value; HashEntry(int key, int value) { this.key = key; this.value = value; } public int getKey() { return key; } public int getValue() { return value; }}public class HashMap { private final static int TABLE_SIZE = 128; HashEntry[] table; HashMap() { table = new HashEntry[TABLE_SIZE]; for(int i = 0; i
4. TCP/IP 和UDP
TCP:是面向连接的、可靠的、全双工的数据流传输服务。TCP会在接收端保证所有数据包都被接收而且有序。如果有丢失,会重发。
It is a reliable protocol which can check data at receiver to ensure ordered packets. Re-send if any missing happened.
UDP: 面向无连接的、不可靠的传输层协议。Does't guarantee reliability nor order。(communication protocol)
5.