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 <TABLE_SIZE; i++) {
               table[i] = null;
         }
    }  
    public int get(int key) {
         int hash = (key % TABLE_SIZE);
         while(table[hash] != null && table[hash].getKey() != key) {
               hash = (hash + 1) % TABLE_SIZE;
         }
         if(table[hash] == null) {
               return -1;
         } else {
               return table[hash].getValue();
         }
    }
    public void put(int key, int value) {
         int hash = (key % TABLE_SIZE);
         while(table[hash] != null && table[hash].getKey() != key) {
               hash = (hash + 1) % TABLE_SIZE;
         }
         table[hash] = new HashEntry(key, value);
    }
}    

 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.

 
 
 
 
 顺便推广自己的微店---美国加拿大留学申请咨询 http://weidian.com/s/316012464?wfr=c
 
 
posted on 2015-02-19 02:23  Eric姜  阅读(247)  评论(0)    收藏  举报