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