BakudYao

@bakudr18

我真的爛

Joined on Nov 3, 2020

  • contributed by < bakudr18> 作業要求 queue.c 實作 q_new 及 q_free q_new 在 list head 配置一個 struct list_head 即可,而 q_free 需要走訪整個 list 來 delete node ,因為走訪過程會 remove node ,因此需要用 list_for_each_entry_safe 保留一個 tmp node 來避免迭代過程錯誤 ,刪除完所有 node 後最後再釋放 list head 。 struct list_head *q_new() {
     Like  Bookmark
  • contribute by < bakudr18 > 測驗題目 測驗 2 lock-free data structure 必須要注意 ABA problem ,例如若有一個 linked list 為 $a\rightarrow b\rightarrow c$ ,對 linked list 的 head 做 compare_and_swap(&head, new = 'b', expected = 'a') 操作時,若此時有令一個執行緒 連續 pop 'a' 'b' 後再 push 'a' ,則此時 linked list 變為 $a\rightarrow c$ , CAS 操作仍會成功,就會導致 head 被指向已經被釋放的 'b' 而導致錯誤。 而 Hazard pointer 就是解決 ABA problem 的其中一種方法,可以避免仍有 reader 在讀取資料被釋放。其概念是當有 reader 要讀取資料時,都會建立一個 hazard pointer 指向該資料,直到 reader 讀取完畢才會移除 hazard pointer,而此時當有 writer 要移除資料時,若發現此資料在 hazard pointers 內,則不能直接移除,此時有兩種作法,一是一直等到資料該資料的 hazard pointer 被 reader 主動移除,writer 才能移除資料,二是先把此資料放到 retire list 中,等下次再來檢查是否有資料在 retire list 且不被 hazard pointer 所指向,此時才可以移除資料。 接著看到程式碼:
     Like  Bookmark
  • contribute by < bakudr18 > 測驗題目 執行環境 :::spoiler lscpu $ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit
     Like  Bookmark
  • contribute by < bakudr18 > 測驗題目 測驗 8 void remove_data_origin(tree *t, int d) { tnode_t **p = t; // search node with d data while (*p != NULL && (*p)->data != d) {
     Like  Bookmark
  • contributed by < bakudr18 > 第 2 週測驗題 測驗 1 解釋 list_merge_sort 運作原理 void list_merge_sort(queue_t *q) { if (list_is_singular(&q->list)) return;
     Like  Bookmark
  • contributed by < bakudr18 > fibdrv 建立效能分析實驗 環境設定 於指定 CPU 核心上執行程式 首先於 /etc/default/grub 新增 isolcpu=7 以指定 cpu 7 不被用來做 kernel schduler 排程,設定完後執行 sudo update-grub 然後重開機,可透過以下命令確認是否設定成功 $ cat /sys/devices/system/cpu/isolated
     Like  Bookmark
  • contributed by < bakudr18> 作業要求: lab0 queue[.ch] 實作 queue_t typedef struct { list_ele_t *head; /* Linked list of elements */ list_ele_t *tail; size_t size;
     Like 2 Bookmark