




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
-.z.Linu*下開發(fā)根底知識(shí)touch命令:可用于新建文件,如;touch/tmp/zhang*ian.t*t關(guān)于volatile的介紹(類型修飾符,指令關(guān)鍵字)1.編譯器優(yōu)化介紹由于存訪問速度遠(yuǎn)不及CPU處理速度,為提高機(jī)器整體性能,在硬件上引入硬件高速緩存Cache,加速對(duì)存的訪問。另外在現(xiàn)代CPU中指令的執(zhí)行并不一定嚴(yán)格按照順序執(zhí)行,沒有相關(guān)性的指令可以亂序執(zhí)行,以充分利用CPU的指令流水線,提高執(zhí)行速度。以上是硬件級(jí)別的優(yōu)化。再看軟件一級(jí)的優(yōu)化:一種是在編寫代碼時(shí)由程序員優(yōu)化,另一種是由編譯器進(jìn)展優(yōu)化。編譯器優(yōu)化常用的方法有:將存變量緩存到存放器;調(diào)整指令順序充分利用CPU指令流水線,常見的是重新排序讀寫指令。對(duì)常規(guī)存進(jìn)展優(yōu)化的時(shí)候,這些優(yōu)化是透明的,而且效率很好。由編譯器優(yōu)化或者硬件重新排序引起的問題的解決方法是在從硬件〔或者其他處理器〕的角度看必須以特定順序執(zhí)行的操作之間設(shè)置存屏障〔memorybarrier〕,linu*提供了一個(gè)宏解決編譯器的執(zhí)行順序問題。2.voidBarrier(void)這個(gè)函數(shù)通知編譯器插入一個(gè)存屏障,但對(duì)硬件無效,編譯后的代碼會(huì)把當(dāng)前CPU存放器中的所有修改正的數(shù)值存入存,需要這些數(shù)據(jù)的時(shí)候再重新從存中讀出。3.volatile總是與優(yōu)化有關(guān),編譯器有一種技術(shù)叫做數(shù)據(jù)流分析,分析程序中的變量在哪里賦值、在哪里使用、在哪里失效,分析結(jié)果可以用于常量合并,常量傳播等優(yōu)化,進(jìn)一步可以消除一些代碼。但有時(shí)這些優(yōu)化不是程序所需要的,這時(shí)可以用volatile關(guān)鍵字制止做這些優(yōu)化。gccandg++分別是GNU的c&c++編譯器。gcc/g++在執(zhí)行編譯的時(shí)候一般有下面4步:⒈預(yù)處理,生成.i的文件[預(yù)處理器cpp];⒉將預(yù)處理后的文件轉(zhuǎn)換成匯編語言,生成文件.s[編譯器egcs];⒊由匯編變?yōu)槟繕?biāo)代碼〔機(jī)器代碼〕生成.o的文件[匯編器as];⒋連接目標(biāo)代碼,生成可執(zhí)行程序[器ld];gcc編譯流程分為4個(gè)步驟,分別為:預(yù)處理〔Pre-Processing〕編譯〔piling〕匯編〔Assembling〕〔Linking〕g++-o-c-g功能-o:指定生成可執(zhí)行文件的名稱。使用方法為:g++-oafilefile.cppfile.h...〔可執(zhí)行文件不可與待編譯或文件同名,否則會(huì)生成相應(yīng)可執(zhí)行文件且覆蓋原編譯或文件〕,如果不使用-o選項(xiàng),則會(huì)生成默認(rèn)可執(zhí)行文件a.out。-c:只編譯不,只生成目標(biāo)文件。-g:添加gdb調(diào)試選項(xiàng)。Linu*下C語言應(yīng)用編程文件I/O編程多進(jìn)程編程的根本知識(shí),核心是fork、e*ec、wait三大系統(tǒng)的調(diào)用;〔可能需要補(bǔ)充操作系統(tǒng)進(jìn)程并發(fā)運(yùn)行的根本知識(shí)〕進(jìn)程間通信的幾種方法:信號(hào),管道,共享存,信號(hào)量,消息隊(duì)列?!沧钪匾氖切盘?hào)和管道〕多線程編程的根底知識(shí);網(wǎng)絡(luò)編程:socket編程,TCPsocket編程和UDPsocket編程;開發(fā)工具〔包括:編輯器vim、編譯器gcc、調(diào)試器gdb、工程管理工具autoconf、程序庫的制作等〕;編譯器vim的三種模式:切換到編輯模式的四種方式,編輯模式可以輸入任意容a光標(biāo)向后移動(dòng)一位i
當(dāng)前位置o另起新行s刪除光標(biāo)所在字符r替換光標(biāo)所在字符2.尾行模式,用于保存容、查找替換、設(shè)置行號(hào)等等功能性操作:q
//quit退出vi編輯器:w//write保存修改的容:wq//保存并退出:q!//強(qiáng)制退出,當(dāng)對(duì)文本容作了修改而不想要保存時(shí):w!//強(qiáng)制保存,當(dāng)沒有文本的寫權(quán)限時(shí)make和makefile文件:makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)展更復(fù)雜的功能操作〔因?yàn)閙akefile就像一個(gè)Shell腳本一樣,可以執(zhí)行操作系統(tǒng)的命令〕。makefile帶來的好處就是—“自動(dòng)化編譯〞,一旦寫好,只需要一個(gè)make命令,整個(gè)工程完全自動(dòng)編譯。makefile文件需要按照*種語法進(jìn)展編寫,文件中需要說明如何編譯各個(gè)源文件并生成可執(zhí)行文件,要求定義源文件之間的依賴關(guān)系。make工具最主要也最根本的功能就是根據(jù)makefile文件中描述的源程序之間的相互關(guān)系來完成自動(dòng)編譯、維護(hù)多源文件工程。Linu*下的常用命令Linu*刪除文件夾和文件的命令-r就是向下遞歸,不管有多少級(jí)目錄,一并刪除-f就是直接強(qiáng)行刪除,不作任何提示的意思刪除文件夾實(shí)例:rm-rf/var/log/d/access將會(huì)刪除/var/log/d/access目錄以及其下所有文件、文件夾刪除文件使用實(shí)例:rm-f/var/log/d/access.log將會(huì)強(qiáng)制刪除/var/log/d/access.log這個(gè)文件文件I/O編程:系統(tǒng)調(diào)用、API與系統(tǒng)命令之間的關(guān)系Linu*系統(tǒng)調(diào)用是指操作系統(tǒng)提供應(yīng)用戶程序的一組“特殊〞接口,用戶程序可以通過這組“特殊〞接口來獲得操作系統(tǒng)核提供的特殊效勞。比方用戶可以通過文件系統(tǒng)相關(guān)的調(diào)用請(qǐng)求系統(tǒng)翻開文件、關(guān)閉文件或讀寫文件,可以通過時(shí)鐘相關(guān)的系統(tǒng)調(diào)用獲得系統(tǒng)時(shí)間或設(shè)置系統(tǒng)時(shí)間等。為了更好的保護(hù)核空間,將程序的運(yùn)行空間分為核空間和用戶空間,它們運(yùn)行在不同的級(jí)別上,在邏輯上是相互隔離的。在Linu*中,用戶程序不能直接訪問核提供的效勞,必須通過系統(tǒng)調(diào)用來使用核提供的效勞。用戶進(jìn)程在通常情況下不允許訪問核數(shù)據(jù),也無法使用核函數(shù),它們只能在用戶空間操作用戶數(shù)據(jù),調(diào)用用戶空間函數(shù)。Linu*中的用戶編程接口〔API〕遵循了UNI*中最流行的應(yīng)用編程界面標(biāo)準(zhǔn)-POSI*標(biāo)準(zhǔn)。〔這些系統(tǒng)調(diào)用編程接口主要是通過C庫〔libc〕實(shí)現(xiàn)的。〕這套標(biāo)準(zhǔn)定義了一系列API。在Linu*中〔Uni*也如此〕這些API主要是通過C庫〔libc〕實(shí)現(xiàn)的,它除了定義的一些標(biāo)準(zhǔn)的C函數(shù)外,一個(gè)很重要的任務(wù)就是提供了一套封裝例程〔wrapperroutine〕將系統(tǒng)調(diào)用在用戶空間包裝后供用戶編程使用。可用的文件I/O函數(shù)很多,包括:翻開文件、讀文件、寫文件等。大多數(shù)Linu*文件I/O只需要用到5個(gè)函數(shù):open、read、write、lseek以及close。這5個(gè)函數(shù)是不帶緩存的I/O函數(shù),它們是POSI*標(biāo)準(zhǔn)的組成局部。在C語言中也有文件I/O函數(shù),例如:fread、fwrite、fprintf、fscanf等。這些函數(shù)是帶緩存的I/O函數(shù),它們屬于ANSIC的組成局部。Linu*下系統(tǒng)調(diào)用、API、系統(tǒng)命令、核函數(shù)的區(qū)別與聯(lián)系系統(tǒng)調(diào)用:應(yīng)用程序和核間的橋梁,是應(yīng)用程序訪問核的入口點(diǎn);但通常情況下,應(yīng)用程序通過操作系統(tǒng)提供的API進(jìn)展編程而不是使用系統(tǒng)調(diào)用直接編程;linu*的全部系統(tǒng)調(diào)用加起來大約只有250個(gè)左右。這些系統(tǒng)調(diào)用按照功能邏輯大致可分為“進(jìn)程控制〞、“文件系統(tǒng)控制〞、“系統(tǒng)控制〞、“存管管理〞、“網(wǎng)絡(luò)管理〞、“socket控制〞、“用戶管理〞、“進(jìn)程間通信〞幾類;可以使用man2syscalls命令查看系統(tǒng)調(diào)用的說明,或者到<核源碼目錄>/include/asm-i386/unistd.h源文件種找到它們的原本。1.系統(tǒng)調(diào)用在核里的主要用途:控制硬件;設(shè)置系統(tǒng)狀態(tài)或讀取核數(shù)據(jù);進(jìn)程管理2.什么的效勞應(yīng)該存在于核,或者說什么功能應(yīng)該在核而不是在用戶空間;〔如效勞是否必須獲得核數(shù)據(jù);平安的角度;效率的角度等〕API:API常以C庫(libc)的形式提供,C庫提供了絕大局部API,每個(gè)系統(tǒng)調(diào)用在C庫中都有對(duì)應(yīng)的封裝函數(shù)(通常封裝函數(shù)與系統(tǒng)調(diào)用的名稱一樣)。系統(tǒng)調(diào)用與C庫函數(shù)并不是一一對(duì)應(yīng)的,有些C庫函數(shù)可能使用多個(gè)系統(tǒng)調(diào)用來實(shí)現(xiàn),也有可能多個(gè)C庫函數(shù)使用同一個(gè)系統(tǒng)調(diào)用來實(shí)現(xiàn),也有些C庫函數(shù)不使用任何系統(tǒng)調(diào)用來實(shí)現(xiàn)。系統(tǒng)命令:系統(tǒng)命令是使用Linu*提供的C庫函數(shù)實(shí)現(xiàn)的可執(zhí)行程序,可用strace查看命令執(zhí)行時(shí)所使用的系統(tǒng)調(diào)用。核函數(shù):系統(tǒng)調(diào)用是用戶進(jìn)入核的接口,它本身不是核函數(shù),進(jìn)入核后每個(gè)系統(tǒng)調(diào)用會(huì)找到自己對(duì)應(yīng)的核函數(shù)(即系統(tǒng)調(diào)用效勞例程)從用戶的角度看,從底層往上看分別是:核函數(shù),系統(tǒng)調(diào)用,API,系統(tǒng)命令核函數(shù)和系統(tǒng)調(diào)用的關(guān)系:核函數(shù)和普通函數(shù)很像,只不過在核中實(shí)現(xiàn),因此要滿足一些核編程的要求。系統(tǒng)調(diào)用是一層用戶進(jìn)入核的接口,它本身并非核函數(shù),進(jìn)入核后,不同的系統(tǒng)調(diào)用會(huì)找到對(duì)應(yīng)到各自的核函數(shù)即,系統(tǒng)調(diào)用效勞例程。實(shí)際對(duì)請(qǐng)求效勞的是核函數(shù)而非調(diào)用接口〔系統(tǒng)調(diào)用〕。比方系統(tǒng)調(diào)用getpid實(shí)際就是調(diào)用核函數(shù)sys_getpid。Linu*下不帶緩存的I/O和帶緩存的I/O:概念:不帶緩存的I/O:UNI*的文件I/Oread、write是不帶緩存的,不帶緩存是指每個(gè)read、write都調(diào)用核的一個(gè)系統(tǒng)調(diào)用,它們是POSI*.1的組成局部。不是核不提供緩存,而是對(duì)于用戶層來說,沒有提供緩存,而對(duì)核來說還是有緩存的數(shù)據(jù):數(shù)據(jù)流->核緩存->磁盤帶緩存的I/O:是指在用戶層上再建立了一層緩存區(qū)〔流緩存區(qū)〕,目的是為了減少read,write等系統(tǒng)調(diào)用的使用次數(shù),降低系統(tǒng)開銷。帶緩存的I/O是指標(biāo)準(zhǔn)I/O庫,它由ANSIC標(biāo)準(zhǔn)說明,標(biāo)準(zhǔn)I/O庫代替用戶處理很多細(xì)節(jié),比方緩存分配、以優(yōu)化長(zhǎng)度執(zhí)行I/O等,提供緩存的目的是為了盡量減少read和write的調(diào)用次數(shù);數(shù)據(jù):數(shù)據(jù)流->流緩存區(qū)->核緩存->磁盤例如:當(dāng)用fwrite函數(shù)向磁盤寫數(shù)據(jù)時(shí),先把數(shù)據(jù)寫入流緩沖區(qū)中,當(dāng)?shù)竭_(dá)一定條件,比方流緩沖區(qū)滿了,或刷新流緩沖,這時(shí)候才會(huì)把數(shù)據(jù)一次送往核提供的塊緩沖,再經(jīng)塊緩沖寫入磁盤?!搽p重緩沖〕用數(shù)據(jù)流來形容兩者的差異:無緩存I/O操作的數(shù)據(jù)流:數(shù)據(jù)->核緩存區(qū)->磁盤標(biāo)準(zhǔn)I/O操作的數(shù)據(jù)流:數(shù)據(jù)->流緩存區(qū)->核緩存區(qū)->磁盤文件描述符對(duì)核而言,所有翻開文件都由文件描述符應(yīng)用。文件描述符是一個(gè)非負(fù)整數(shù)。當(dāng)翻開一個(gè)現(xiàn)存文件或創(chuàng)立一個(gè)新文件時(shí),核向進(jìn)程返回一個(gè)文件描述符。當(dāng)讀、寫一個(gè)文件時(shí),用open或create返回的文件描述符標(biāo)識(shí)該文件,將其作為參數(shù)傳送給read或write。在windows環(huán)境下,文件描述符大體上相當(dāng)于文件句柄。在POSI*.1應(yīng)用程序中,整數(shù)0、1、2應(yīng)被代換成符號(hào)常數(shù):STDIN_FILENO代表標(biāo)準(zhǔn)輸入〔默認(rèn)是鍵盤〕、標(biāo)準(zhǔn)輸出〔默認(rèn)是屏幕〕、標(biāo)準(zhǔn)錯(cuò)誤輸出〔默認(rèn)是屏幕〕,這些常數(shù)都定義在頭文件<unistd.h>中。多進(jìn)程編程進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序?qū)?個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。進(jìn)程的實(shí)體構(gòu)造:進(jìn)程控制塊〔PCB〕;程序段;數(shù)據(jù)段;PCB位于核的存里面的一塊區(qū)域,是操作系統(tǒng)中最重要的記錄型數(shù)據(jù)構(gòu)造。PCB中記錄了操作系統(tǒng)所需的,用于描述進(jìn)程進(jìn)展情況及控制進(jìn)程所需的全部信息。進(jìn)程塊主要包括下述4方面的信息:進(jìn)程描述信息處理機(jī)狀態(tài)信息進(jìn)程調(diào)度信息:進(jìn)程狀態(tài)、進(jìn)程優(yōu)先級(jí)〔用于描述進(jìn)程使用處理機(jī)的優(yōu)先級(jí)別的一個(gè)整數(shù),優(yōu)先級(jí)別高的進(jìn)程先獲得處理機(jī)〕、進(jìn)程調(diào)度所需的其他信息〔如進(jìn)程已等待CPU的時(shí)間總和、進(jìn)程已執(zhí)行的時(shí)間總和等〕、事件〔指進(jìn)程被阻塞的原因〕。進(jìn)程控制信息:程序和數(shù)據(jù)的地址〔指出該進(jìn)程的程序和數(shù)據(jù)所在的存或外存地址,以便再調(diào)度到該進(jìn)程執(zhí)行時(shí),能從中找到其程序和數(shù)據(jù)〕;進(jìn)程同步和通信機(jī)制〔指實(shí)現(xiàn)進(jìn)程同步和進(jìn)程通信時(shí)所必須的機(jī)制,如消息隊(duì)列指針、信號(hào)量等。這些數(shù)據(jù)應(yīng)全部或局部存放在PCB中〕。進(jìn)程的三種狀態(tài):進(jìn)程的三種根本狀態(tài):〔1〕就緒狀態(tài):進(jìn)程已獲得除CPU外的所有必要資源,只等待CPU時(shí)的狀態(tài)。一個(gè)系統(tǒng)會(huì)將多個(gè)處于就緒狀態(tài)的進(jìn)程排成一個(gè)就緒隊(duì)列?!?〕執(zhí)行狀態(tài):進(jìn)程已獲CPU,正在執(zhí)行。單處理機(jī)系統(tǒng)中,處于執(zhí)行狀態(tài)的進(jìn)程只一個(gè);多處理機(jī)系統(tǒng)中,有多個(gè)處于執(zhí)行狀態(tài)的進(jìn)程?!?〕阻塞狀態(tài):正在執(zhí)行的進(jìn)程由于*種原因而暫時(shí)無法繼續(xù)執(zhí)行,便放棄處理機(jī)而處于暫停狀態(tài),即進(jìn)程執(zhí)行受阻?!策@種狀態(tài)又稱等待狀態(tài)或封鎖狀態(tài)〕通常導(dǎo)致進(jìn)程阻塞的典型事件有:請(qǐng)求I/O,申請(qǐng)緩沖空間等。進(jìn)程間通信進(jìn)程間通信有如下一些目的:數(shù)據(jù)傳輸共享數(shù)據(jù)通知事件資源共享的同步進(jìn)程控制多線程編程初步線程是一個(gè)程序部可以被操作系統(tǒng)調(diào)度并發(fā)運(yùn)行的任務(wù)。在很多情況下,完成相關(guān)任務(wù)的不同代碼間需要交換數(shù)據(jù)。如果采用多進(jìn)程的方式,則通信就只能采用幾種進(jìn)程間通信的方式,但無論是信號(hào)、管道、共享存,還是信號(hào)量,它們的操作都比擬繁雜,不直觀;而且大多數(shù)要使用核對(duì)象,數(shù)據(jù)要在用戶空間和核空間進(jìn)展切換,開銷很大。但如果采用多線程方式,線程間的通信(數(shù)據(jù)交換)既直觀又效率高,例如可以使用共享的全局變量。和進(jìn)程相比,線程是一種“節(jié)省〞的多任務(wù)操作方式。運(yùn)行于一個(gè)進(jìn)程中的多個(gè)線程,它們彼此之間使用一樣的地址空間,共享大局部數(shù)據(jù),啟動(dòng)一個(gè)線程所花費(fèi)的空間遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間,而且,線程間彼此切換所需的時(shí)間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需的時(shí)間?!矒?jù)統(tǒng)計(jì),總的來說,一個(gè)進(jìn)程的開銷大約是一個(gè)線程開銷的30倍左右,當(dāng)然,在具體的系統(tǒng)上,這個(gè)數(shù)據(jù)可能會(huì)有較大的區(qū)別〕常用的線程函數(shù)創(chuàng)立線程:pthread_createintpthread_create(pthread_t*tidp,constpthread_attr_t*attr,(void*)(*start_rtn)(void*),void*arg);假設(shè)線程創(chuàng)立成功,則返回0。假設(shè)線程創(chuàng)立失敗,則返回出錯(cuò)編號(hào),并且*thread中的容是未定義的。返回成功時(shí),由tidp指向的存單元被設(shè)置為新創(chuàng)立線程的線程ID。attr參數(shù)用于指定各種不同的線程屬性。新創(chuàng)立的線程從start_rtn函數(shù)的地址開場(chǎng)運(yùn)行,該函數(shù)只有一個(gè)萬能指針參數(shù)arg,如果需要向start_rtn函數(shù)傳遞的參數(shù)不止一個(gè),則需要把這些參數(shù)放到一個(gè)構(gòu)造中,然后把這個(gè)構(gòu)造的地址作為arg的參數(shù)傳入。linu*下用C語言開發(fā)多線程程序,Linu*系統(tǒng)下的多線程遵循POSI*線程接口,稱為pthread。參數(shù)第一個(gè)參數(shù)為指向線程標(biāo)識(shí)符的指針。第二個(gè)參數(shù)用來設(shè)置線程屬性。第三個(gè)參數(shù)是線程運(yùn)行函數(shù)的起始地址。最后一個(gè)參數(shù)是運(yùn)行函數(shù)的參數(shù)。當(dāng)線程運(yùn)行函數(shù)的參數(shù)不止一個(gè)時(shí),則需要把這些參數(shù)放到一個(gè)構(gòu)造中,然后將找個(gè)構(gòu)造的地址當(dāng)作參數(shù)傳輸參數(shù)。線程互斥鎖的初始化pthread_mute*_initintpthread_mute*_init(pthread_mute*_t*restrictmute*,constpthread_mute*attr_t*restrictattr);pthread_mute*_tmute*=PTHREAD_MUTE*_INITIALIZER;pthread_mute*_init()函數(shù)是以動(dòng)態(tài)方式創(chuàng)立互斥鎖的,參數(shù)attr指定了新建互斥鎖的屬性。如果參數(shù)attr為空,則使用默認(rèn)的互斥鎖屬性,默認(rèn)屬性為快速互斥鎖?;コ怄i的屬性在創(chuàng)立鎖的時(shí)候指定,在Linu*Threads實(shí)現(xiàn)中僅有一個(gè)鎖類型屬性,不同的鎖類型在試圖對(duì)一個(gè)已經(jīng)被鎖定的互斥鎖加鎖時(shí)表現(xiàn)不同。3.線程初始化條件變量函數(shù)pthread_cond_init〔〕;e*ternintpthread_cond_init((pthread_cond_t*cond,constpthread_condattr_t*cond_attr));其中cond是一個(gè)指向構(gòu)造pthread_cond_t的指針,cond_attr是一個(gè)指向構(gòu)造pthread_condattr_t的指針。構(gòu)造pthread_condattr_t是條件變量的屬性構(gòu)造,和互斥鎖一樣我們可以用它來設(shè)置條件變量是進(jìn)程可用還是進(jìn)程間可用,默認(rèn)值是PTHREAD_PROCESS_PRIVATE,即此條件變量被同一進(jìn)程的各個(gè)線程使用;如果選擇為PTHREAD_PROCESS_SHARED則為多個(gè)進(jìn)程間各線程公用。注意初始化條件變量只有未被使用時(shí)才能重新初始化或被釋放。返回值:函數(shù)成功返回0;任何其他返回值都表示錯(cuò)誤。釋放一個(gè)條件變量的函數(shù)為pthread_cond_destroy〔pthread_cond_t*cond〕。完畢線程:pthread_e*it//線程自行完畢〔自殺〕使用pthread_e*it等待線程完畢:pthread_joinpthread_create調(diào)用成功后,新生成的線程和老線程誰先被調(diào)度執(zhí)行,取決于OS,應(yīng)用程序無法控制。因此,應(yīng)用程序員如需等待指定線程完畢,需要使pthread_join。intpthread_join(pthread_tth,void**thread_return);th是要等待完畢的線程的標(biāo)識(shí)。指針thread_return指向的位置存放的是終止線程的返回狀態(tài)。sched_yield()這個(gè)函數(shù)可以使另一個(gè)級(jí)別等于或高于當(dāng)前線程的線程先運(yùn)行。如果沒有符合條件的線程,則這個(gè)函數(shù)將會(huì)立刻返回,然后繼續(xù)執(zhí)行當(dāng)前線程的程序。在成功完成之后返回零,否則返回-1.多線程的同步與互斥由于多個(gè)線程間極有可能回訪問共享的資源〔典型的是訪問同一個(gè)全局變量〕,因此多個(gè)線程間存在競(jìng)爭(zhēng),這就需要在多個(gè)線程間進(jìn)展同步?;コ怄i多線程的同步采用加鎖的機(jī)制,類似于多進(jìn)程間的信號(hào)量機(jī)制。在主線程中初始化鎖為解鎖狀態(tài)〔類似于初始化0-1信號(hào)量為1〕在編譯時(shí)初始化鎖為解鎖狀態(tài);在訪問共享對(duì)象前進(jìn)展加速操作〔類似于對(duì)信號(hào)量執(zhí)行P操作〕;在訪問共享對(duì)象后進(jìn)展解鎖操作〔類似于對(duì)信號(hào)量執(zhí)行V操作〕;信號(hào)量互斥鎖一個(gè)明顯的缺點(diǎn)是它只有兩種狀態(tài):鎖定和非鎖定。從本質(zhì)上講,互斥鎖就是一個(gè)0-1信號(hào)量。因此當(dāng)公共資源總量超過1時(shí),互斥鎖就不能用于線程同步了,此時(shí)可以采用信號(hào)量。信號(hào)量的本質(zhì)上是一個(gè)非負(fù)的整數(shù)計(jì)數(shù)器,它被用來控制對(duì)公共資源的訪問。當(dāng)公共資源增加時(shí),調(diào)用sem_post()函數(shù)增加信號(hào)量。只有當(dāng)信號(hào)量值大于0時(shí),才能使用公共資源,使用后,調(diào)用函數(shù)sem_wait()減少信號(hào)量。線程屬性創(chuàng)立線程時(shí)指定線程的屬性線程的綁定輕進(jìn)程:可以理解為核線程,它位于用戶層和系統(tǒng)層之間。系統(tǒng)對(duì)線程資源的分配、對(duì)線程的控制是通過輕進(jìn)程來實(shí)現(xiàn)的。一個(gè)輕進(jìn)程可以控制一個(gè)或多個(gè)線程。默認(rèn)情況下,啟動(dòng)多少輕進(jìn)程,哪些輕進(jìn)程來控制哪些線程是由系統(tǒng)來控制的,這種狀況即稱為非綁定的。綁定:是*個(gè)線程固定的“邦〞在一個(gè)輕進(jìn)程之上。被綁定的線程具有較高的響應(yīng)速度,這是因?yàn)镃PU時(shí)間片的調(diào)度是面向輕進(jìn)程的,綁定的線程可以保證在需要的時(shí)候總有一個(gè)輕進(jìn)程可用。通過設(shè)置被綁定的輕進(jìn)程的優(yōu)先級(jí)和調(diào)度級(jí)可以使得綁定的線程滿足諸如實(shí)時(shí)反響之類的要求。設(shè)置線程綁定狀態(tài)的函數(shù)為:線程創(chuàng)立后改變屬性一個(gè)線程如果想殺死另一個(gè)線程的話,可以通過調(diào)用pthread_cancel來完成。類似于多進(jìn)程中的kill。線程調(diào)度和優(yōu)先級(jí)設(shè)置線程是獨(dú)立執(zhí)行的。它們被分派到處理器核上,并執(zhí)行分給它們的任務(wù)。每個(gè)線程均有一個(gè)調(diào)度策略和優(yōu)先級(jí),決定何時(shí)以及如何分配到處理器上。線程或線程組的調(diào)度策略可以使用這些函數(shù)通過屬性對(duì)象來設(shè)置:調(diào)用形式*include<pthread.h>*include<sched.h>intpthread_attr_setinheritsched(pthread_attr_t*attr,intinheritsched);voidpthread_attr_setschedpolicy(pthread_attr_t*attr,intpolicy);intpthread_attr_setschedparam(pthread_attr_t*restrictattr,conststructsched_param*restrictparam);pthread_attr_setinheritesched()用于確定如何設(shè)置線程的調(diào)度屬性,可以從創(chuàng)立者線程或從一個(gè)屬性對(duì)象來繼承調(diào)度屬性。inheritsched可以為如下值:PTHREAD_INHERIT_SCHED:線程調(diào)度屬性是從創(chuàng)立者線程繼承得到,attr的任何調(diào)度屬性都被忽略。PTHREAD_E*PLICIT_SCHED:線程調(diào)度屬性設(shè)置為屬性對(duì)象attr的調(diào)度屬性。如果inheritsched值是PTHREAD_E*PLICIT_SCHED,則pthread_attr_setschedpolicy()被用于設(shè)置調(diào)度策略,而pthread_attr_setschedparam()被用于設(shè)置優(yōu)先級(jí)。pthread_attr_setschedpolicy()設(shè)置線程屬性對(duì)象attr的調(diào)度策略。policy的值可以為在<sched.h>頭文件中定義的以下值。SCHED_FIFO:先進(jìn)先出調(diào)度策略,執(zhí)行線程運(yùn)行到完畢。SCHED_RR:輪詢調(diào)度策略,按照時(shí)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC 29110-5-1-1:2025 EN Systems and software engineering - Life cycle profiles for very small entities (VSEs) - Part 5-1-1: Software engineering guidelines for the gener
- 【正版授權(quán)】 ISO/IEC 27035-4:2024 EN Information technology - Information security incident management - Part 4: Coordination
- 酒店設(shè)施改造與管理輸出合同
- 網(wǎng)絡(luò)安全評(píng)估及防護(hù)服務(wù)合同
- 掛靠房地產(chǎn)公司協(xié)議書
- 簡(jiǎn)易離婚協(xié)議書
- 技師勞動(dòng)合同
- 愛眼日學(xué)?;顒?dòng)方案(3篇)
- 美容院會(huì)員卡轉(zhuǎn)讓合同
- 網(wǎng)絡(luò)直播活動(dòng)策劃方案
- 《社區(qū)康復(fù)》課件-第一章 總論
- 浙江省2023年中考語文試題【8套】(含答案)
- 4.1.2 實(shí)數(shù)指數(shù)冪-參考課件
- 【工商管理專業(yè)畢業(yè)綜合訓(xùn)練報(bào)告2600字(論文)】
- 小學(xué)生四年級(jí)健康知識(shí)講座
- 中醫(yī)主任述職報(bào)告
- 通防培訓(xùn)課件
- 音樂識(shí)譜節(jié)奏訓(xùn)練課件
- 七年級(jí)數(shù)學(xué)上冊(cè)期末試卷(可打印)
- 學(xué)前兒童游戲(中職學(xué)前教育專業(yè))PPT完整版全套教學(xué)課件
- GN汽車吊吊裝專項(xiàng)安全方案講義
評(píng)論
0/150
提交評(píng)論