使用 Musl C 庫的時(shí)候,內(nèi)核提供了基于 LOS_XXX 適配實(shí)現(xiàn) pthread、mqeue、fs、semaphore、time 等模塊的 posix 接口(//kernel/liteos_m
2024-02-18 15:41:09
195 
原生Swift編譯器是不支持生成Cortex-M機(jī)器指令的,但得益于LLVM框架的模塊化架構(gòu),僅需少許Hack即可為其添加一個(gè)現(xiàn)成的Cortex-M后端。
2019-10-07 10:27:00
2321 POSIX 接口Pthreads 簡介POSIX Threads 簡稱 Pthreads,POSIX 是 “Portable Operating SystemInterface”(可移植操作系統(tǒng)接口
2021-03-29 06:16:52
一.線程屬性線程具有屬性,用pthread_attr_t表示,在對(duì)該結(jié)構(gòu)進(jìn)行處理之前必須進(jìn)行初始化,在使用后需要對(duì)其去除初始化。我們用pthread_attr_init函數(shù)對(duì)其初始化,用pthread_attr_destroy對(duì)其去除初始化。1.名稱:pthread_attr_init/pthread_attr_destroy功能:對(duì)線程屬性初始化/去除初始化頭文件:#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)實(shí)現(xiàn)支持的線程所有屬性的默認(rèn)值。 如果要去除對(duì)pthread_attr_t結(jié)構(gòu)的初始化,可以調(diào)用pthread_attr_destroy函數(shù)。如果pthread_attr_init實(shí)現(xiàn)時(shí)為屬性對(duì)象分配了動(dòng)態(tài)內(nèi)存空間,pthread_attr_destroy還會(huì)用無效的值初始化屬性對(duì)象,因此如果經(jīng)pthread_attr_destroy去除初始化之后的pthread_attr_t結(jié)構(gòu)被pthread_create函數(shù)調(diào)用,將會(huì)導(dǎo)致其返回錯(cuò)誤。 線程屬性結(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;每個(gè)個(gè)屬性都對(duì)應(yīng)一些函數(shù)對(duì)其查看或修改。下面我們分別介紹。二、線程的分離狀態(tài) 線程的分離狀態(tài)決定一個(gè)線程以什么樣的方式來終止自己。在默認(rèn)情況下線程是非分離狀態(tài)的,這種情況下,原有的線程等待創(chuàng)建的線程結(jié)束。只有當(dāng)pthread_join()函數(shù)返回時(shí),創(chuàng)建的線程才算終止,才能釋放自己占用的系統(tǒng)資源。 而分離線程不是這樣子的,它沒有被其他的線程所等待,自己運(yùn)行結(jié)束了,線程也就終止了,馬上釋放系統(tǒng)資源。程序員應(yīng)該根據(jù)自己的需要,選擇適當(dāng)?shù)姆蛛x狀態(tài)。所以如果我們?cè)趧?chuàng)建線程時(shí)就知道不需要了解線程的終止?fàn)顟B(tài),則可以pthread_attr_t結(jié)構(gòu)中的detachstate線程屬性,讓線程以分離狀態(tài)啟動(dòng)。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è)置為下面的兩個(gè)合法值之一:設(shè)置為PTHREAD_CREATE_DETACHED,以分離狀態(tài)啟動(dòng)線程;或者設(shè)置為PTHREAD_CREATE_JOINABLE,正常啟動(dòng)線程??梢允褂胮thread_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è)置和得到線程的繼承性,這兩個(gè)函數(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。 這兩個(gè)函數(shù)具有兩個(gè)參數(shù),第1個(gè)是指向?qū)傩詫?duì)象的指針,第2個(gè)是繼承性或指向繼承性的指針。繼承性決定調(diào)度的參數(shù)是從創(chuàng)建的進(jìn)程中繼承還是使用在schedpolicy和schedparam屬性中顯式設(shè)置的調(diào)度信息。Pthreads不為inheritsched指定默認(rèn)值,因此如果你關(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è)置一個(gè)線程的調(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。這兩個(gè)函數(shù)具有兩個(gè)參數(shù),第1個(gè)參數(shù)是指向?qū)傩詫?duì)象的指針,第2個(gè)參數(shù)是調(diào)度策略或指向調(diào)度策略的指針。調(diào)度策略可能的值是先進(jìn)先出(SCHED_FIFO)、輪轉(zhuǎn)法(SCHED_RR),或其它(SCHED_OTHER)。(1) SCHED_FIFO策略允許一個(gè)線程運(yùn)行直到有更高優(yōu)先級(jí)的線程準(zhǔn)備好,或者直到它自愿阻塞自己。在SCHED_FIFO調(diào)度策略下,當(dāng)有一個(gè)線程準(zhǔn)備好時(shí),除非有平等或更高優(yōu)先級(jí)的線程已經(jīng)在運(yùn)行,否則它會(huì)很快開始執(zhí)行。(2) SCHED_RR(輪循)策略是基本相同的,不同之處在于:如果有一個(gè)SCHED_RR策略的線程執(zhí)行了超過一個(gè)固定的時(shí)期(時(shí)間片間隔)沒有阻塞,而另外的SCHED_RR或SCHBD_FIPO策略的相同優(yōu)先級(jí)的線程準(zhǔn)備好時(shí),運(yùn)行的線程將被搶占以便準(zhǔn)備好的線程可以執(zhí)行。 當(dāng)有SCHED_FIFO或SCHED_RR策賂的線程在一個(gè)條件變量上等持或等持加鎖同一個(gè)互斥量時(shí),它們將以優(yōu)先級(jí)順序被喚醒。即,如果一個(gè)低優(yōu)先級(jí)的SCHED_FIFO線程和一個(gè)高優(yōu)先織的SCHED_FIFO線程都在等待鎖相同的互斥且,則當(dāng)互斥量被解鎖時(shí),高優(yōu)先級(jí)線程將總是被首先解除阻塞。五、線程的調(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。 這兩個(gè)函數(shù)具有兩個(gè)參數(shù),第1個(gè)參數(shù)是指向?qū)傩詫?duì)象的指針,第2個(gè)參數(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控制一個(gè)優(yōu)先權(quán)值,大的優(yōu)先權(quán)值對(duì)應(yīng)高的優(yōu)先權(quán)。系統(tǒng)支持的最大和最小優(yōu)先權(quán)值可以用 sched_get_priority_max函數(shù)和sched_get_priority_min函數(shù)分別得到。注意:如果不是編寫實(shí)時(shí)程序,不建議修改線程的優(yōu)先級(jí)。因?yàn)椋{(diào)度策略是一件非常復(fù)雜的事情,如果不正確使用會(huì)導(dǎo)致程序錯(cuò)誤,從而導(dǎo)致死鎖等問題。如:在多線程應(yīng)用程序中為線程設(shè)置不同的優(yōu)先級(jí)別,有可能因?yàn)楣蚕碣Y源而導(dǎo)致優(yōu)先級(jí)倒置。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。 下面是上面幾個(gè)函數(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è)置和得到線程的作用域,這兩個(gè)函數(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。 這兩個(gè)函數(shù)具有兩個(gè)參數(shù),第1個(gè)是指向?qū)傩詫?duì)象的指針,第2個(gè)是作用域或指向作用域的指針,作用域控制線程是否在進(jìn)程內(nèi)或在系統(tǒng)級(jí)上競爭資源,可能的值是PTHREAD_SCOPE_PROCESS(進(jìn)程內(nèi)競爭資源),PTHREAD_SCOPE_SYSTEM.(系統(tǒng)級(jí)上競爭資源)。七、線程堆棧的大小 函數(shù)pthread_attr_setstacksize和pthread_attr_getstacksize分別用來設(shè)置和得到線程堆棧的大小,這兩個(gè)函數(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。 這兩個(gè)參數(shù)具有兩個(gè)參數(shù),第1個(gè)是指向?qū)傩詫?duì)象的指針,第2個(gè)是堆棧大小或指向堆棧大小的指針.如果希望改變棧的默認(rèn)大小,但又不想自己處理線程棧的分配問題,這時(shí)使用pthread_attr_setstacksize函數(shù)就非常有用。八、線程堆棧的地址函數(shù)pthread_attr_setstackaddr和pthread_attr_getstackaddr分別用來設(shè)置和得到線程堆棧的位置,這兩個(gè)函數(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。這兩個(gè)函數(shù)具有兩個(gè)參數(shù),第1個(gè)是指向?qū)傩詫?duì)象的指針,第2個(gè)是堆棧地址或指向堆棧地址的指針。九、線程棧末尾的警戒緩沖區(qū)大小函數(shù)pthread_attr_getguardsize和pthread_attr_setguardsize分別用來設(shè)置和得到線程棧末尾的警戒緩沖區(qū)大小,這兩個(gè)函數(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控制著線程棧末尾之后以避免棧溢出的擴(kuò)展內(nèi)存大小。這個(gè)屬性默認(rèn)設(shè)置為PAGESIZE個(gè)字節(jié)??梢园裧uardsize線程屬性設(shè)為0,從而不允許屬性的這種特征行為發(fā)生:在這種情況下不會(huì)提供警戒緩存區(qū)。同樣地,如果對(duì)線程屬性stackaddr作了修改,系統(tǒng)就會(huì)假設(shè)我們會(huì)自己管理?xiàng)#⑹咕錀>彌_區(qū)機(jī)制無效,等同于把guardsize線程屬性設(shè)為0。
2013-09-29 11:00:50
一.線程屬性線程具有屬性,用pthread_attr_t表示,在對(duì)該結(jié)構(gòu)進(jìn)行處理之前必須進(jìn)行初始化,在使用后需要對(duì)其去除初始化。我們用pthread_attr_init函數(shù)對(duì)其初始化,用pthread_attr_destroy對(duì)其去除初始化。1.名稱:pthread_attr_init/pthread_attr_destroy功能:對(duì)線程屬性初始化/去除初始化頭文件:#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)實(shí)現(xiàn)支持的線程所有屬性的默認(rèn)值。 如果要去除對(duì)pthread_attr_t結(jié)構(gòu)的初始化,可以調(diào)用pthread_attr_destroy函數(shù)。如果pthread_attr_init實(shí)現(xiàn)時(shí)為屬性對(duì)象分配了動(dòng)態(tài)內(nèi)存空間,pthread_attr_destroy還會(huì)用無效的值初始化屬性對(duì)象,因此如果經(jīng)pthread_attr_destroy去除初始化之后的pthread_attr_t結(jié)構(gòu)被pthread_create函數(shù)調(diào)用,將會(huì)導(dǎo)致其返回錯(cuò)誤。 線程屬性結(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;每個(gè)個(gè)屬性都對(duì)應(yīng)一些函數(shù)對(duì)其查看或修改。下面我們分別介紹。二、線程的分離狀態(tài) 線程的分離狀態(tài)決定一個(gè)線程以什么樣的方式來終止自己。在默認(rèn)情況下線程是非分離狀態(tài)的,這種情況下,原有的線程等待創(chuàng)建的線程結(jié)束。只有當(dāng)pthread_join()函數(shù)返回時(shí),創(chuàng)建的線程才算終止,才能釋放自己占用的系統(tǒng)資源。 而分離線程不是這樣子的,它沒有被其他的線程所等待,自己運(yùn)行結(jié)束了,線程也就終止了,馬上釋放系統(tǒng)資源。程序員應(yīng)該根據(jù)自己的需要,選擇適當(dāng)?shù)姆蛛x狀態(tài)。所以如果我們?cè)趧?chuàng)建線程時(shí)就知道不需要了解線程的終止?fàn)顟B(tài),則可以pthread_attr_t結(jié)構(gòu)中的detachstate線程屬性,讓線程以分離狀態(tài)啟動(dòng)。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è)置為下面的兩個(gè)合法值之一:設(shè)置為PTHREAD_CREATE_DETACHED,以分離狀態(tài)啟動(dòng)線程;或者設(shè)置為PTHREAD_CREATE_JOINABLE,正常啟動(dòng)線程??梢允褂胮thread_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è)置和得到線程的繼承性,這兩個(gè)函數(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。 這兩個(gè)函數(shù)具有兩個(gè)參數(shù),第1個(gè)是指向?qū)傩詫?duì)象的指針,第2個(gè)是繼承性或指向繼承性的指針。繼承性決定調(diào)度的參數(shù)是從創(chuàng)建的進(jìn)程中繼承還是使用在schedpolicy和schedparam屬性中顯式設(shè)置的調(diào)度信息。Pthreads不為inheritsched指定默認(rèn)值,因此如果你關(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è)置一個(gè)線程的調(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。這兩個(gè)函數(shù)具有兩個(gè)參數(shù),第1個(gè)參數(shù)是指向?qū)傩詫?duì)象的指針,第2個(gè)參數(shù)是調(diào)度策略或指向調(diào)度策略的指針。調(diào)度策略可能的值是先進(jìn)先出(SCHED_FIFO)、輪轉(zhuǎn)法(SCHED_RR),或其它(SCHED_OTHER)。(1) SCHED_FIFO策略允許一個(gè)線程運(yùn)行直到有更高優(yōu)先級(jí)的線程準(zhǔn)備好,或者直到它自愿阻塞自己。在SCHED_FIFO調(diào)度策略下,當(dāng)有一個(gè)線程準(zhǔn)備好時(shí),除非有平等或更高優(yōu)先級(jí)的線程已經(jīng)在運(yùn)行,否則它會(huì)很快開始執(zhí)行。(2) SCHED_RR(輪循)策略是基本相同的,不同之處在于:如果有一個(gè)SCHED_RR策略的線程執(zhí)行了超過一個(gè)固定的時(shí)期(時(shí)間片間隔)沒有阻塞,而另外的SCHED_RR或SCHBD_FIPO策略的相同優(yōu)先級(jí)的線程準(zhǔn)備好時(shí),運(yùn)行的線程將被搶占以便準(zhǔn)備好的線程可以執(zhí)行。 當(dāng)有SCHED_FIFO或SCHED_RR策賂的線程在一個(gè)條件變量上等持或等持加鎖同一個(gè)互斥量時(shí),它們將以優(yōu)先級(jí)順序被喚醒。即,如果一個(gè)低優(yōu)先級(jí)的SCHED_FIFO線程和一個(gè)高優(yōu)先織的SCHED_FIFO線程都在等待鎖相同的互斥且,則當(dāng)互斥量被解鎖時(shí),高優(yōu)先級(jí)線程將總是被首先解除阻塞。五、線程的調(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。 這兩個(gè)函數(shù)具有兩個(gè)參數(shù),第1個(gè)參數(shù)是指向?qū)傩詫?duì)象的指針,第2個(gè)參數(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控制一個(gè)優(yōu)先權(quán)值,大的優(yōu)先權(quán)值對(duì)應(yīng)高的優(yōu)先權(quán)。系統(tǒng)支持的最大和最小優(yōu)先權(quán)值可以用 sched_get_priority_max函數(shù)和sched_get_priority_min函數(shù)分別得到。注意:如果不是編寫實(shí)時(shí)程序,不建議修改線程的優(yōu)先級(jí)。因?yàn)?,調(diào)度策略是一件非常復(fù)雜的事情,如果不正確使用會(huì)導(dǎo)致程序錯(cuò)誤,從而導(dǎo)致死鎖等問題。如:在多線程應(yīng)用程序中為線程設(shè)置不同的優(yōu)先級(jí)別,有可能因?yàn)楣蚕碣Y源而導(dǎo)致優(yōu)先級(jí)倒置。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。 下面是上面幾個(gè)函數(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è)置和得到線程的作用域,這兩個(gè)函數(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。 這兩個(gè)函數(shù)具有兩個(gè)參數(shù),第1個(gè)是指向?qū)傩詫?duì)象的指針,第2個(gè)是作用域或指向作用域的指針,作用域控制線程是否在進(jìn)程內(nèi)或在系統(tǒng)級(jí)上競爭資源,可能的值是PTHREAD_SCOPE_PROCESS(進(jìn)程內(nèi)競爭資源),PTHREAD_SCOPE_SYSTEM.(系統(tǒng)級(jí)上競爭資源)。七、線程堆棧的大小 函數(shù)pthread_attr_setstacksize和pthread_attr_getstacksize分別用來設(shè)置和得到線程堆棧的大小,這兩個(gè)函數(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。 這兩個(gè)參數(shù)具有兩個(gè)參數(shù),第1個(gè)是指向?qū)傩詫?duì)象的指針,第2個(gè)是堆棧大小或指向堆棧大小的指針.如果希望改變棧的默認(rèn)大小,但又不想自己處理線程棧的分配問題,這時(shí)使用pthread_attr_setstacksize函數(shù)就非常有用。八、線程堆棧的地址函數(shù)pthread_attr_setstackaddr和pthread_attr_getstackaddr分別用來設(shè)置和得到線程堆棧的位置,這兩個(gè)函數(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。這兩個(gè)函數(shù)具有兩個(gè)參數(shù),第1個(gè)是指向?qū)傩詫?duì)象的指針,第2個(gè)是堆棧地址或指向堆棧地址的指針。九、線程棧末尾的警戒緩沖區(qū)大小函數(shù)pthread_attr_getguardsize和pthread_attr_setguardsize分別用來設(shè)置和得到線程棧末尾的警戒緩沖區(qū)大小,這兩個(gè)函數(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控制著線程棧末尾之后以避免棧溢出的擴(kuò)展內(nèi)存大小。這個(gè)屬性默認(rèn)設(shè)置為PAGESIZE個(gè)字節(jié)。可以把guardsize線程屬性設(shè)為0,從而不允許屬性的這種特征行為發(fā)生:在這種情況下不會(huì)提供警戒緩存區(qū)。同樣地,如果對(duì)線程屬性stackaddr作了修改,系統(tǒng)就會(huì)假設(shè)我們會(huì)自己管理?xiàng)?,并使警戒棧緩沖區(qū)機(jī)制無效,等同于把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ū)動(dòng)框架HDF,統(tǒng)一驅(qū)動(dòng)標(biāo)準(zhǔn),為設(shè)備廠商提供了更統(tǒng)一的接入方式,使驅(qū)動(dòng)更加容易移植,力求做到一次開發(fā),多系統(tǒng)部署。支持1200+標(biāo)準(zhǔn)POSIX接口
2022-05-10 10:52:01
本文將為您介紹關(guān)于POSIX定時(shí)器的相關(guān)知識(shí)點(diǎn)。因?yàn)橐褂媒^對(duì)時(shí)間,存在系統(tǒng)時(shí)間被調(diào)節(jié)的可能性,指定時(shí)間段內(nèi)下發(fā)通知等需求,排除了jiffies相關(guān)的定時(shí)器、依賴于系統(tǒng)運(yùn)行時(shí)間的定時(shí)器、alarm
2022-12-12 14:59:29
:
第一:Linux擁有超過30億用戶,是很受歡迎的操作系統(tǒng)之一。此外,在要求苛刻的嵌入式系統(tǒng)行業(yè)中,嵌入式Linux約占嵌入式設(shè)計(jì)的70%。
第二:便攜式操作系統(tǒng)接口(POSIX)起源于20世紀(jì)
2023-05-18 13:59:26
報(bào)錯(cuò)信息如下圖:dfs_posix.c128 first defined here錯(cuò)誤信息定位到了這里,因?yàn)樵谄渌姹旧弦呀?jīng)成功掛載DFS,所以操作基本一樣。但是這個(gè)錯(cuò)誤不知道為什么。
2023-01-11 14:21:58
4.10的內(nèi)核,使用posix,使能文件系統(tǒng),使用fd_set定義變量報(bào)錯(cuò),顯示error: unknown type name 'fd_set',隨后定位錯(cuò)誤發(fā)現(xiàn)有三個(gè)文件夾的select.h文件
2022-11-03 11:01:03
rt_pipe_xxx , 也對(duì)接了 posix 接口。二. 怎么使用管道在使用之前先看一下 pipe 的結(jié)構(gòu)體通過上面的結(jié)構(gòu)體可以先嘗試分析以下管道的實(shí)現(xiàn)原理:is_named :確定是匿名管道,還是實(shí)名
2022-04-14 14:57:20
RTThread中POSIX兼容層里自旋鎖的加鎖實(shí)現(xiàn)好像不太對(duì)。如代碼所示: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) 對(duì)‘posix_madvise’未定義的引用 的錯(cuò)誤...
2021-12-27 07:53:39
使用Linux系統(tǒng)提供的機(jī)制來對(duì)線程訪問資源的順序進(jìn)行同步,本文檔挑選了信號(hào)量,互斥鎖,條件變量來介紹線程同步機(jī)制,實(shí)驗(yàn)代碼在sync/目錄下。1 POSIX無名信號(hào)量本章介紹POSIX 無名信號(hào)量,以下簡稱
2021-04-02 14:04:09
linux多線程環(huán)境下gettid() pthread_self() 兩個(gè)函數(shù)都獲得線程ID,但這2個(gè)ID有所不同gettid是內(nèi)核中的線程的ID:POSIX thread ID可以在一個(gè)進(jìn)程內(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)看到其他公司的幾個(gè)實(shí)現(xiàn),我不得不說 RTC 作為計(jì)數(shù)器(提供與 posix 兼容時(shí)間戳接口的硬件,通常是 32 位秒 + 15 個(gè)小數(shù)位
2022-12-20 06:58:46
什么是POSIX無名信號(hào)量呢?怎樣去使用POSIX無名信號(hào)量呢?
2022-03-02 07:38:01
QNX是一個(gè)實(shí)時(shí)的、可擴(kuò)充的操作系統(tǒng);它部分遵循POSIX相關(guān)標(biāo)準(zhǔn),如POSIX.1b 實(shí)時(shí)擴(kuò)展;它提供了一個(gè)很小的微內(nèi)核以及一些可選的配合進(jìn)程。其內(nèi)核僅提供4種服務(wù):進(jìn)程調(diào)度、進(jìn)程間通信、底層
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,然后編譯就報(bào)出找不到dfs_posix.h。是不是這個(gè)依賴關(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ǔ)工作才實(shí)現(xiàn)的。結(jié)束語因?yàn)橛星耙黄墓ぷ?,本次增?lwip 支持的說明就一帶而過了。rt-thread 是支持 POSIX 的,如果直接使用 POSIX 接口
2022-09-05 16:43:01
使用studio添加了onenet的軟件包后報(bào)錯(cuò)找不到dfs_posix.h文件,如何使用studio配置解決這個(gè)問題?
2023-02-14 10:42:35
ot-deamon 無法與 K32W 加密狗通信并給出以下錯(cuò)誤[./build/posix/src/posix/ot-daemon[23634]:運(yùn)行 OPENTHREAD
2023-03-14 07:41:57
也作為一個(gè)server與應(yīng)用通信。應(yīng)用的接口調(diào)用和主動(dòng)上報(bào)監(jiān)聽則主要通過消息隊(duì)列的機(jī)制傳遞。恰好,RT smart中的消息隊(duì)列另一位同學(xué)已經(jīng)分享過了,講解的很詳細(xì),基于POSIX的應(yīng)用開發(fā)之消息隊(duì)列
2022-07-15 11:51:54
在移植wavplay過程中,發(fā)現(xiàn)文件讀取異常,獲取的WAV文件描述錯(cuò)誤。wavplay中用到fopen、fread。在使用fread讀取文件時(shí),會(huì)根據(jù)文件的大小出現(xiàn)異常;在文件很小時(shí),讀出是正確的;在文件比較大時(shí)(超出一個(gè)scetor時(shí)),讀出是錯(cuò)誤的。采用2b.wav測試文件6737036字節(jié),7b.wav為2b.wav的前80個(gè)字節(jié)。如圖所示,我用2b.wav時(shí),讀取wavheader_read時(shí),我用7b.wav時(shí),讀取wavheader_read時(shí),配置如下:請(qǐng)問,這個(gè)問題要如何解決?剛剛寫了個(gè)讀寫測試函數(shù),fread的前512個(gè)字節(jié),是無法讀取到的,相當(dāng)于往后偏移了512個(gè)字節(jié)。問題解決了,確認(rèn)是BSP驅(qū)動(dòng)的BUG。用的是華芯微特swm32的BSP,在swm_sdio_rxconfig中,使用2個(gè)塊,但是寫入BUF地址沒有實(shí)現(xiàn)塊的偏移,導(dǎo)致BUF只有1個(gè)塊的數(shù)據(jù)。
2023-02-13 13:57:27
目錄簡介TI-RTOSFreeRTOSPOSIX運(yùn)行時(shí)對(duì)象查看器 (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時(shí),串口getc()函數(shù)到系統(tǒng)getchar()函數(shù)之間的調(diào)用路徑。小弟在調(diào)試大佬編寫的的web_terminal組件時(shí)發(fā)現(xiàn)如果開啟了
2022-11-14 14:17:02
有沒有哪位道友,成功的使用過agile_modbus協(xié)議棧的modbus_tcp啊,我看官方給的DEMO都是基于posix接口寫的,但是本人不太清除posix接口。有沒有哪位道友在RTThread內(nèi)核的基礎(chǔ)之上移植成功的啊。請(qǐng)教一下
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
信號(hào)(signal)是一種軟件中斷,它提供了一種處理異步事件的方法,也是進(jìn)程間惟一的異步通信方式。在Linux系統(tǒng)中,根據(jù)POSIX標(biāo)準(zhǔn)擴(kuò)展以后的信號(hào)機(jī)制,不僅可以用來通知某種程序發(fā)生了什么事件,還可以給進(jìn)程傳遞數(shù)據(jù)。
2019-07-25 07:14:44
各位好,請(qǐng)問下在開啟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虛擬機(jī):通過軟件的方法模擬pc為什么不選擇雙系統(tǒng)?嵌入式開發(fā)與內(nèi)核交互,會(huì)導(dǎo)致系統(tǒng)崩潰Linux介紹(posix、GPL、GUN)1991年 Linux0.1問世發(fā)布在GPL。GPL是一個(gè)開源
2021-12-15 07:03:15
什么是QNX操作系統(tǒng)
QNX是一個(gè)實(shí)時(shí)的、可擴(kuò)充的操作系統(tǒng);它部分遵循POSIX相關(guān)標(biāo)準(zhǔn),如POSIX.1b 實(shí)時(shí)擴(kuò)展;它提供了一個(gè)很小的微內(nèi)核以及一些可
2009-06-17 00:35:16
4632 這是一個(gè)關(guān)于Posix線程編程的專欄。作者在闡明概念的基礎(chǔ)上,將向您詳細(xì)講述Posix線程庫API。本文是第一篇將向您講述線程的創(chuàng)建與取消。 相對(duì)進(jìn)程而言,線程是一個(gè)更加接近于執(zhí)行
2011-07-26 11:10:58
0 2015-10-19 14:00:03
45 POSIX既然是可移植操作系統(tǒng)接口,那基于該接口的應(yīng)用程序可移植性自然是很高的?;?b class="flag-6" style="color: red">POSIX接口設(shè)計(jì)的應(yīng)用程序可以在不做修改或僅做極少量的修改就可以在支持POSIX的不同RTOS之間移植。如果
2017-11-14 08:45:56
5303 最初Unix IPC包括:管道、FIFO、信號(hào);System V IPC包括:System V消息隊(duì)列、System V信號(hào)燈、System V共享內(nèi)存區(qū);Posix IPC包括:Posix消息隊(duì)列、Posix信號(hào)燈、Posix共享內(nèi)存區(qū)。
2018-05-31 05:14:00
457 of the portable operating system interface for Unix* (POSIX) file system behavior and burst buffers.
2018-10-26 06:10:00
1514 通過學(xué)習(xí)這本實(shí)用的參考書,你將理解有關(guān)線程的堅(jiān)實(shí)基礎(chǔ),并學(xué)會(huì)如何將這一強(qiáng)大的編程模型應(yīng)用到實(shí)際工作中。
多線程編程的主要優(yōu)勢在于通過利用多處理器的并行數(shù)字運(yùn)算能力,或者通過在代碼中自動(dòng)使用I/O并發(fā)功能,以達(dá)到同時(shí)執(zhí)行多項(xiàng)任務(wù)的目的,即使是在單處理器機(jī)器上。結(jié)果是: 程序運(yùn)行更快、響應(yīng)速度更快、通常更容易維護(hù)。多線程編程尤其適用于網(wǎng)絡(luò)編程,可幫助削弱慢速網(wǎng)絡(luò)I/O帶來的瓶頸問題。
2018-11-26 08:00:00
0 內(nèi)核級(jí)線程和進(jìn)程是一樣的,前者與POSIX線程(pthread)有很大的區(qū)別。因此,內(nèi)核的進(jìn)程調(diào)度策略和系統(tǒng)調(diào)用也適用于內(nèi)核級(jí)線程。
2019-04-23 14:58:25
5343 
//獲得信號(hào)量sem的當(dāng)前的值,放到sval中。如果有線程正在block這個(gè)信號(hào)量,sval可能返回兩個(gè)值,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:24
809 本文主要介紹Linux信號(hào)系統(tǒng)和如何使用POSIX API來響應(yīng)信號(hào)。本文中的示例適用于Linux系統(tǒng)和大部分POSIX兼容系統(tǒng)。
2019-05-02 14:40:00
1277 模型#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)存對(duì)象O_RDWR以讀寫的方式打開共享內(nèi)存對(duì)象Opening-time flags(Bitwise Or):O_CREAT?表示創(chuàng)建共享內(nèi)存對(duì)象,剛被創(chuàng)建的對(duì)象會(huì)被初始化為0byte可以使用ftuncate()調(diào)整大小O_EXCL用來確保共享內(nèi)存對(duì)象被成功創(chuàng)建,如果對(duì)象已經(jīng)存在,那么返回錯(cuò)誤O_TRUNC表示如果共享內(nèi)存對(duì)象已經(jīng)存在那么把它清空mode: eg,0664 etcftruncate()//調(diào)整fd指向文件的大小,成功返回0,失敗返回-1設(shè)errno//VS truncate()int ftruncate(int fd, off_t length);如果原文件大小>指定大小,原文件中多余的部分會(huì)被截除int res=ftruncate(fd,3*sizeof(Emp));//要用sizeof,且是Emp(類型)不是emp(對(duì)象)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 */ ?八進(jìn)制 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è)備到進(jìn)程的虛擬內(nèi)存空間,映射成功后對(duì)相應(yīng)的文件或設(shè)備操作就相當(dāng)于對(duì)內(nèi)存的操作//映射以頁為基本單位,文件大小, mmap的參數(shù) len 都不能決定進(jìn)程能訪問的大小, 而是容納文件被映射部分的最小頁面數(shù)決定傳統(tǒng)文件訪問//要求對(duì)文件進(jìn)行可讀可寫的的打開!!!//成功返回映射區(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)存的保護(hù)權(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)于直接讀寫文件,這些操作對(duì)其他進(jìn)程可見,由于OS對(duì)文件的讀寫都有緩存機(jī)制,所以實(shí)際上不會(huì)立即將更改寫入文件,除非帶哦用msync()或mumap()MAP_PRIVATE表示創(chuàng)建一個(gè)私有的copy-on-write的映射, 更新映射區(qū)對(duì)其他映射到這個(gè)文件的進(jìn)程是不可見的can be Bitwise ORed:MAP_32BIT把映射區(qū)的頭2GB個(gè)字節(jié)映射到進(jìn)程的地址空間,僅限域x86-64平臺(tái)的64位程序,在早期64位處理器平臺(tái)上,可以用來提高上下文切換的性能。當(dāng)設(shè)置了MAP_FIXED時(shí)此選項(xiàng)自動(dòng)被忽略MAP_ANONYMOUS映射不會(huì)備份到任何文件,fd和offset參數(shù)都被忽略,通常和MAP_SHARED連用MAP_DENYWRITEignored.MAP_EXECUTABLEignoredMAP_FILE用來保持兼容性,ignoredMAP_FIXED不要對(duì)addr參數(shù)進(jìn)行處理確確實(shí)實(shí)的放在addr指向的地址,此時(shí)addr一定時(shí)頁大小的整數(shù)倍,MAP_GROWSDOWN用在棧中,告訴VMM映射區(qū)應(yīng)該向低地址擴(kuò)展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);映射機(jī)制小解mmap()就是建立一個(gè)指針,這個(gè)指針指向頁高速緩存的一頁,并假設(shè)這個(gè)頁有我們想要訪問的文件內(nèi)容(此時(shí)都在虛擬地址空間),當(dāng)然,這個(gè)頁描述符會(huì)自動(dòng)的加入的調(diào)用進(jìn)程的頁表中。當(dāng)我們第一次使用這個(gè)指針,去訪問這個(gè)虛擬地址的頁時(shí),發(fā)現(xiàn)這個(gè)頁還沒有分配物理頁框,沒有想要的文件,引起缺頁中斷,系統(tǒng)會(huì)把相應(yīng)的(fd)文件內(nèi)容放到高速緩存的物理頁框(此時(shí)才會(huì)有對(duì)物理地址空間的讀寫)映射過程中使用的文件相當(dāng)于藥引子,因?yàn)樗羞M(jìn)程都是可以通過VFS訪問磁盤文件的,所以這個(gè)文件相當(dāng)于對(duì)映射內(nèi)存的一個(gè)標(biāo)識(shí),有了這個(gè)位于磁盤的藥引子,很多進(jìn)程都可以根據(jù)它找到同一個(gè)物理頁框,進(jìn)而實(shí)現(xiàn)內(nèi)存的共享,并不是說就在磁盤上讀寫頁高速緩存的內(nèi)容不會(huì)立即寫到磁盤中,會(huì)等幾秒,這種機(jī)制可以提高效率并保護(hù)磁盤只要內(nèi)存夠大,頁高速緩存的內(nèi)容就會(huì)一直存在內(nèi)存中,以后再有進(jìn)程對(duì)該緩存頁的內(nèi)容訪問的需求,就不需要從磁盤中搜索,直接訪問緩存頁(把這個(gè)頁加入到進(jìn)程的頁表)就行mmap()是系統(tǒng)調(diào)用,使用一次的開銷比較大,但比文件讀寫的read()/write()進(jìn)行內(nèi)核空間到用戶空間的數(shù)據(jù)復(fù)制要快,通常只有需要分配的內(nèi)存>128KB(malloc一次分配33page就是128KB)的時(shí)候才會(huì)使用mmap()/shm是一個(gè)特殊的文件系統(tǒng),它不對(duì)應(yīng)磁盤中的區(qū)域,而是內(nèi)存中,所以使用mmap()在這個(gè)文件系統(tǒng)中創(chuàng)/proc 不占用任何磁盤空間linux采用的是頁式管理機(jī)制。對(duì)于用mmap()映射普通文件來說,進(jìn)程會(huì)在自己的地址空間新增一塊空間,空間大小由mmap()的len參數(shù)指定,注意,進(jìn)程并不一定能夠?qū)θ啃略隹臻g都能進(jìn)行有效訪問。進(jìn)程能夠訪問的有效地址大小取決于文件被映射部分的大小。簡單的說,能夠容納文件被映射部分大小的最少頁面?zhèn)€數(shù)決定了進(jìn)程從mmap()返回的地址開始,能夠有效訪問的地址空間大小。超過這個(gè)空間大小,內(nèi)核會(huì)根據(jù)超過的嚴(yán)重程度返回發(fā)送不同的信號(hào)給進(jìn)程。經(jīng)過內(nèi)核!=在內(nèi)核空間和用戶空間來回切換!=在內(nèi)核空間和用戶空間傳遞復(fù)制的數(shù)據(jù)頁是內(nèi)存映射的基本單位, 可以理解為實(shí)際分配給物理內(nèi)存的基本單位, 但不是數(shù)據(jù)操作的基本單位;頁機(jī)制是操作系統(tǒng)和CPU約定好的一種方式,OS按照頁給CPU按頁發(fā)虛擬地址,CPU按頁解析并處理操作系統(tǒng)(包括Linux)大量使用的緩存的兩個(gè)原理:CPU訪問內(nèi)存的速度遠(yuǎn)遠(yuǎn)大于訪問磁盤的速度(訪問速度差距不是一般的大,差好幾個(gè)數(shù)量級(jí))數(shù)據(jù)一旦被訪問,就有可能在短期內(nèi)再次被訪問(臨時(shí)局部原理)頁高速緩存(page cache)是個(gè)內(nèi)存區(qū)域,是Linux 內(nèi)核使用的主要磁盤高速緩存,在絕大多數(shù)情況下,內(nèi)核在讀寫磁盤時(shí)都引用頁高速緩存,新頁被追加到頁高速緩存以滿足用戶態(tài)進(jìn)程的讀請(qǐng)求,如果頁不在高速緩存中,新頁就被加到高速緩存中,然后就從磁盤讀出的數(shù)據(jù)填充它,如果內(nèi)存有足夠的空閑空間,就讓該頁在高速緩存中長期保留,使其他進(jìn)程再使用該頁時(shí)不再訪問磁盤, 即磁盤上的文件緩存到內(nèi)存后,它的虛擬內(nèi)存地址可以有多個(gè),但是物理內(nèi)存地址卻只能有一個(gè)我們要讀寫磁盤文件時(shí),實(shí)質(zhì)是對(duì)頁高速緩存進(jìn)行讀寫,所以無論讀寫,都會(huì)首先檢查頁高速緩存有沒有這個(gè)文件對(duì)應(yīng)的頁,如果有,就直接訪問,如果沒有,就引起缺頁中斷,給OS發(fā)信號(hào),讓它把文件放到高速緩存再進(jìn)行讀寫,這個(gè)過程不經(jīng)過內(nèi)核空間到用戶空間復(fù)制數(shù)據(jù)OS中的頁機(jī)制,對(duì)應(yīng)到硬件中可不一定在主存中,也可以是高速緩存etc,但不會(huì)是磁盤,因?yàn)榇疟P文件的地址和內(nèi)存不一樣,不是按照32位編址的,而是按照ext2 etc方式編址的,需要使用文件管理系統(tǒng),在Linux中使用VFS和實(shí)際文件管理系統(tǒng)來管理文件,所以對(duì)于Linux,有兩個(gè)方式使用系統(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)進(jìn)程數(shù)據(jù)的頁,但頁中的數(shù)據(jù)已經(jīng)被交換到硬盤屬于他書文件系統(tǒng)文件的頁映射:一個(gè)線性區(qū)可以和磁盤文件系統(tǒng)的普通文件的某一部分或者塊設(shè)備文件相關(guān)聯(lián),這就意味著內(nèi)核把對(duì)區(qū)線性中頁內(nèi)某個(gè)字節(jié)的訪問轉(zhuǎn)換成對(duì)文件中相應(yīng)字節(jié)的操作TLB(Translation Lookaside Buffer)高速緩存用于加快線性地址的轉(zhuǎn)換,當(dāng)一個(gè)線性地址第一次被使用時(shí),通過慢速訪問RAM中的頁表計(jì)算出相應(yīng)的物理地址,同時(shí),物理地址被存放在TLB表項(xiàng)(TLB entry),以便以后對(duì)同一個(gè)線性地址的引用可以快速得到轉(zhuǎn)換在初始化階段,內(nèi)核必須建立一個(gè)物理地址映射來指定哪些物理地址范圍對(duì)內(nèi)核可用,哪些不可用swap(內(nèi)存交換空間)的功能是應(yīng)付物理內(nèi)存不足的情況下所造成的內(nèi)存擴(kuò)展記錄的功能,CPU所讀取的數(shù)據(jù)都來自于內(nèi)存,那當(dāng)內(nèi)存不足的時(shí)候,為了讓后續(xù)的程序可以順序運(yùn)行,因此在內(nèi)存中暫不使用的程序和數(shù)據(jù)就會(huì)被挪到swap中,此時(shí)內(nèi)存就會(huì)空出來給需要執(zhí)行的程序加載,由于swap是使用硬盤來暫時(shí)放置內(nèi)存中的信息,所以用到swap時(shí),主機(jī)硬盤燈就會(huì)開始閃個(gè)不同Q:CPU只能對(duì)內(nèi)存進(jìn)行讀寫,但又是怎么讀寫硬盤的呢???A:把數(shù)據(jù)寫入page cache,再經(jīng)由。。。寫入磁盤(包括swap) --《鳥哥》P10內(nèi)存本身沒有計(jì)算能力,尋址之類的都是CPU的事,只是為了簡便起見,我們通常畫成從內(nèi)存地址A跳到內(nèi)存地址BOS是軟件的核心,CPU是執(zhí)行的核心前者給后者發(fā)指令我要干什么,CPU把他的指令變成現(xiàn)實(shí)二者必須很好的匹配計(jì)算機(jī)才能很好的工作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ù),其實(shí)現(xiàn)原理如圖7所示。第二種類型的API將Cache項(xiàng)映射到用戶空間,使得應(yīng)用程序可以像使用內(nèi)存指針一樣訪問文件,Memory map訪問Cache的方式在內(nèi)核中是采用請(qǐng)求頁面機(jī)制實(shí)現(xiàn)的,首先,應(yīng)用程序調(diào)用mmap(),陷入到內(nèi)核中后調(diào)用do_mmap_pgoff。該函數(shù)從應(yīng)用程序的地址空間中分配一段區(qū)域作為映射的內(nèi)存地址,并使用一個(gè)VMA(vm_area_struct)結(jié)構(gòu)代表該區(qū)域,之后就返回到應(yīng)用程。當(dāng)應(yīng)用程序訪問mmap所返回的地址指針時(shí)(圖中4),由于虛實(shí)映射尚未建立,會(huì)觸發(fā)缺頁中斷。之后系統(tǒng)會(huì)調(diào)用缺頁中斷處理函數(shù),在缺頁中斷處理函數(shù)中,內(nèi)核通過相應(yīng)區(qū)域的VMA結(jié)構(gòu)判斷出該區(qū)域?qū)儆谖募成?,于是調(diào)用具體文件系統(tǒng)的接口讀入相應(yīng)的Page Cache項(xiàng),并填寫相應(yīng)的虛實(shí)映射表。經(jīng)過這些步驟之后,應(yīng)用程序就可以正常訪問相應(yīng)的內(nèi)存區(qū)域了。mumap()//接觸文件或設(shè)備對(duì)內(nèi)存的映射,成功返回0,失敗返回-1設(shè)errnoint munmap(void *addr, size_t length);shm_unlink()//關(guān)閉進(jìn)程打開的共享內(nèi)存對(duì)象,成功返回0,失敗返回-1//Link with -lrt.int shm_unlink(const char *name);
2019-04-02 14:46:41
194 POSIX mq VS Sys V mq的優(yōu)勢更簡單的基于文件的應(yīng)用接口完全支持消息優(yōu)先級(jí)(優(yōu)先級(jí)最終決動(dòng)隊(duì)列中消息的位置)完全支持消息到達(dá)的異步通知,這通過信號(hào)或是線程創(chuàng)建實(shí)現(xiàn)用于阻塞
2019-04-02 14:46:43
469 阻塞式I/O,即Blocking I/O。用戶發(fā)起一個(gè)recvfrom系統(tǒng)調(diào)用,內(nèi)核會(huì)等待數(shù)據(jù)從網(wǎng)絡(luò)中到達(dá)。一旦數(shù)據(jù)準(zhǔn)備就緒,系統(tǒng)內(nèi)核將把自己的緩沖區(qū)中的數(shù)據(jù)拷貝到用戶進(jìn)程的緩沖區(qū)。在系統(tǒng)內(nèi)核等待數(shù)據(jù)、復(fù)制數(shù)據(jù)的過程中,用戶進(jìn)程是不能做其他任何事情的,只能等待內(nèi)核完成上述一系列的操作。
2019-04-27 18:19:00
2938 ls 命令可以列出一個(gè) POSIX 系統(tǒng)上的文件。這是一個(gè)簡單的命令,但它經(jīng)常被低估,不是它能做什么(因?yàn)樗_實(shí)只做了一件事),而是你該如何優(yōu)化對(duì)它的使用。
2019-08-11 10:55:22
3001 Linux是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng),是一個(gè)基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。
2019-11-06 11:42:06
567 
Linux:Linux是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng),是一個(gè)基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。
2019-11-06 14:03:29
1819 IT之家了解到,Wine (Wine Is Not an Emulator)是一個(gè)能夠在多種 POSIX-compliant 操作系統(tǒng)(包括 Linux,Mac OSX 及 BSD 等)上運(yùn)行 Windows 應(yīng)用的兼容層。
2020-03-14 09:33:11
2054 Linux很強(qiáng)大,它是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng),是一個(gè)基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。
2020-04-13 08:58:58
974 Linux是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng),是一個(gè)基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。
2020-05-21 09:17:33
5728 Linux是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng),是一個(gè)基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。
2020-05-27 09:37:21
5458 《多線程編程指南》介紹了 SolarisTM 操作系統(tǒng) (Solaris Operating System, Solaris OS)中 POSIX?線程和 Solaris 線程的多線程編程接口
2020-06-11 08:00:00
4 ,是一個(gè)基于POSIX和Unix的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運(yùn)行主要的Unix工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。Linux繼承了Unix以網(wǎng)絡(luò)為核心的設(shè)計(jì)思想,是一個(gè)性
2020-07-02 08:14:00
3537 DFS 的層次架構(gòu)如下圖所示,主要分為 POSIX 接口層、虛擬文件系統(tǒng)層和設(shè)備抽象層。
2020-07-08 15:29:19
4393 上一章,講述了 SYSTEM V 信號(hào)量,主要運(yùn)行于進(jìn)程之間,本章主要介紹 POSIX 信號(hào)量:有名信號(hào)量、無名信號(hào)量。 POSIX 信號(hào)量 POSIX 信號(hào)量進(jìn)程是 3 種 IPC
2020-10-29 17:34:14
413 rt-smart內(nèi)核即可包含基本功能,同時(shí)也可定制裁剪。rt-smart用戶態(tài)應(yīng)用環(huán)境采用musl libc提供POSIX接口調(diào)用及C運(yùn)行環(huán)境,延續(xù) RT-Thread 原有的生態(tài),使用scons
2020-11-29 10:31:39
2426 ,是指繼承UNIX的設(shè)計(jì)風(fēng)格演變出來的系統(tǒng)。那什么是UNIX呢?UNIX操作系統(tǒng)(尤尼斯)是一個(gè)分時(shí)系統(tǒng)、多用戶、多任務(wù)操作系統(tǒng)。Linux是一個(gè)基于POSIX和UNIX的多用戶、多任務(wù)、支持多線...
2021-11-01 17:21:12
11 目錄簡介TI-RTOSFreeRTOSPOSIX運(yùn)行時(shí)對(duì)象查看器 (Runtime Object Viewer)TI-POSIX 介紹在源代碼中使用 POSIXTI-POSIX支持的函數(shù)摘要線程函數(shù)
2021-12-16 16:56:46
5 ,是一個(gè)基于POSIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運(yùn)行主要的Unix工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。 Linux操作系統(tǒng)的特點(diǎn) 1、Linux系統(tǒng)是免費(fèi)的自由軟件 2、良好的硬件平臺(tái)
2022-01-30 17:30:00
2794 可移植操作系統(tǒng)接口,POSIX 標(biāo)準(zhǔn)定義了操作系統(tǒng)(很多時(shí)候針對(duì)的是類 Unix 操作系統(tǒng))應(yīng)該為應(yīng)用程序提供的接口標(biāo)準(zhǔn),從而保證了應(yīng)用程序在源碼層次的可移植性,如今主流的 Linux 系統(tǒng)都做
2022-04-27 10:22:12
1430 POSIX是什么?下圖進(jìn)行簡單概述
2022-05-27 16:34:04
675 
POSIX如何定義各種功能?有哪些標(biāo)準(zhǔn)?
2022-05-27 16:42:19
644 
RT-Thread全球技術(shù)大會(huì):POSIX標(biāo)準(zhǔn)定義、使用以及四種配置 ? ? ? ? ? 審核編輯:彭靜
2022-05-27 16:44:00
1226 
可移植操作系統(tǒng)接口,POSIX標(biāo)準(zhǔn)定義了操作系統(tǒng)(很多時(shí)候針對(duì)的是類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:40
1635 
對(duì)于部分C函數(shù),編譯器配平層負(fù)責(zé)實(shí)現(xiàn)這些接口;由于RT-Thread需要維持多平臺(tái)可用,所以編譯器配平層的主要工作就是擬補(bǔ)各個(gè)編譯平臺(tái)的不足。
2022-05-27 16:46:37
1273 
RT-Thread全球技術(shù)大會(huì):RT-Thread對(duì)POSIX的實(shí)現(xiàn)情況介紹 ? ? ? ? ? ? 審核編輯:彭靜
2022-05-27 16:52:41
1511 
在上午RT-Thread全球技術(shù)大會(huì),RT-Thread開發(fā)者詳細(xì)介紹了POSIX FILE select的調(diào)用過程。如下圖:
2022-05-28 10:56:52
1267 
exit code:代表一個(gè)進(jìn)程的返回碼,通過系統(tǒng)調(diào)用 exit_group 來觸發(fā)。在 POSIX 中,0 代表正常的返回碼,而 1-255 代表異常返回碼,不過一般錯(cuò)誤碼都是 1。
2022-08-02 09:55:36
463 本文將為您介紹關(guān)于POSIX定時(shí)器的相關(guān)知識(shí)點(diǎn)。因?yàn)橐褂媒^對(duì)時(shí)間,存在系統(tǒng)時(shí)間被調(diào)節(jié)的可能性,指定時(shí)間段內(nèi)下發(fā)通知等需求,排除了jiffies相關(guān)的定時(shí)器、依賴于系統(tǒng)運(yùn)行時(shí)間的定時(shí)器、alarm
2022-12-14 09:15:05
622 POSIX是歸屬于電氣與電子工程師協(xié)會(huì)(簡稱IEEE)的商標(biāo),是“uni-X便攜式操作系統(tǒng)接口”的簡稱,其目標(biāo)是通過制定一套供操作系統(tǒng)供應(yīng)商遵循的準(zhǔn)則來簡化跨平臺(tái)軟件開發(fā)的任務(wù)。
2022-12-15 14:06:14
288 近日,中興通訊旗下產(chǎn)品——車用微內(nèi)核操作系統(tǒng)ZTE Automotive OS V3.0正式通過POSIX規(guī)范PSE52實(shí)時(shí)控制器1003.13-2003系統(tǒng)(PSE52 Realtime Controller 1003.13-2003 System)認(rèn)證,成為國內(nèi)首家獲得此認(rèn)證的企業(yè)。
2022-12-15 14:06:29
506 1974年,貝爾實(shí)驗(yàn)室正式對(duì)外發(fā)布Unix。因?yàn)樯婕暗椒磯艛嗟雀鞣N原因,加上早期的Unix不夠完善,于是貝爾實(shí)驗(yàn)室以慷慨的條件向?qū)W校提供源代碼,所以Unix在大專院校里獲得了很多支持并得以持續(xù)發(fā)展。
2023-05-22 09:33:06
491 
isalnum()函數(shù)用于測試字符,如果字符是字母或數(shù)字,則返回非零值(即真),否則返回零(即假)。isalnum()函數(shù)在許多場景中非常有用,特別是在字符串處理中。
2023-09-27 11:42:40
321 首先,啟用 DFS:”RT-Thread Components” -> “DFS: device virtual file system” 。進(jìn)入子菜單,選擇
2023-10-13 10:30:32
294 最近,留意到 MinIO 官方博客的一篇題為“在對(duì)象存儲(chǔ)上實(shí)現(xiàn) POSIX 訪問接口是壞主意[1]”的文章,作者以 S3FS-FUSE 為例分享了通過 POSIX 方式訪問 MinIO 中的數(shù)據(jù)時(shí)碰到了性能方面的困難,性能遠(yuǎn)不如直接訪問 MinIO。
2023-10-29 10:19:41
334 
一、POSIX信號(hào)量 1.阻塞隊(duì)列實(shí)現(xiàn)的生產(chǎn)消費(fèi)模型代碼不足的地方(無法事前得知臨界資源的就緒狀態(tài)) 1.在先前我們的生產(chǎn)消費(fèi)模型代碼中,一個(gè)線程如果想要操作臨界資源,也就是對(duì)臨界資源做修改的時(shí)候
2023-11-09 17:13:29
254 
評(píng)論