這一篇是研究Memory barrier的心得。研究的原因是因為在UEFI環境下使用multi-processor protocol 來驗證CPU design,過程用到了相關的gcc Atomic函式。Atomic 提供同步機制,使得在Multi-Processor/Multi-Thread的系統下操作同一塊memory, 各個Core的Cache都能確保和Memory同步。
這邊只是以軟體thread寫個應用程式作範例來解釋Memory barrier, 如果不使用Built-in functions for atomic memory access而將__sync_fetch_and_add(&count,1);改成count++, 則count結果會不正確。
#include <stdio.h> #include <pthread.h> #include <stdlib.h> static int count = 0; void *MyTest(void *arg) { for (int i=0; i<20000; ++i) __sync_fetch_and_add(&count, 1); return NULL; } int main(int argc, const char *argv[]) { pthread_t Thread_Id[10]; int i; for (i=0;i<10;++i) pthread_create(&Thread_Id[i], NULL, MyTest, NULL); // Wait until all threads have finished. for (i=0;i<10;++i) pthread_join(Thread_Id[i], NULL); printf("%d\n",count); return 0; }
另外,__sync_synchronize (): This built-in function issues a full memory barrier.呼叫這個函式讓每個Core上的cache和memory同步。
<note> UEFI kernel提供EFI_MP_SERVICES_PROTOCOL,透過這個protocol,可以指定呼叫某個/或多個CORE (AP)分別執行特定的function,達到Multi-processing的效果。
-------------------------------------------------------------------------------------------------------------------------
<note> UEFI kernel提供EFI_MP_SERVICES_PROTOCOL,透過這個protocol,可以指定呼叫某個/或多個CORE (AP)分別執行特定的function,達到Multi-processing的效果。
-------------------------------------------------------------------------------------------------------------------------
Ps. 在windows下測試,需要自行加入pthread這個library。
如果你用Dev-C++ 5.11, 在Project->Parameters->Add library or object 加入
如果你用Dev-C++ 5.11, 在Project->Parameters->Add library or object 加入
"../../Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libpthread.a"
順便解釋一下我認知的procces/thread:
process: 在系統中被註冊要執行的程式,其擁有CPU的使用權和獨立的位址空間。
thread: 系統處理工作的基本單位,一個CPU核心在同一時間只能提供一個thread來執行process
Multi-Thread: 將多個thread同時assign給一個process
Multi-Process: 每個process都分到thread來處理
thread: 系統處理工作的基本單位,一個CPU核心在同一時間只能提供一個thread來執行process
Multi-Thread: 將多個thread同時assign給一個process
Multi-Process: 每個process都分到thread來處理