使用 Musl C 庫的時候,內核提供了基于 LOS_XXX 適配實現 pthread、mqeue、fs、semaphore、time 等模塊的 posix 接口(//kernel/liteos_m
2024-02-18 15:41:09195 原生Swift編譯器是不支持生成Cortex-M機器指令的,但得益于LLVM框架的模塊化架構,僅需少許Hack即可為其添加一個現成的Cortex-M后端。
2019-10-07 10:27:002321 POSIX 接口Pthreads 簡介POSIX Threads 簡稱 Pthreads,POSIX 是 “Portable Operating SystemInterface”(可移植操作系統接口
2021-03-29 06:16:52
一.線程屬性線程具有屬性,用pthread_attr_t表示,在對該結構進行處理之前必須進行初始化,在使用后需要對其去除初始化。我們用pthread_attr_init函數對其初始化,用pthread_attr_destroy對其去除初始化。1.名稱:pthread_attr_init/pthread_attr_destroy功能:對線程屬性初始化/去除初始化頭文件:#include 函數原形:int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);參數:Attr 線程屬性變量返回值:若成功返回0,若失敗返回-1。 調用pthread_attr_init之后,pthread_t結構所包含的內容就是操作系統實現支持的線程所有屬性的默認值。 如果要去除對pthread_attr_t結構的初始化,可以調用pthread_attr_destroy函數。如果pthread_attr_init實現時為屬性對象分配了動態內存空間,pthread_attr_destroy還會用無效的值初始化屬性對象,因此如果經pthread_attr_destroy去除初始化之后的pthread_attr_t結構被pthread_create函數調用,將會導致其返回錯誤。 線程屬性結構如下:typedef struct{int detachstate; 線程的分離狀態int schedpolicy; 線程調度策略struct sched_param schedparam; 線程的調度參數int inheritsched; 線程的繼承性int scope; 線程的作用域size_t guardsize; 線程棧末尾的警戒緩沖區大小int stackaddr_set;void * stackaddr; 線程棧的位置size_t stacksize; 線程棧的大小}pthread_attr_t;每個個屬性都對應一些函數對其查看或修改。下面我們分別介紹。二、線程的分離狀態 線程的分離狀態決定一個線程以什么樣的方式來終止自己。在默認情況下線程是非分離狀態的,這種情況下,原有的線程等待創建的線程結束。只有當pthread_join()函數返回時,創建的線程才算終止,才能釋放自己占用的系統資源。 而分離線程不是這樣子的,它沒有被其他的線程所等待,自己運行結束了,線程也就終止了,馬上釋放系統資源。程序員應該根據自己的需要,選擇適當的分離狀態。所以如果我們在創建線程時就知道不需要了解線程的終止狀態,則可以pthread_attr_t結構中的detachstate線程屬性,讓線程以分離狀態啟動。2.名稱:pthread_attr_getdetachstate/pthread_attr_setdetachstate功能:獲取/修改線程的分離狀態屬性頭文件:#include 函數原形:int pthread_attr_getdetachstate(const pthread_attr_t * attr,int *detachstate);int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);參數:Attr 線程屬性變量, Detachstate 線程的分離狀態屬性返回值:若成功返回0,若失敗返回-1。 可以使用pthread_attr_setdetachstate函數把線程屬性detachstate設置為下面的兩個合法值之一:設置為PTHREAD_CREATE_DETACHED,以分離狀態啟動線程;或者設置為PTHREAD_CREATE_JOINABLE,正常啟動線程。可以使用pthread_attr_getdetachstate函數獲取當前的datachstate線程屬性。(1) 以分離狀態創建線程#include void *child_thread(void *arg){printf(“child thread run!\n”);}int main(int argc,char *argv[ ]){pthread_t tid;pthread_attr_t attr;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);pthread_create(&tid,&attr,fn,arg);pthread_attr_destroy(&attr);sleep(1);}三、線程的繼承性 函數pthread_attr_setinheritsched和pthread_attr_getinheritsched分別用來設置和得到線程的繼承性,這兩個函數的定義如下:3.名稱:pthread_attr_getinheritsched /pthread_attr_setinheritsched功能:獲得/設置線程的繼承性頭文件:#include 函數原形:int pthread_attr_getinheritsched(const pthread_attr_t *attr,int *inheritsched);int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);參數:attr 線程屬性變量, inheritsched 線程的繼承性返回值:若成功返回0,若失敗返回-1。 這兩個函數具有兩個參數,第1個是指向屬性對象的指針,第2個是繼承性或指向繼承性的指針。繼承性決定調度的參數是從創建的進程中繼承還是使用在schedpolicy和schedparam屬性中顯式設置的調度信息。Pthreads不為inheritsched指定默認值,因此如果你關心線程的調度策略和參數,必須先設置該屬性。 繼承性的可能值是PTHREAD_INHERIT_SCHED(表示新現成將繼承創建線程的調度策略和參數)和PTHREAD_EXPLICIT_SCHED(表示使用在schedpolicy和schedparam屬性中顯式設置的調度策略和參數)。如果你需要顯式的設置一個線程的調度策略或參數,那么你必須在設置之前將inheritsched屬性設置為PTHREAD_EXPLICIT_SCHED.四、線程的調度策略函數pthread_attr_setschedpolicy和pthread_attr_getschedpolicy分別用來設置和得到線程的調度策略。4.名稱:pthread_attr_getschedpolicy \pthread_attr_setschedpolicy功能:獲得/設置線程的調度策略頭文件:#include 函數原形:int pthread_attr_getschedpolicy(const pthread_attr_t *attr,int *policy);int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy);參數:attr 線程屬性變量, policy 調度策略返回值:若成功返回0,若失敗返回-1。這兩個函數具有兩個參數,第1個參數是指向屬性對象的指針,第2個參數是調度策略或指向調度策略的指針。調度策略可能的值是先進先出(SCHED_FIFO)、輪轉法(SCHED_RR),或其它(SCHED_OTHER)。(1) SCHED_FIFO策略允許一個線程運行直到有更高優先級的線程準備好,或者直到它自愿阻塞自己。在SCHED_FIFO調度策略下,當有一個線程準備好時,除非有平等或更高優先級的線程已經在運行,否則它會很快開始執行。(2) SCHED_RR(輪循)策略是基本相同的,不同之處在于:如果有一個SCHED_RR策略的線程執行了超過一個固定的時期(時間片間隔)沒有阻塞,而另外的SCHED_RR或SCHBD_FIPO策略的相同優先級的線程準備好時,運行的線程將被搶占以便準備好的線程可以執行。 當有SCHED_FIFO或SCHED_RR策賂的線程在一個條件變量上等持或等持加鎖同一個互斥量時,它們將以優先級順序被喚醒。即,如果一個低優先級的SCHED_FIFO線程和一個高優先織的SCHED_FIFO線程都在等待鎖相同的互斥且,則當互斥量被解鎖時,高優先級線程將總是被首先解除阻塞。五、線程的調度參數 函數pthread_attr_getschedparam 和pthread_attr_setschedparam分別用來設置和得到線程的調度參數。5.名稱:pthread_attr_getschedparam \pthread_attr_setschedparam功能:獲得/設置線程的調度參數頭文件:#include 函數原形:int pthread_attr_getschedparam(const pthread_attr_t *attr,struct sched_param *param);int pthread_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param);參數:attr 線程屬性變量, param sched_param結構返回值:若成功返回0,若失敗返回-1。 這兩個函數具有兩個參數,第1個參數是指向屬性對象的指針,第2個參數是sched_param結構或指向該結構的指針。結構sched_param在文件/usr/include /bits/sched.h中定義如下:struct sched_param{int sched_priority;}; 結構sched_param的子成員sched_priority控制一個優先權值,大的優先權值對應高的優先權。系統支持的最大和最小優先權值可以用 sched_get_priority_max函數和sched_get_priority_min函數分別得到。注意:如果不是編寫實時程序,不建議修改線程的優先級。因為,調度策略是一件非常復雜的事情,如果不正確使用會導致程序錯誤,從而導致死鎖等問題。如:在多線程應用程序中為線程設置不同的優先級別,有可能因為共享資源而導致優先級倒置。6.名稱:sched_get_priority_max \sched_get_priority_min功能:獲得系統支持的線程優先權的最大和最小值頭文件:#include 函數原形:int sched_get_priority_max(int policy); int sched_get_priority_min(int policy);參數:policy 系統支持的線程優先權的最大和最小值返回值:若成功返回0,若失敗返回-1。 下面是上面幾個函數的程序例子:#include #include void *child_thread(void *arg){int policy;int max_priority,min_priority;struct sched_param param;pthread_attr_t attr;pthread_attr_init(&attr); /*初始化線程屬性變量*/pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED); /*設置線程繼承性*/pthread_attr_getinheritsched(&attr,&policy); /*獲得線程的繼承性*/if(policy==PTHREAD_EXPLICIT_SCHED)printf(“Inheritsched:PTHREAD_EXPLICIT_SCHED\n”);if(policy==PTHREAD_INHERIT_SCHED)printf(“Inheritsched:PTHREAD_INHERIT_SCHED\n”);pthread_attr_setschedpolicy(&attr,SCHED_RR);/*設置線程調度策略*/pthread_attr_getschedpolicy(&attr,&policy);/*取得線程的調度策略*/if(policy==SCHED_FIFO)printf(“Schedpolicy:SCHED_FIFO\n”);if(policy==SCHED_RR)printf(“Schedpolicy:SCHED_RR\n”);if(policy==SCHED_OTHER)printf(“Schedpolicy:SCHED_OTHER\n”);sched_get_priority_max(max_priority);/*獲得系統支持的線程優先權的最大值*/sched_get_priority_min(min_priority);/* 獲得系統支持的線程優先權的最小值*/printf(“Max priority:%u\n”,max_priority);printf(“Min priority:%u\n”,min_priority);param.sched_priority=max_priority;pthread_attr_setschedparam(&attr,¶m);/*設置線程的調度參數*/printf(“sched_priority:%u\n”,param.sched_priority);/*獲得線程的調度參數*/pthread_attr_destroy(&attr);}int main(int argc,char *argv[ ]){pthread_t child_thread_id;pthread_create(&child_thread_id,NULL,child_thread,NULL);pthread_join(child_thread_id,NULL);}六、線程的作用域 函數pthread_attr_setscope和pthread_attr_getscope分別用來設置和得到線程的作用域,這兩個函數的定義如下:7.名稱:pthread_attr_setscope\pthread_attr_getscope功能:獲得/設置線程的作用域頭文件:#include 函數原形:int pthread_attr_setscope(pthread_attr_t *attr,int scope);int pthread_attr_getscope(const pthread_attr_t *attr,int *scope);參數:attr 線程屬性變量, scope 線程的作用域返回值:若成功返回0,若失敗返回-1。 這兩個函數具有兩個參數,第1個是指向屬性對象的指針,第2個是作用域或指向作用域的指針,作用域控制線程是否在進程內或在系統級上競爭資源,可能的值是PTHREAD_SCOPE_PROCESS(進程內競爭資源),PTHREAD_SCOPE_SYSTEM.(系統級上競爭資源)。七、線程堆棧的大小 函數pthread_attr_setstacksize和pthread_attr_getstacksize分別用來設置和得到線程堆棧的大小,這兩個函數的定義如下所示:8.名稱:pthread_attr_getdetstacksize\pthread_attr_setstacksize功能:獲得/修改線程棧的大小頭文件:#include 函數原形:int pthread_attr_getstacksize(const pthread_attr_t *restrict attr,size_t *restrict stacksize);int pthread_attr_setstacksize(pthread_attr_t *attr ,size_t *stacksize);參數:attr 線程屬性變量,stacksize 堆棧大小返回值:若成功返回0,若失敗返回-1。 這兩個參數具有兩個參數,第1個是指向屬性對象的指針,第2個是堆棧大小或指向堆棧大小的指針.如果希望改變棧的默認大小,但又不想自己處理線程棧的分配問題,這時使用pthread_attr_setstacksize函數就非常有用。八、線程堆棧的地址函數pthread_attr_setstackaddr和pthread_attr_getstackaddr分別用來設置和得到線程堆棧的位置,這兩個函數的定義如下:9.名稱:pthread_attr_setstackaddr\pthread_attr_getstackaddr功能:獲得/修改線程棧的位置頭文件:#include 函數原形:int pthread_attr_getstackaddr(const pthread_attr_t *attr,void **stackaddf);int pthread_attr_setstackaddr(pthread_attr_t *attr,void *stackaddr);參數:attr 線程屬性變量,stackaddr 堆棧地址返回值:若成功返回0,若失敗返回-1。這兩個函數具有兩個參數,第1個是指向屬性對象的指針,第2個是堆棧地址或指向堆棧地址的指針。九、線程棧末尾的警戒緩沖區大小函數pthread_attr_getguardsize和pthread_attr_setguardsize分別用來設置和得到線程棧末尾的警戒緩沖區大小,這兩個函數的定義如下:10.名稱:pthread_attr_getguardsize/pthread_attr_setguardsize功能:獲得/修改線程棧末尾的警戒緩沖區大小頭文件:#include 函數原形:int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,size_t *restrict guardsize);int pthread_attr_setguardsize(pthread_attr_t *attr ,size_t *guardsize);參數:返回值:若成功返回0,若失敗返回-1。 線程屬性guardsize控制著線程棧末尾之后以避免棧溢出的擴展內存大小。這個屬性默認設置為PAGESIZE個字節。可以把guardsize線程屬性設為0,從而不允許屬性的這種特征行為發生:在這種情況下不會提供警戒緩存區。同樣地,如果對線程屬性stackaddr作了修改,系統就會假設我們會自己管理棧,并使警戒棧緩沖區機制無效,等同于把guardsize線程屬性設為0。
2013-09-29 11:00:50
一.線程屬性線程具有屬性,用pthread_attr_t表示,在對該結構進行處理之前必須進行初始化,在使用后需要對其去除初始化。我們用pthread_attr_init函數對其初始化,用pthread_attr_destroy對其去除初始化。1.名稱:pthread_attr_init/pthread_attr_destroy功能:對線程屬性初始化/去除初始化頭文件:#include 函數原形:參數:Attr 線程屬性變量int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);返回值:若成功返回0,若失敗返回-1。 調用pthread_attr_init之后,pthread_t結構所包含的內容就是操作系統實現支持的線程所有屬性的默認值。 如果要去除對pthread_attr_t結構的初始化,可以調用pthread_attr_destroy函數。如果pthread_attr_init實現時為屬性對象分配了動態內存空間,pthread_attr_destroy還會用無效的值初始化屬性對象,因此如果經pthread_attr_destroy去除初始化之后的pthread_attr_t結構被pthread_create函數調用,將會導致其返回錯誤。 線程屬性結構如下:typedef struct{int detachstate; 線程的分離狀態int schedpolicy; 線程調度策略struct sched_param schedparam; 線程的調度參數int inheritsched; 線程的繼承性int scope; 線程的作用域size_t guardsize; 線程棧末尾的警戒緩沖區大小int stackaddr_set;void * stackaddr; 線程棧的位置size_t stacksize; 線程棧的大小}pthread_attr_t;每個個屬性都對應一些函數對其查看或修改。下面我們分別介紹。二、線程的分離狀態 線程的分離狀態決定一個線程以什么樣的方式來終止自己。在默認情況下線程是非分離狀態的,這種情況下,原有的線程等待創建的線程結束。只有當pthread_join()函數返回時,創建的線程才算終止,才能釋放自己占用的系統資源。 而分離線程不是這樣子的,它沒有被其他的線程所等待,自己運行結束了,線程也就終止了,馬上釋放系統資源。程序員應該根據自己的需要,選擇適當的分離狀態。所以如果我們在創建線程時就知道不需要了解線程的終止狀態,則可以pthread_attr_t結構中的detachstate線程屬性,讓線程以分離狀態啟動。2.名稱:pthread_attr_getdetachstate/pthread_attr_setdetachstate功能:獲取/修改線程的分離狀態屬性頭文件:#include 函數原形:int pthread_attr_getdetachstate(const pthread_attr_t * attr,int *detachstate);int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);參數:Attr 線程屬性變量, Detachstate 線程的分離狀態屬性返回值:若成功返回0,若失敗返回-1。 可以使用pthread_attr_setdetachstate函數把線程屬性detachstate設置為下面的兩個合法值之一:設置為PTHREAD_CREATE_DETACHED,以分離狀態啟動線程;或者設置為PTHREAD_CREATE_JOINABLE,正常啟動線程。可以使用pthread_attr_getdetachstate函數獲取當前的datachstate線程屬性。(1) 以分離狀態創建線程#include void *child_thread(void *arg){printf(“child thread run!\n”);}int main(int argc,char *argv[ ]){pthread_t tid;pthread_attr_t attr;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);pthread_create(&tid,&attr,fn,arg);pthread_attr_destroy(&attr);sleep(1);}三、線程的繼承性 函數pthread_attr_setinheritsched和pthread_attr_getinheritsched分別用來設置和得到線程的繼承性,這兩個函數的定義如下:3.名稱:pthread_attr_getinheritsched /pthread_attr_setinheritsched功能:獲得/設置線程的繼承性頭文件:#include 函數原形:int pthread_attr_getinheritsched(const pthread_attr_t *attr,int *inheritsched);int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);參數:attr 線程屬性變量, inheritsched 線程的繼承性返回值:若成功返回0,若失敗返回-1。 這兩個函數具有兩個參數,第1個是指向屬性對象的指針,第2個是繼承性或指向繼承性的指針。繼承性決定調度的參數是從創建的進程中繼承還是使用在schedpolicy和schedparam屬性中顯式設置的調度信息。Pthreads不為inheritsched指定默認值,因此如果你關心線程的調度策略和參數,必須先設置該屬性。 繼承性的可能值是PTHREAD_INHERIT_SCHED(表示新現成將繼承創建線程的調度策略和參數)和PTHREAD_EXPLICIT_SCHED(表示使用在schedpolicy和schedparam屬性中顯式設置的調度策略和參數)。如果你需要顯式的設置一個線程的調度策略或參數,那么你必須在設置之前將inheritsched屬性設置為PTHREAD_EXPLICIT_SCHED.四、線程的調度策略函數pthread_attr_setschedpolicy和pthread_attr_getschedpolicy分別用來設置和得到線程的調度策略。4.名稱:pthread_attr_getschedpolicy \pthread_attr_setschedpolicy功能:獲得/設置線程的調度策略頭文件:#include 函數原形:int pthread_attr_getschedpolicy(const pthread_attr_t *attr,int *policy);int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy);參數:attr 線程屬性變量, policy 調度策略返回值:若成功返回0,若失敗返回-1。這兩個函數具有兩個參數,第1個參數是指向屬性對象的指針,第2個參數是調度策略或指向調度策略的指針。調度策略可能的值是先進先出(SCHED_FIFO)、輪轉法(SCHED_RR),或其它(SCHED_OTHER)。(1) SCHED_FIFO策略允許一個線程運行直到有更高優先級的線程準備好,或者直到它自愿阻塞自己。在SCHED_FIFO調度策略下,當有一個線程準備好時,除非有平等或更高優先級的線程已經在運行,否則它會很快開始執行。(2) SCHED_RR(輪循)策略是基本相同的,不同之處在于:如果有一個SCHED_RR策略的線程執行了超過一個固定的時期(時間片間隔)沒有阻塞,而另外的SCHED_RR或SCHBD_FIPO策略的相同優先級的線程準備好時,運行的線程將被搶占以便準備好的線程可以執行。 當有SCHED_FIFO或SCHED_RR策賂的線程在一個條件變量上等持或等持加鎖同一個互斥量時,它們將以優先級順序被喚醒。即,如果一個低優先級的SCHED_FIFO線程和一個高優先織的SCHED_FIFO線程都在等待鎖相同的互斥且,則當互斥量被解鎖時,高優先級線程將總是被首先解除阻塞。五、線程的調度參數 函數pthread_attr_getschedparam 和pthread_attr_setschedparam分別用來設置和得到線程的調度參數。5.名稱:pthread_attr_getschedparam \pthread_attr_setschedparam功能:獲得/設置線程的調度參數頭文件:#include 函數原形:int pthread_attr_getschedparam(const pthread_attr_t *attr,struct sched_param *param);int pthread_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param);參數:attr 線程屬性變量, param sched_param結構返回值:若成功返回0,若失敗返回-1。 這兩個函數具有兩個參數,第1個參數是指向屬性對象的指針,第2個參數是sched_param結構或指向該結構的指針。結構sched_param在文件/usr/include /bits/sched.h中定義如下:struct sched_param{int sched_priority;}; 結構sched_param的子成員sched_priority控制一個優先權值,大的優先權值對應高的優先權。系統支持的最大和最小優先權值可以用 sched_get_priority_max函數和sched_get_priority_min函數分別得到。注意:如果不是編寫實時程序,不建議修改線程的優先級。因為,調度策略是一件非常復雜的事情,如果不正確使用會導致程序錯誤,從而導致死鎖等問題。如:在多線程應用程序中為線程設置不同的優先級別,有可能因為共享資源而導致優先級倒置。6.名稱:sched_get_priority_max \sched_get_priority_min功能:獲得系統支持的線程優先權的最大和最小值頭文件:#include 函數原形:int sched_get_priority_max(int policy); int sched_get_priority_min(int policy);參數:policy 系統支持的線程優先權的最大和最小值返回值:若成功返回0,若失敗返回-1。 下面是上面幾個函數的程序例子:#include #include void *child_thread(void *arg){int policy;int max_priority,min_priority;struct sched_param param;pthread_attr_t attr;pthread_attr_init(&attr); /*初始化線程屬性變量*/pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED); /*設置線程繼承性*/pthread_attr_getinheritsched(&attr,&policy); /*獲得線程的繼承性*/if(policy==PTHREAD_EXPLICIT_SCHED)printf(“Inheritsched:PTHREAD_EXPLICIT_SCHED\n”);if(policy==PTHREAD_INHERIT_SCHED)printf(“Inheritsched:PTHREAD_INHERIT_SCHED\n”);pthread_attr_setschedpolicy(&attr,SCHED_RR);/*設置線程調度策略*/pthread_attr_getschedpolicy(&attr,&policy);/*取得線程的調度策略*/if(policy==SCHED_FIFO)printf(“Schedpolicy:SCHED_FIFO\n”);if(policy==SCHED_RR)printf(“Schedpolicy:SCHED_RR\n”);if(policy==SCHED_OTHER)printf(“Schedpolicy:SCHED_OTHER\n”);sched_get_priority_max(max_priority);/*獲得系統支持的線程優先權的最大值*/sched_get_priority_min(min_priority);/* 獲得系統支持的線程優先權的最小值*/printf(“Max priority:%u\n”,max_priority);printf(“Min priority:%u\n”,min_priority);param.sched_priority=max_priority;pthread_attr_setschedparam(&attr,¶m);/*設置線程的調度參數*/printf(“sched_priority:%u\n”,param.sched_priority);/*獲得線程的調度參數*/pthread_attr_destroy(&attr);}int main(int argc,char *argv[ ]){pthread_t child_thread_id;pthread_create(&child_thread_id,NULL,child_thread,NULL);pthread_join(child_thread_id,NULL);}六、線程的作用域 函數pthread_attr_setscope和pthread_attr_getscope分別用來設置和得到線程的作用域,這兩個函數的定義如下:7.名稱:pthread_attr_setscope\pthread_attr_getscope功能:獲得/設置線程的作用域頭文件:#include 函數原形:int pthread_attr_setscope(pthread_attr_t *attr,int scope);int pthread_attr_getscope(const pthread_attr_t *attr,int *scope);參數:attr 線程屬性變量, scope 線程的作用域返回值:若成功返回0,若失敗返回-1。 這兩個函數具有兩個參數,第1個是指向屬性對象的指針,第2個是作用域或指向作用域的指針,作用域控制線程是否在進程內或在系統級上競爭資源,可能的值是PTHREAD_SCOPE_PROCESS(進程內競爭資源),PTHREAD_SCOPE_SYSTEM.(系統級上競爭資源)。七、線程堆棧的大小 函數pthread_attr_setstacksize和pthread_attr_getstacksize分別用來設置和得到線程堆棧的大小,這兩個函數的定義如下所示:8.名稱:pthread_attr_getdetstacksize\pthread_attr_setstacksize功能:獲得/修改線程棧的大小頭文件:#include 函數原形:int pthread_attr_getstacksize(const pthread_attr_t *restrict attr,size_t *restrict stacksize);int pthread_attr_setstacksize(pthread_attr_t *attr ,size_t *stacksize);參數:attr 線程屬性變量,stacksize 堆棧大小返回值:若成功返回0,若失敗返回-1。 這兩個參數具有兩個參數,第1個是指向屬性對象的指針,第2個是堆棧大小或指向堆棧大小的指針.如果希望改變棧的默認大小,但又不想自己處理線程棧的分配問題,這時使用pthread_attr_setstacksize函數就非常有用。八、線程堆棧的地址函數pthread_attr_setstackaddr和pthread_attr_getstackaddr分別用來設置和得到線程堆棧的位置,這兩個函數的定義如下:9.名稱:pthread_attr_setstackaddr\pthread_attr_getstackaddr功能:獲得/修改線程棧的位置頭文件:#include 函數原形:int pthread_attr_getstackaddr(const pthread_attr_t *attr,void **stackaddf);int pthread_attr_setstackaddr(pthread_attr_t *attr,void *stackaddr);參數:attr 線程屬性變量,stackaddr 堆棧地址返回值:若成功返回0,若失敗返回-1。這兩個函數具有兩個參數,第1個是指向屬性對象的指針,第2個是堆棧地址或指向堆棧地址的指針。九、線程棧末尾的警戒緩沖區大小函數pthread_attr_getguardsize和pthread_attr_setguardsize分別用來設置和得到線程棧末尾的警戒緩沖區大小,這兩個函數的定義如下:10.名稱:pthread_attr_getguardsize/pthread_attr_setguardsize功能:獲得/修改線程棧末尾的警戒緩沖區大小頭文件:#include 函數原形:int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,size_t *restrict guardsize);int pthread_attr_setguardsize(pthread_attr_t *attr ,size_t *guardsize);參數:返回值:若成功返回0,若失敗返回-1。 線程屬性guardsize控制著線程棧末尾之后以避免棧溢出的擴展內存大小。這個屬性默認設置為PAGESIZE個字節。可以把guardsize線程屬性設為0,從而不允許屬性的這種特征行為發生:在這種情況下不會提供警戒緩存區。同樣地,如果對線程屬性stackaddr作了修改,系統就會假設我們會自己管理棧,并使警戒棧緩沖區機制無效,等同于把guardsize線程屬性設為0。
2013-09-29 16:00:28
posix嵌入式操作系統What is POSIX? We hear this term in Linux and Unix world but do not understand
2021-12-27 08:31:38
posix嵌入式操作系統What is POSIX? We hear this term in Linux and Unix world but do not understand
2021-12-28 11:13:46
(Hardware Driver Foundation)引入統一驅動框架HDF,統一驅動標準,為設備廠商提供了更統一的接入方式,使驅動更加容易移植,力求做到一次開發,多系統部署。支持1200+標準POSIX接口
2022-05-10 10:52:01
本文將為您介紹關于POSIX定時器的相關知識點。因為要使用絕對時間,存在系統時間被調節的可能性,指定時間段內下發通知等需求,排除了jiffies相關的定時器、依賴于系統運行時間的定時器、alarm
2022-12-12 14:59:29
:
第一:Linux擁有超過30億用戶,是很受歡迎的操作系統之一。此外,在要求苛刻的嵌入式系統行業中,嵌入式Linux約占嵌入式設計的70%。
第二:便攜式操作系統接口(POSIX)起源于20世紀
2023-05-18 13:59:26
報錯信息如下圖:dfs_posix.c128 first defined here錯誤信息定位到了這里,因為在其他版本上已經成功掛載DFS,所以操作基本一樣。但是這個錯誤不知道為什么。
2023-01-11 14:21:58
4.10的內核,使用posix,使能文件系統,使用fd_set定義變量報錯,顯示error: unknown type name 'fd_set',隨后定位錯誤發現有三個文件夾的select.h文件
2022-11-03 11:01:03
rt_pipe_xxx , 也對接了 posix 接口。二. 怎么使用管道在使用之前先看一下 pipe 的結構體通過上面的結構體可以先嘗試分析以下管道的實現原理:is_named :確定是匿名管道,還是實名
2022-04-14 14:57:20
RTThread中POSIX兼容層里自旋鎖的加鎖實現好像不太對。如代碼所示:int pthread_spin_lock (pthread_spinlock_t *lock){
2023-02-01 15:54:34
串口數據一切正常,只有msh回顯數據是亂碼,打開了RT_USING_POSIX,
2022-05-11 09:32:45
'可是pthread.h包含的<sys/types.h>中_POSIX_THREADS沒定義,所以連typedef __uint32_t pthread_t都沒生效!到底
2009-08-13 17:58:46
make CROSS_COMPILE=/xxx/xxx/xxx/arm-linux/target/bin/arm-linux-備注:若出現 對‘posix_madvise’未定義的引用 的錯誤...
2021-12-27 07:53:39
使用Linux系統提供的機制來對線程訪問資源的順序進行同步,本文檔挑選了信號量,互斥鎖,條件變量來介紹線程同步機制,實驗代碼在sync/目錄下。1 POSIX無名信號量本章介紹POSIX 無名信號量,以下簡稱
2021-04-02 14:04:09
linux多線程環境下gettid() pthread_self() 兩個函數都獲得線程ID,但這2個ID有所不同gettid是內核中的線程的ID:POSIX thread ID可以在一個進程內唯一
2019-07-09 08:36:48
{ BAUD50, //POSIX ONLY BAUD75,// POSIX BAUD110, BAUD134,// 僅 POSIX BAUD150,// 僅POSIX BAUD200,// 僅POSIX
2022-01-11 06:19:07
。/* Signals.*/#define SIGHUP 1 /* Hangup (POSIX).*/#define SIGINT 2 /* Interrupt (ANSI).*/#define SIGQUIT3
2016-10-15 14:47:45
我既不是 ST 專家也不是 RTC 專家,無論如何。但我已經看到其他公司的幾個實現,我不得不說 RTC 作為計數器(提供與 posix 兼容時間戳接口的硬件,通常是 32 位秒 + 15 個小數位
2022-12-20 06:58:46
什么是POSIX無名信號量呢?怎樣去使用POSIX無名信號量呢?
2022-03-02 07:38:01
QNX是一個實時的、可擴充的操作系統;它部分遵循POSIX相關標準,如POSIX.1b 實時擴展;它提供了一個很小的微內核以及一些可選的配合進程。其內核僅提供4種服務:進程調度、進程間通信、底層
2011-06-07 14:16:29
import os#返回操作系統類型,值為posix,是linux操作系統,值為nt,是window操作系統
2019-07-23 07:00:48
我在ENV工具里配置上了flashDB,然后編譯就報出找不到dfs_posix.h。是不是這個依賴關系env沒有做好啊
2022-03-28 14:18:44
POSIX Threads簡稱Pthreads,POSIX是"Portable Operating System Interface"(可移植操作系統接口) 的縮寫,POSIX
2022-08-12 15:02:18
(winsock2) 以及本篇三篇文章的基礎工作才實現的。結束語因為有前一篇的工作,本次增加 lwip 支持的說明就一帶而過了。rt-thread 是支持 POSIX 的,如果直接使用 POSIX 接口
2022-09-05 16:43:01
使用studio添加了onenet的軟件包后報錯找不到dfs_posix.h文件,如何使用studio配置解決這個問題?
2023-02-14 10:42:35
ot-deamon 無法與 K32W 加密狗通信并給出以下錯誤[./build/posix/src/posix/ot-daemon[23634]:運行 OPENTHREAD
2023-03-14 07:41:57
也作為一個server與應用通信。應用的接口調用和主動上報監聽則主要通過消息隊列的機制傳遞。恰好,RT smart中的消息隊列另一位同學已經分享過了,講解的很詳細,基于POSIX的應用開發之消息隊列
2022-07-15 11:51:54
在移植wavplay過程中,發現文件讀取異常,獲取的WAV文件描述錯誤。wavplay中用到fopen、fread。在使用fread讀取文件時,會根據文件的大小出現異常;在文件很小時,讀出是正確的;在文件比較大時(超出一個scetor時),讀出是錯誤的。采用2b.wav測試文件6737036字節,7b.wav為2b.wav的前80個字節。如圖所示,我用2b.wav時,讀取wavheader_read時,我用7b.wav時,讀取wavheader_read時,配置如下:請問,這個問題要如何解決?剛剛寫了個讀寫測試函數,fread的前512個字節,是無法讀取到的,相當于往后偏移了512個字節。問題解決了,確認是BSP驅動的BUG。用的是華芯微特swm32的BSP,在swm_sdio_rxconfig中,使用2個塊,但是寫入BUF地址沒有實現塊的偏移,導致BUF只有1個塊的數據。
2023-02-13 13:57:27
目錄簡介TI-RTOSFreeRTOSPOSIX運行時對象查看器 (Runtime Object Viewer)TI-POSIX 介紹在源代碼中使用 POSIXTI-POSIX支持的函數摘要線程函數
2022-02-15 07:49:16
DFS_USING_POSIX#define DFS_USING_WORKDIR#define DFS_FILESYSTEMS_MAX 5#define DFS_FILESYSTEM_TYPES_MAX 4#define
2022-08-25 14:18:45
FINSH_ARG_MAX 10#define RT_USING_DFS#define DFS_USING_POSIX#define DFS_USING_WORKDIR#define
2023-02-08 10:37:13
給各位大佬倒茶,想求助下在開啟RT_USING_POSIX時,串口getc()函數到系統getchar()函數之間的調用路徑。小弟在調試大佬編寫的的web_terminal組件時發現如果開啟了
2022-11-14 14:17:02
有沒有哪位道友,成功的使用過agile_modbus協議棧的modbus_tcp啊,我看官方給的DEMO都是基于posix接口寫的,但是本人不太清除posix接口。有沒有哪位道友在RTThread內核的基礎之上移植成功的啊。請教一下
2022-11-09 14:27:04
看看有什么問題,然后發現困難重重,于是退而求其次,先測試 serialX 的 posix 接口。測試環境開發板: NK-980IOT V1.0 的開發板rt-thread 版本:4.1.1IDE:keil
2023-02-14 11:29:57
信號(signal)是一種軟件中斷,它提供了一種處理異步事件的方法,也是進程間惟一的異步通信方式。在Linux系統中,根據POSIX標準擴展以后的信號機制,不僅可以用來通知某種程序發生了什么事件,還可以給進程傳遞數據。
2019-07-25 07:14:44
各位好,請問下在開啟posix支持后finsh無法輸入,關閉posix后finsh正常。跟蹤代碼發現開啟posix支持后finsh_getchar()和不開啟走的分支不一樣。開啟posix走
2022-11-14 14:14:35
by RT-Thread teampthread_create successi'm thread1 and i will detach myself!posix thread 0posix thread
2022-09-01 14:25:39
vm虛擬機:通過軟件的方法模擬pc為什么不選擇雙系統?嵌入式開發與內核交互,會導致系統崩潰Linux介紹(posix、GPL、GUN)1991年 Linux0.1問世發布在GPL。GPL是一個開源
2021-12-15 07:03:15
什么是QNX操作系統
QNX是一個實時的、可擴充的操作系統;它部分遵循POSIX相關標準,如POSIX.1b 實時擴展;它提供了一個很小的微內核以及一些可
2009-06-17 00:35:164632 這是一個關于Posix線程編程的專欄。作者在闡明概念的基礎上,將向您詳細講述Posix線程庫API。本文是第一篇將向您講述線程的創建與取消。 相對進程而言,線程是一個更加接近于執行
2011-07-26 11:10:580 2015-10-19 14:00:0345 POSIX既然是可移植操作系統接口,那基于該接口的應用程序可移植性自然是很高的。基于POSIX接口設計的應用程序可以在不做修改或僅做極少量的修改就可以在支持POSIX的不同RTOS之間移植。如果
2017-11-14 08:45:565303 最初Unix IPC包括:管道、FIFO、信號;System V IPC包括:System V消息隊列、System V信號燈、System V共享內存區;Posix IPC包括:Posix消息隊列、Posix信號燈、Posix共享內存區。
2018-05-31 05:14:00457 of the portable operating system interface for Unix* (POSIX) file system behavior and burst buffers.
2018-10-26 06:10:001514 通過學習這本實用的參考書,你將理解有關線程的堅實基礎,并學會如何將這一強大的編程模型應用到實際工作中。
多線程編程的主要優勢在于通過利用多處理器的并行數字運算能力,或者通過在代碼中自動使用I/O并發功能,以達到同時執行多項任務的目的,即使是在單處理器機器上。結果是: 程序運行更快、響應速度更快、通常更容易維護。多線程編程尤其適用于網絡編程,可幫助削弱慢速網絡I/O帶來的瓶頸問題。
2018-11-26 08:00:000 內核級線程和進程是一樣的,前者與POSIX線程(pthread)有很大的區別。因此,內核的進程調度策略和系統調用也適用于內核級線程。
2019-04-23 14:58:255343 //獲得信號量sem的當前的值,放到sval中。如果有線程正在block這個信號量,sval可能返回兩個值,0或“-正在block的線程的數目”,Linux返回0//成功返回0,失敗返回-1設errno//Link with -pthread.int sem_getvalue(sem_t *sem, int *sval);
2019-05-16 17:39:24809 本文主要介紹Linux信號系統和如何使用POSIX API來響應信號。本文中的示例適用于Linux系統和大部分POSIX兼容系統。
2019-05-02 14:40:001277 模型#include //for fstat()#include //for fstat()#include #include #include shm_open() //創建/獲取共享內存fd ftruncate() //創建者調整文件大小 mmap() //映射fd到內存 munmap() //去映射fd shm_unlink() //刪除共享內存 shm_open//創建/獲取共享內存的文件描述符,成功返回文件描述符,失敗返回-1//Link with -lrt.int shm_open(const char *name, int oflag, mode_t mode);oflagAccess Mode:O_RDONLY以只讀的方式打開共享內存對象O_RDWR以讀寫的方式打開共享內存對象Opening-time flags(Bitwise Or):O_CREAT?表示創建共享內存對象,剛被創建的對象會被初始化為0byte可以使用ftuncate()調整大小O_EXCL用來確保共享內存對象被成功創建,如果對象已經存在,那么返回錯誤O_TRUNC表示如果共享內存對象已經存在那么把它清空mode: eg,0664 etcftruncate()//調整fd指向文件的大小,成功返回0,失敗返回-1設errno//VS truncate()int ftruncate(int fd, off_t length);如果原文件大小>指定大小,原文件中多余的部分會被截除int res=ftruncate(fd,3*sizeof(Emp));//要用sizeof,且是Emp(類型)不是emp(對象)if(-1==res) perror("ftruncate"),exit(-1);fstat()//獲取文件狀態,成功返回0,失敗返回-1設errno//VS stat()int lstat(const char *pathname, struct stat *buf);int fstat(int fd, struct stat *buf);buf:stat類型的指針struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ ?八進制 usigned int ?o% nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size, in bytes */ ?ld% blksize_t st_blksize; /* blocksize for filesystem I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ struct timespec st_atim; /* time of last access */ struct timespec st_mtim; /* time of last modification */ ?ld%,秒 struct timespec st_ctim; /* time of last status change */};//eg:st_mode=100664 //100是文件類型 //664是權限, 通過100664和0777BitwiseAND得到st_mtime=1462787968 //秒mmap()//映射文件或設備到進程的虛擬內存空間,映射成功后對相應的文件或設備操作就相當于對內存的操作//映射以頁為基本單位,文件大小, mmap的參數 len 都不能決定進程能訪問的大小, 而是容納文件被映射部分的最小頁面數決定傳統文件訪問//要求對文件進行可讀可寫的的打開!!!//成功返回映射區的指針,失敗返回-1設errno void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); //prot:protection, 權限addr:映射的起始地址, 如果為NULL則由kernel自行選擇->最合適的方法length:映射的區域長度prot:映射內存的保護權限PROT_EXEC表示映射的內存頁可執行PROT_READ表示映射的內存可被讀PROT_WRITE表示映射的內存可被寫PROT_NONE表示映射的內存不可訪問flagsmust include one of :MAP_SHARED表示共享這塊映射的內存,讀寫這塊內存相當于直接讀寫文件,這些操作對其他進程可見,由于OS對文件的讀寫都有緩存機制,所以實際上不會立即將更改寫入文件,除非帶哦用msync()或mumap()MAP_PRIVATE表示創建一個私有的copy-on-write的映射, 更新映射區對其他映射到這個文件的進程是不可見的can be Bitwise ORed:MAP_32BIT把映射區的頭2GB個字節映射到進程的地址空間,僅限域x86-64平臺的64位程序,在早期64位處理器平臺上,可以用來提高上下文切換的性能。當設置了MAP_FIXED時此選項自動被忽略MAP_ANONYMOUS映射不會備份到任何文件,fd和offset參數都被忽略,通常和MAP_SHARED連用MAP_DENYWRITEignored.MAP_EXECUTABLEignoredMAP_FILE用來保持兼容性,ignoredMAP_FIXED不要對addr參數進行處理確確實實的放在addr指向的地址,此時addr一定時頁大小的整數倍,MAP_GROWSDOWN用在棧中,告訴VMM映射區應該向低地址擴展MAP_HUGETLB?(since Linux 2.6.32)用于分配"大頁"fd: file decriptoroffset: 文件中的偏移量void* pv=mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,0,0);if(MAP_FAILED==pv) perror("mmap"),exit(-1);映射機制小解mmap()就是建立一個指針,這個指針指向頁高速緩存的一頁,并假設這個頁有我們想要訪問的文件內容(此時都在虛擬地址空間),當然,這個頁描述符會自動的加入的調用進程的頁表中。當我們第一次使用這個指針,去訪問這個虛擬地址的頁時,發現這個頁還沒有分配物理頁框,沒有想要的文件,引起缺頁中斷,系統會把相應的(fd)文件內容放到高速緩存的物理頁框(此時才會有對物理地址空間的讀寫)映射過程中使用的文件相當于藥引子,因為所有進程都是可以通過VFS訪問磁盤文件的,所以這個文件相當于對映射內存的一個標識,有了這個位于磁盤的藥引子,很多進程都可以根據它找到同一個物理頁框,進而實現內存的共享,并不是說就在磁盤上讀寫頁高速緩存的內容不會立即寫到磁盤中,會等幾秒,這種機制可以提高效率并保護磁盤只要內存夠大,頁高速緩存的內容就會一直存在內存中,以后再有進程對該緩存頁的內容訪問的需求,就不需要從磁盤中搜索,直接訪問緩存頁(把這個頁加入到進程的頁表)就行mmap()是系統調用,使用一次的開銷比較大,但比文件讀寫的read()/write()進行內核空間到用戶空間的數據復制要快,通常只有需要分配的內存>128KB(malloc一次分配33page就是128KB)的時候才會使用mmap()/shm是一個特殊的文件系統,它不對應磁盤中的區域,而是內存中,所以使用mmap()在這個文件系統中創/proc 不占用任何磁盤空間linux采用的是頁式管理機制。對于用mmap()映射普通文件來說,進程會在自己的地址空間新增一塊空間,空間大小由mmap()的len參數指定,注意,進程并不一定能夠對全部新增空間都能進行有效訪問。進程能夠訪問的有效地址大小取決于文件被映射部分的大小。簡單的說,能夠容納文件被映射部分大小的最少頁面個數決定了進程從mmap()返回的地址開始,能夠有效訪問的地址空間大小。超過這個空間大小,內核會根據超過的嚴重程度返回發送不同的信號給進程。經過內核!=在內核空間和用戶空間來回切換!=在內核空間和用戶空間傳遞復制的數據頁是內存映射的基本單位, 可以理解為實際分配給物理內存的基本單位, 但不是數據操作的基本單位;頁機制是操作系統和CPU約定好的一種方式,OS按照頁給CPU按頁發虛擬地址,CPU按頁解析并處理操作系統(包括Linux)大量使用的緩存的兩個原理:CPU訪問內存的速度遠遠大于訪問磁盤的速度(訪問速度差距不是一般的大,差好幾個數量級)數據一旦被訪問,就有可能在短期內再次被訪問(臨時局部原理)頁高速緩存(page cache)是個內存區域,是Linux 內核使用的主要磁盤高速緩存,在絕大多數情況下,內核在讀寫磁盤時都引用頁高速緩存,新頁被追加到頁高速緩存以滿足用戶態進程的讀請求,如果頁不在高速緩存中,新頁就被加到高速緩存中,然后就從磁盤讀出的數據填充它,如果內存有足夠的空閑空間,就讓該頁在高速緩存中長期保留,使其他進程再使用該頁時不再訪問磁盤, 即磁盤上的文件緩存到內存后,它的虛擬內存地址可以有多個,但是物理內存地址卻只能有一個我們要讀寫磁盤文件時,實質是對頁高速緩存進行讀寫,所以無論讀寫,都會首先檢查頁高速緩存有沒有這個文件對應的頁,如果有,就直接訪問,如果沒有,就引起缺頁中斷,給OS發信號,讓它把文件放到高速緩存再進行讀寫,這個過程不經過內核空間到用戶空間復制數據OS中的頁機制,對應到硬件中可不一定在主存中,也可以是高速緩存etc,但不會是磁盤,因為磁盤文件的地址和內存不一樣,不是按照32位編址的,而是按照ext2 etc方式編址的,需要使用文件管理系統,在Linux中使用VFS和實際文件管理系統來管理文件,所以對于Linux,有兩個方式使用系統資源:VMM,VFS,前者用來管理絕大部分的內存,后者用來管理所有的文件和部分特殊文件系統(eg:/shm是內存的一塊區域)page cache可以看作二者的橋梁,把磁盤文件放到高速緩存,就可以按照內存的使用方式使用磁盤的文件,使用完再釋放或寫回磁盤page cache中的頁可能是下面的類型:含有普通文件數據的頁含有目錄的頁含有直接從塊設備(跳過文件系統層)讀出的數據的頁含有用戶態進程數據的頁,但頁中的數據已經被交換到硬盤屬于他書文件系統文件的頁映射:一個線性區可以和磁盤文件系統的普通文件的某一部分或者塊設備文件相關聯,這就意味著內核把對區線性中頁內某個字節的訪問轉換成對文件中相應字節的操作TLB(Translation Lookaside Buffer)高速緩存用于加快線性地址的轉換,當一個線性地址第一次被使用時,通過慢速訪問RAM中的頁表計算出相應的物理地址,同時,物理地址被存放在TLB表項(TLB entry),以便以后對同一個線性地址的引用可以快速得到轉換在初始化階段,內核必須建立一個物理地址映射來指定哪些物理地址范圍對內核可用,哪些不可用swap(內存交換空間)的功能是應付物理內存不足的情況下所造成的內存擴展記錄的功能,CPU所讀取的數據都來自于內存,那當內存不足的時候,為了讓后續的程序可以順序運行,因此在內存中暫不使用的程序和數據就會被挪到swap中,此時內存就會空出來給需要執行的程序加載,由于swap是使用硬盤來暫時放置內存中的信息,所以用到swap時,主機硬盤燈就會開始閃個不同Q:CPU只能對內存進行讀寫,但又是怎么讀寫硬盤的呢???A:把數據寫入page cache,再經由。。。寫入磁盤(包括swap) --《鳥哥》P10內存本身沒有計算能力,尋址之類的都是CPU的事,只是為了簡便起見,我們通常畫成從內存地址A跳到內存地址BOS是軟件的核心,CPU是執行的核心前者給后者發指令我要干什么,CPU把他的指令變成現實二者必須很好的匹配計算機才能很好的工作Linux內核中與文件Cache操作相關的API有很多,按其使用方式可以分成兩類:一類是以拷貝方式操作的相關接口, 如read/write/sendfile等,其中sendfile在2.6系列的內核中已經不再支持;另一類是以地址映射方式操作的相關接口,如mmap等。第一種類型的API在不同文件的Cache之間或者Cache與應用程序所提供的用戶空間buffer之間拷貝數據,其實現原理如圖7所示。第二種類型的API將Cache項映射到用戶空間,使得應用程序可以像使用內存指針一樣訪問文件,Memory map訪問Cache的方式在內核中是采用請求頁面機制實現的,首先,應用程序調用mmap(),陷入到內核中后調用do_mmap_pgoff。該函數從應用程序的地址空間中分配一段區域作為映射的內存地址,并使用一個VMA(vm_area_struct)結構代表該區域,之后就返回到應用程。當應用程序訪問mmap所返回的地址指針時(圖中4),由于虛實映射尚未建立,會觸發缺頁中斷。之后系統會調用缺頁中斷處理函數,在缺頁中斷處理函數中,內核通過相應區域的VMA結構判斷出該區域屬于文件映射,于是調用具體文件系統的接口讀入相應的Page Cache項,并填寫相應的虛實映射表。經過這些步驟之后,應用程序就可以正常訪問相應的內存區域了。mumap()//接觸文件或設備對內存的映射,成功返回0,失敗返回-1設errnoint munmap(void *addr, size_t length);shm_unlink()//關閉進程打開的共享內存對象,成功返回0,失敗返回-1//Link with -lrt.int shm_unlink(const char *name);
2019-04-02 14:46:41194 POSIX mq VS Sys V mq的優勢更簡單的基于文件的應用接口完全支持消息優先級(優先級最終決動隊列中消息的位置)完全支持消息到達的異步通知,這通過信號或是線程創建實現用于阻塞
2019-04-02 14:46:43469 阻塞式I/O,即Blocking I/O。用戶發起一個recvfrom系統調用,內核會等待數據從網絡中到達。一旦數據準備就緒,系統內核將把自己的緩沖區中的數據拷貝到用戶進程的緩沖區。在系統內核等待數據、復制數據的過程中,用戶進程是不能做其他任何事情的,只能等待內核完成上述一系列的操作。
2019-04-27 18:19:002938 ls 命令可以列出一個 POSIX 系統上的文件。這是一個簡單的命令,但它經常被低估,不是它能做什么(因為它確實只做了一件事),而是你該如何優化對它的使用。
2019-08-11 10:55:223001 Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。
2019-11-06 11:42:06567 Linux:Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。
2019-11-06 14:03:291819 IT之家了解到,Wine (Wine Is Not an Emulator)是一個能夠在多種 POSIX-compliant 操作系統(包括 Linux,Mac OSX 及 BSD 等)上運行 Windows 應用的兼容層。
2020-03-14 09:33:112054 Linux很強大,它是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。
2020-04-13 08:58:58974 Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。
2020-05-21 09:17:335728 Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。
2020-05-27 09:37:215458 《多線程編程指南》介紹了 SolarisTM 操作系統 (Solaris Operating System, Solaris OS)中 POSIX?線程和 Solaris 線程的多線程編程接口
2020-06-11 08:00:004 ,是一個基于POSIX和Unix的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的Unix工具軟件、應用程序和網絡協議。它支持32位和64位硬件。Linux繼承了Unix以網絡為核心的設計思想,是一個性
2020-07-02 08:14:003537 DFS 的層次架構如下圖所示,主要分為 POSIX 接口層、虛擬文件系統層和設備抽象層。
2020-07-08 15:29:194393 上一章,講述了 SYSTEM V 信號量,主要運行于進程之間,本章主要介紹 POSIX 信號量:有名信號量、無名信號量。 POSIX 信號量 POSIX 信號量進程是 3 種 IPC
2020-10-29 17:34:14413 rt-smart內核即可包含基本功能,同時也可定制裁剪。rt-smart用戶態應用環境采用musl libc提供POSIX接口調用及C運行環境,延續 RT-Thread 原有的生態,使用scons
2020-11-29 10:31:392426 ,是指繼承UNIX的設計風格演變出來的系統。那什么是UNIX呢?UNIX操作系統(尤尼斯)是一個分時系統、多用戶、多任務操作系統。Linux是一個基于POSIX和UNIX的多用戶、多任務、支持多線...
2021-11-01 17:21:1211 目錄簡介TI-RTOSFreeRTOSPOSIX運行時對象查看器 (Runtime Object Viewer)TI-POSIX 介紹在源代碼中使用 POSIXTI-POSIX支持的函數摘要線程函數
2021-12-16 16:56:465 ,是一個基于POSIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的Unix工具軟件、應用程序和網絡協議。 Linux操作系統的特點 1、Linux系統是免費的自由軟件 2、良好的硬件平臺
2022-01-30 17:30:002794 可移植操作系統接口,POSIX 標準定義了操作系統(很多時候針對的是類 Unix 操作系統)應該為應用程序提供的接口標準,從而保證了應用程序在源碼層次的可移植性,如今主流的 Linux 系統都做
2022-04-27 10:22:121430 POSIX是什么?下圖進行簡單概述
2022-05-27 16:34:04675 POSIX如何定義各種功能?有哪些標準?
2022-05-27 16:42:19644 RT-Thread全球技術大會:POSIX標準定義、使用以及四種配置 ? ? ? ? ? 審核編輯:彭靜
2022-05-27 16:44:001226 可移植操作系統接口,POSIX標準定義了操作系統(很多時候針對的是類Unix操作系統)應該為應用程序提供的接口標準,從而保證了應用程序在源碼層次的可移植性。如今主流的Linux系統都做到了兼容POSIX標準。
2022-05-27 16:27:401635 對于部分C函數,編譯器配平層負責實現這些接口;由于RT-Thread需要維持多平臺可用,所以編譯器配平層的主要工作就是擬補各個編譯平臺的不足。
2022-05-27 16:46:371273 RT-Thread全球技術大會:RT-Thread對POSIX的實現情況介紹 ? ? ? ? ? ? 審核編輯:彭靜
2022-05-27 16:52:411511 在上午RT-Thread全球技術大會,RT-Thread開發者詳細介紹了POSIX FILE select的調用過程。如下圖:
2022-05-28 10:56:521267 exit code:代表一個進程的返回碼,通過系統調用 exit_group 來觸發。在 POSIX 中,0 代表正常的返回碼,而 1-255 代表異常返回碼,不過一般錯誤碼都是 1。
2022-08-02 09:55:36463 本文將為您介紹關于POSIX定時器的相關知識點。因為要使用絕對時間,存在系統時間被調節的可能性,指定時間段內下發通知等需求,排除了jiffies相關的定時器、依賴于系統運行時間的定時器、alarm
2022-12-14 09:15:05622 POSIX是歸屬于電氣與電子工程師協會(簡稱IEEE)的商標,是“uni-X便攜式操作系統接口”的簡稱,其目標是通過制定一套供操作系統供應商遵循的準則來簡化跨平臺軟件開發的任務。
2022-12-15 14:06:14288 近日,中興通訊旗下產品——車用微內核操作系統ZTE Automotive OS V3.0正式通過POSIX規范PSE52實時控制器1003.13-2003系統(PSE52 Realtime Controller 1003.13-2003 System)認證,成為國內首家獲得此認證的企業。
2022-12-15 14:06:29506 1974年,貝爾實驗室正式對外發布Unix。因為涉及到反壟斷等各種原因,加上早期的Unix不夠完善,于是貝爾實驗室以慷慨的條件向學校提供源代碼,所以Unix在大專院校里獲得了很多支持并得以持續發展。
2023-05-22 09:33:06491 isalnum()函數用于測試字符,如果字符是字母或數字,則返回非零值(即真),否則返回零(即假)。isalnum()函數在許多場景中非常有用,特別是在字符串處理中。
2023-09-27 11:42:40321 首先,啟用 DFS:”RT-Thread Components” -> “DFS: device virtual file system” 。進入子菜單,選擇
2023-10-13 10:30:32294 最近,留意到 MinIO 官方博客的一篇題為“在對象存儲上實現 POSIX 訪問接口是壞主意[1]”的文章,作者以 S3FS-FUSE 為例分享了通過 POSIX 方式訪問 MinIO 中的數據時碰到了性能方面的困難,性能遠不如直接訪問 MinIO。
2023-10-29 10:19:41334 一、POSIX信號量 1.阻塞隊列實現的生產消費模型代碼不足的地方(無法事前得知臨界資源的就緒狀態) 1.在先前我們的生產消費模型代碼中,一個線程如果想要操作臨界資源,也就是對臨界資源做修改的時候
2023-11-09 17:13:29254
評論
查看更多