Try   HackMD

2016q3 Homework2 (phonebook-concurrent)

contributed by <GoblinBear>

Thread 研讀

linux線程同步(2)-條件變數

請閱讀英文的材料,最好是 Linux man-page 或 Open Group 提供的版本,這樣才能反映最新的系統行為 jserv

案例分析:Phonebook-concurrent

資料閱讀

記憶體映射函數 mmap 的使用方法

請閱讀英文的材料,最好是 Linux man-page 或 Open Group 提供的版本,這樣才能反映最新的系統行為 jserv

mmap
pthread_setconcurrency(3) - Linux manual page - man7.org

資料整理

mmap

理解程式碼

typedef struct _append_a {
    char *ptr;           // 存放每個 lastName 的起始位址
    char *eptr;
    int tid;             // thread id
    int nthread;         // thread 的總數
    entry *entryStart;   // thread 物件的位址
    entry *pHead;
    entry *pLast;
} append_a;
char *map = mmap(NULL, fs, PROT_READ, MAP_SHARED, fd, 0);

=> 建立記憶體映射,map 映射開始的位址指標

你真的讀過 man page 了嗎?這個系統呼叫的作用遠遠超過上述這句話 jserv

pthread_setconcurrency(THREAD_NUM + 1);

=> 提示系統表明希望的並行度 (只是提示,系統不保證採用)

pthread_t *tid = (pthread_t *) malloc(sizeof( pthread_t) * THREAD_NUM);

=> 建立存放 thread 的陣列

append_a **app = (append_a **) malloc(sizeof(append_a *) * THREAD_NUM);

=> 建立存放 append_a 的指標的陣列

for (int i = 0; i < THREAD_NUM; i++)
    pthread_create( &tid[i], NULL, (void *) &append, (void *) app[i]);

=> 透過 POSIX Thread 建立各自獨立的 linked list

entry *etmp;
pHead = pHead->pNext;
for (int i = 0; i < THREAD_NUM; i++) {
	if (i == 0) {
		pHead = app[i]->pHead->pNext;
		dprintf("Connect %d head string %s %p\n", i, app[i]->pHead->pNext->lastName, app[i]->ptr);
	} else {
		etmp->pNext = app[i]->pHead->pNext;
		dprintf("Connect %d head string %s %p\n", i, app[i]->pHead->pNext->lastName, app[i]->ptr);
	}

	etmp = app[i]->pLast;
	dprintf("Connect %d tail string %s %p\n", i, app[i]->pLast->lastName, app[i]->ptr);
	dprintf("round %d\n", i);
}

=> 最終合併為單一 list

Thread 搭配 mmap 實驗

  • Thread num = 1
  • Thread num = 2
  • Thread num = 4
  • Thread num = 8

Thread num = 2 時速度最快