contributed by <shelly4132
>
$ lscpu | grep cache
sequeced-before就是一種在同一個thread下,求值順序關係的描述。
雖然我們對運算優先權做了很多定義,比如說f1() + f2()會先計算完f1()和f2()才計算他們加起來的結果(運算元的運算優於運算子),但仍有許多運算是未定義的。
比如說 i = i++;
,我們不知道究竟i會等於++後的結果還是等於i目前的值,因為我們沒有定義assignment跟i++
的side effect的先後關係,所以讓程式產生了不確定性。
happens-before就是指前一個操作的效果必須在下一個操作執行之前出現。
但happens-before並不是指前一行的程式碼必須先於後一行的程式碼執行,只要執行出來的結果看起來像是那樣,那後面的程式碼先被執行也沒關係。
Context Switch:由OS根據一定的排程演算法,讓CPU一直保持有proccess在執行,而等到要執行某個proccess才把他的資料讀進記憶體,再把部份資料移出去的動作就叫context switch。
Coroutines:由programmer利用一些程式技巧延遲執行某些task,讓程式不會因為某個要執行很久的東西而停頓。
Proccess:一個 process 包括了一個執行中的程式,和一些
他所需的系統資源,諸如檔案描述表和位址空間等。
Thread:thread 實質上就是一個程式計數器、一個堆疊再加上一組暫存器。一個proccess中可以有多個thread,而這些thread都共享同一個記憶體資源。
pthread_t a_thread;
pthread_attr_t
:thread attribute 描述 thread 的一些特性,目前我們遇到的大部份程式只需要指定為pthread_attr_default
就好。pthread_create( &a_thread, a_thread_attribute, (void)&thread_function, (void *) &some_argument);
:產生一個thread並執行傳進去的function。mutex就像一把鎖,可以保護共享的資源。
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, pthread_mutexattr_default);
pthread_mutex_lock( &mutex );
pthread_mutex_unlock( &mutex );
pthread_mutex_destroy(&mutex);
來釋放mutexTHREAD_NUM 4
Performance counter stats for './phonebook_opt' (100 runs):
31,0883 cache-misses # 22.999 % of all cache refs ( +- 0.61% )
135,1713 cache-references ( +- 1.27% )
2,2886,1173 instructions # 1.10 insns per cycle ( +- 0.04% )
2,0871,7787 cycles ( +- 0.72% )
0.149621109 seconds time elapsed ( +- 2.18% )
將文件檔案的內容映射到一段虛擬記憶體上,通過對這段記憶體的讀取和修改,實現對文件的讀取和修改。
請尊重傳統文化,書寫台灣慣用科技術語。file = 檔案 jserv
好的><
shelly4132
void *mmap(void *start,size_t length, int prot,
int flags, int fd, off_t offsize);
Thread pool
建立thread需要系統資源,如果我們每次需要的時候才建立thread,不要的時候就丟掉,當數量多時其實是會降低效能的。所以thread pool的概念就是建立一個thread的池子,當需要thread的時候就從裡面拿,不用的時候再放回去,有效的重複利用資源。
建立一個task,讓thread知道要做什麼事。這裡我們紀錄要執行的 function pointer 與要傳遞的參數。
typedef struct {
void (*function)(void *);
void *argument;
} threadpool_task_t;
struct threadpool_t {
pthread_mutex_t lock;
pthread_cond_t notify;
pthread_t *threads;
threadpool_task_t *queue;
int thread_count;
int queue_size;
int head;
int tail;
int count;
int shutdown;
int started;
};