![關(guān)于進(jìn)程和線程_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/a51a9f1f-044a-47c8-abfa-56e1bb066b6e/a51a9f1f-044a-47c8-abfa-56e1bb066b6e1.gif)
![關(guān)于進(jìn)程和線程_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/a51a9f1f-044a-47c8-abfa-56e1bb066b6e/a51a9f1f-044a-47c8-abfa-56e1bb066b6e2.gif)
![關(guān)于進(jìn)程和線程_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/a51a9f1f-044a-47c8-abfa-56e1bb066b6e/a51a9f1f-044a-47c8-abfa-56e1bb066b6e3.gif)
![關(guān)于進(jìn)程和線程_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/a51a9f1f-044a-47c8-abfa-56e1bb066b6e/a51a9f1f-044a-47c8-abfa-56e1bb066b6e4.gif)
![關(guān)于進(jìn)程和線程_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/a51a9f1f-044a-47c8-abfa-56e1bb066b6e/a51a9f1f-044a-47c8-abfa-56e1bb066b6e5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、線程和進(jìn)程1-線程和進(jìn)程的區(qū)別:線程:是一種輕量級進(jìn)程,線程存在于進(jìn)程中。線程和進(jìn)程一樣都會被操作系統(tǒng)調(diào)度(時間片)通常線程指的是共享相同地址空間的多個任務(wù)。線程優(yōu)勢:線程運(yùn)行時,相互切換效率高;線程之間共享數(shù)據(jù)很方便。進(jìn)程擁有獨(dú)立的運(yùn)行空間,一個進(jìn)程崩潰后,在保護(hù)模式下并不會影響其他的進(jìn)程。一個進(jìn)程中可以包含有多個線程,而一個線程只能包含在進(jìn)程中。一個線程擁有自己獨(dú)有的局部變量棧,但是沒有獨(dú)立的空間,一個進(jìn)程中多個線程共同共享一塊資源,因此當(dāng)一個線程崩潰后此進(jìn)程也會崩潰。因此多進(jìn)程要比多線程健壯性要好,但是,多進(jìn)程效率比較低。當(dāng)需要并行操作和共享某些變量最好使用多線程的模式。2關(guān)于線程的創(chuàng)建
2、:n int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void * (* routine)(void *), void *arg)n 參數(shù):thread, 線程的標(biāo)識符(類似于進(jìn)程的pid號) attr, 用于指定創(chuàng)建的線程的屬性, 通常為NULL(不需要設(shè)置) routine, 函數(shù)指針,該函數(shù)就是線程主體 arg, 就是傳遞給函數(shù)的參數(shù)。返回值:成功返回0, 失敗返回非負(fù)的錯誤號n int pthread_exit(void *value_ptr) n 功能:只會導(dǎo)致當(dāng)前線程的退出函數(shù)n 參數(shù):就是傳遞的退
3、出狀態(tài)(指針)n 通常使用: pthread_exit(0); n 返回值:成功返回0, 失敗返回非負(fù)的錯誤號n 進(jìn)程對已經(jīng)退出的線程必須要做回收線程資源的操作(否則會產(chǎn)生僵尸線程)n int pthread_join(pthread_t thread, void *value_ptr) n 功能:阻塞等待回收退出的線程的資源n 參數(shù): thread, 就是指定要回收的線程資源 value_ptr, 就是接收到線程的退出狀態(tài)。n 返回值:成功返回0, 失敗返回非負(fù)的錯誤號 3線程的控制:n 互斥鎖 :主要用來保護(hù)臨界資源(可是變量,后者是代碼段) 任何時刻最多只能有一個線程能訪問該資源相關(guān)函數(shù)
4、接口:n int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr)n 功能:鎖的初始化函數(shù),即生成一把鎖n 參數(shù): mutex, 是鎖的標(biāo)識符 attr, 設(shè)置鎖的屬性, 通常為NULL。n 返回值:成功返回0, 失敗返回非負(fù)的錯誤號 n int pthread_mutex_lock(pthread_mutex_t *mutex)n 功能:阻塞等待直到這把鎖申請成功為止,對臨界資源進(jìn)行上鎖操作n 參數(shù): mutex, 就是指定的一把鎖 n 返回值:成功返回0, 失敗返回非負(fù)的錯誤號n int pthrea
5、d_mutex_unlock(pthread_mutex_t *mutex) n 功能:對臨界資源進(jìn)行解鎖操作n 參數(shù): mutex, 就是指定要解開的鎖 n 返回值:成功返回0, 失敗返回非負(fù)的錯誤號 n int pthread_mutex_destroy(pthread_mutex_t *mutex);n 功能:銷毀一把指定的鎖n 參數(shù): mutex, 就是指定要銷毀的鎖 n 返回值:成功返回0, 失敗返回非負(fù)的錯誤號注意: 為了避免死鎖:在申請多把鎖時,所有的線程都按照同樣的順序去申請。4線程之間的通信:int pthread_cond_init(pthread_cond_t *rest
6、rict cond,const pthread_condattr_t *restrict attr);n 功能:初始化一個條件變量n 參數(shù):cond, 就是條件變量的標(biāo)識符 attr, 通常為NULL即可n 返回值:成功返回0, 失敗返回非負(fù)的錯誤號 n int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);n 功能:條件睡眠,直到被指定的條件喚醒為止n 參數(shù): cond, 就是指定睡眠 條件,將來被喚醒時也必須滿足該條件 mutex, 該函數(shù)睡眠時必須提前加上一把鎖n 注意:
7、該睡眠函數(shù)調(diào)用之前必須先加上一把鎖,然后進(jìn)入睡眠,然后該函數(shù)內(nèi)部n 將鎖解開;當(dāng)該函數(shù)被喚醒時,需要重新加上這把鎖,如果發(fā)現(xiàn)這把鎖被其他線程 占用,那么該函數(shù)的喚醒操作就失敗了,繼續(xù)睡眠。 n 返回值:成功返回0, 失敗返回非負(fù)的錯誤號 n int pthread_cond_signal(pthread_cond_t *cond);n 功能:就是喚醒睡眠在cond條件上的線程,但是只能喚醒一個線程n 參數(shù): cond, 就是指定要喚醒的條件n 返回值:成功返回0, 失敗返回非負(fù)的錯誤號 n int pthread_cond_broadcast(pthread_cond_t *cond);n 功
8、能:喚醒所有睡眠這個條件上的線程n int pthread_cond_destroy(pthread_cond_t *cond);n 功能:就是銷毀條件變量 5-處理消息隊列n 創(chuàng)建/打開消息隊列對象n int msgget(key_t key, int flag);n 參數(shù):key, ftok()函數(shù)的返回值,用于確保多個進(jìn)程操作同一個消息隊列n flag, IPC_CREAT IPC_EXCL 和共享內(nèi)存一樣n 返回值:成功返回消息隊列的標(biāo)識符, 失敗-1n 比如:msgget(key, IPC_CREAT|IPC_EXCL|0666);n int msgsnd(int msqid, co
9、nst void *msgp, size_t msgsz, int msgflg);n 參數(shù):msgid, msgget的返回值 msgp, 要發(fā)送的數(shù)據(jù)的指針,有指定的數(shù)據(jù)格式。 struct msgbuf long mtype; /* message type, must be > 0 */ 數(shù)據(jù)類型,可以自定義; /* message data */ int a; char b; float f; ; msgsz, 發(fā)送的消息的正文的長度 = sizeof(struct msgbuf) - sizeof(long) msgflg,IPC_NOWAIT 以非阻塞方式發(fā)送消息,如果發(fā)送
10、不成功,那么不會阻塞,立刻返回。n 0(常用), 以阻塞方式發(fā)送消息,如果發(fā)送不成功,那么阻塞等待,直到發(fā)送成功為止。n 返回值:成功0, 失敗-1n ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);n 參數(shù):msqid, msgget的返回值 msgp, 用于接收讀取到的消息,固定格式,必須和發(fā)送的類型保持一致。 msgsz, 仍然要接收的消息的正文長度 msgtyp, 0, 表示讀取第一條消息 > 0, 表示讀取指定類型消息(最常用) <0, 接收消息隊列中類型值不小于ms
11、gtyp的絕對值且類型值又最小的消息 msgflg, IPC_NOWAIT 以非阻塞方式接收消息,如果接收不成功,那么不會阻塞,立刻返回。 0(常用), 以阻塞方式接收消息,如果接收不成功,那么阻塞等待,直到接收成功為止。n 返回值:實(shí)際接收到的消息的正文的字節(jié)個數(shù) , 失敗-1. n 消息隊列的控制函數(shù)n int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );n 參數(shù): msgqid, 就是控制的消息隊列 cmd : IPC_STAT (獲取對象屬性), 屬性保存在第三個參數(shù)上 IPC_SET (設(shè)置對象屬性),第三個參數(shù)保存的是要
12、修改的屬性 IPC_RMID (刪除對象), 此時第三個參數(shù)為NULL即可n 返回值:返回值和cmd有關(guān)系, 失敗-1.6共享內(nèi)存n 共享內(nèi)存:是一種最為高效的進(jìn)程間通信方式,進(jìn)程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝n 注意:由于多個進(jìn)程共享一段內(nèi)存,因此也需要依靠某種同步機(jī)制來控制對它的寫操作,如互斥鎖和信號量等 n #include <sys/shm.h>n key_t ftok(const char *pathname, int proj_id);n 功能:就是生成key值。n 參數(shù):pathname, 任意一個存在的路徑都可以 proj_id, 只要低8位(二進(jìn)制)不全
13、為0的數(shù)都可以n 返回值:成功key值, 失敗-1. n 比如:key = ftok(".", 'a');n 創(chuàng)建/打開共享內(nèi)存:創(chuàng)建于當(dāng)前系統(tǒng)上,保存到系統(tǒng)關(guān)閉為止。n int shmget(key_t key, int size, int shmflg);n 參數(shù):key, 用于唯一的標(biāo)識一塊共享內(nèi)存,將來其他進(jìn)程需要使用一樣的key值。 IPC_PRIVATE,表示該物理空間只能自己用,無法和其他進(jìn)程共享。 ftok()函數(shù)的返回值 size, 要申請的共享內(nèi)存物理空間, /usr/inclue/linux/shm.h中包含限制 shmflg, IPC
14、_CREAT IPC_EXCLIPC_CREAT 如果共享內(nèi)存不存在,則創(chuàng)建一個共享內(nèi)存,否則打開操作。IPC_EXCL 只有在共享內(nèi)存不存在的時候,新的共享內(nèi)存才建立,否則就產(chǎn)生錯誤。n 返回值:就是共享內(nèi)存的標(biāo)識符(大于0),失敗-1. 比如:key = ftok(".", 'a');int shmid;shmid = shmget(key, 512, IPC_CREAT|IPC_EXCL|0666);n 映射共享內(nèi)存,即把指定的共享內(nèi)存映射到進(jìn)程的地址空間用于訪問n void *shmat(int shmid, const void *shmaddr,
15、 int shmflg);n 參數(shù):shmid, 就是shmget的返回值 shmaddr, 用于指定共享內(nèi)存映射到當(dāng)前進(jìn)程的那個起始地址上 如果為NULL, 那么系統(tǒng)幫助進(jìn)程分配(最常用) 如果非NULL, 那么就是自己指定(必須保證這塊空間沒有被使用) shmflg, 指定進(jìn)程對該內(nèi)存區(qū)域的讀寫權(quán)限 如果為SHM_RDONLY ,那么當(dāng)前進(jìn)程只讀 如果為0, 那么當(dāng)前進(jìn)程可讀可寫(最常用)n 返回值:返回當(dāng)前進(jìn)程和共享內(nèi)存映射后的起始地址 失敗返回的為(void*)(-1)撤銷共享內(nèi)存映射n int shmdt(const void *shmaddr);p 參數(shù):shmaddr, 就是sh
16、mat的返回值p 返回值:成功0, 失敗-1p 操作共享內(nèi)存對象n int shmctl(int shmid, int cmd, struct shmid_ds *buf); / 獲取共享內(nèi)存的狀態(tài),并把相關(guān)的屬性賦值給bufp 功能:控制共享內(nèi)存對象p 參數(shù): shmid, shmget的返回值 cmd : IPC_STAT (獲取對象屬性), 屬性保存在第三個參數(shù)上 IPC_SET (設(shè)置對象屬性),第三個參數(shù)保存的是要修改的屬性 IPC_RMID (刪除對象), 此時第三個參數(shù)為NULL即可p 返回值:返回值和cmd有關(guān)系, 失敗-1.n 比如:shmctl(shmid, IPC_RMI
17、D, NULL); n 創(chuàng)建/打開信號量集合n int semget(key_t key, int nsems, int semflg);n 參數(shù):n key, ftok()返回值n nsems, 指定的信號量集合中的信號量個數(shù)n semflg, n IPC_CREATn IPC_EXCLn IPC_CREAT 如果共享內(nèi)存不存在,則創(chuàng)建一個共享內(nèi)存,否則打開操作。n IPC_EXCL 只有在共享內(nèi)存不存在的時候,新的共享內(nèi)存才建立,否則就產(chǎn)生錯誤。n 返回值:返回該集合的標(biāo)識符,失敗-1. n n int semctl(int semid, int semnum, int cmd, .);p
18、 功能:信號量集合的控制p 參數(shù):semid, 指定要操作的集合 semnum, 要操作的信號量的編號,編號從0開始 cmd,GETVAL:獲取信號燈的值, 返回值是獲得值。 比如:value = semctl(semid, 0, GETVAL); SETVAL:設(shè)置信號燈的值,需要用到第四個參數(shù)。因此在設(shè)置信號燈的值時應(yīng)該及時的設(shè)置共用體semun的值 第四個參數(shù)類型如下: union semun int val; /* Value for SETVAL */ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ unsigned
19、short *array; /* Array for GETALL, SETALL */ struct seminfo *_buf; /* Buffer for IPC_INFO (Linux-specific) */ ;n int semop ( int semid, struct sembuf *opsptr, unsigned nops);n 功能:就是對信號量集合中的信號量進(jìn)行PV操作n 參數(shù): semid, 指定要操作的集合 opsptr, struct sembuf unsigned short sem_num; /* semaphore number */ short sem_o
20、p; /* semaphore operation */ short sem_flg; /* operation flags */ ; 成員分析: sem_num 表示要操作的信號量的編號 sem_op, 表示進(jìn)行P或者V操作, 比如:sem_op = 10(+10) sem_op = -10(-10) sem_op = 0, 那么semop函數(shù)會等到該信號量的值變?yōu)?為止。 sem_flg, 0(最常用的),表示semop函數(shù)的操作是阻塞的,直到成功為止。 IPC_NOWAIT,表示semop函數(shù)的操作是非阻塞的,如果操作沒有成功,立刻返回。 SEM_UNDO(不常用),設(shè)置只對當(dāng)前進(jìn)程有效
21、,不會保存到系統(tǒng)的信號量集合中。 nops, 調(diào)用一次semop要操作的信號量的個數(shù)n 返回值:成功0, 失敗-1 7-linux 管道、消息隊列、共享內(nèi)存的對比n 管道的優(yōu)點(diǎn)是不需要加鎖,缺點(diǎn)是默認(rèn)緩沖區(qū)太小,只有4K,同時只適合父子進(jìn)程間通信,而且一個管道只適合單向通信,如果要雙向通信需要建立兩個。而且不適合多個子進(jìn)程,因為消息會亂,它的發(fā)送接收機(jī)制是用read/write這種適用流的,缺點(diǎn)是數(shù)據(jù)本身沒有邊界,需要應(yīng)用程序自己解釋,而一般消息大多是一個固定長的消息頭,和一個變長的消息體,一個子進(jìn)程從管道read到消息頭后,消息體可能被別的子進(jìn)程接收到n 消息隊列也不要加鎖,默認(rèn)緩沖區(qū)和單消
22、息上限都要大一些,在我的suse10上是64K,它并不局限于父子進(jìn)程間通信,只要一個相同的key,就可以讓不同的進(jìn)程定位到同一個消息隊列上,它也可以用來給雙向通信,不過稍微加個標(biāo)識,可以通過消息中的type進(jìn)行區(qū)分,比如一個任務(wù)分派進(jìn)程,創(chuàng)建了若干個執(zhí)行子進(jìn)程,不管是父進(jìn)程發(fā)送分派任務(wù)的消息,還是子進(jìn)程發(fā)送任務(wù)執(zhí)行的消息,都將type設(shè)置為目標(biāo)進(jìn)程的pid,因為msgrcv可以指定只接收消息類型為type的消息,這樣就實(shí)現(xiàn)了子進(jìn)程只接收自己的任務(wù),父進(jìn)程只接收任務(wù)結(jié)果n 共享內(nèi)存的幾乎可以認(rèn)為沒有上限,它也是不局限與父子進(jìn)程,采用跟消息隊列類似的定位方式,因為內(nèi)存是共享的,不存在任何單向的限制
23、,最大的問題就是需要應(yīng)用程序自己做互斥,有如下幾種方案1 只適用兩個進(jìn)程共享,在內(nèi)存中放一個標(biāo)志位,一定要聲明為volatile,大家基于標(biāo)志位來互斥,例如為0時第一個可以寫,第二個就等待,為1時第一個等待,第二個可以寫/讀2 也只適用兩個進(jìn)程,是用信號,大家等待不同的信號,第一個寫完了發(fā)送信號2,等待信號1,第二個等待信號2,收到后讀取/寫入完,發(fā)送信號1,它不是用更多進(jìn)程是因為雖然父進(jìn)程可以向不同子進(jìn)程分別發(fā)送信號,但是子進(jìn)程收到信號會同時訪問共享內(nèi)存,產(chǎn)生不同子進(jìn)程間的競態(tài)條件,如果用多塊共享內(nèi)存,又存在子進(jìn)程發(fā)送結(jié)果通知信號時,父進(jìn)程收到信號后,不知道是誰發(fā)送,也意味著不知道該訪問哪塊
24、共享內(nèi)存,即使子進(jìn)程發(fā)送不同的結(jié)果通知信號,因為等待信號的一定是阻塞的,如果某個子進(jìn)程意外終止,父進(jìn)程將永遠(yuǎn)阻塞下去,而不能超時處理3 采用信號量或者msgctl自己的加鎖、解鎖功能,不過后者只適用于linux總結(jié):n 管道是最弱的,只適合有限場景;n 消息隊列能適合大部分場景,缺點(diǎn)是默認(rèn)緩沖也比較小,不過這個可以調(diào)整,前提是你有管理員權(quán)限;n 共享內(nèi)存是最強(qiáng)大的,只是要做互斥n 進(jìn)程間通信: 1.管道(pipe)及有名管道(named pipe):管道可用于具有親緣關(guān)系的父子進(jìn)程間的通信,有名管道除了具有管道所具有的功能外,它還允許無親緣關(guān)系進(jìn)程間的通信。 2
25、.信號(signal):信號是在軟件層次上對中斷機(jī)制的一種模擬,它是比較復(fù)雜的通信方式,用于通知進(jìn)程有某事件發(fā)生,一個進(jìn)程收到一個信號與處理器收到一個中斷請求效果上可以說是一致的。 3.消息隊列(message queue):消息隊列是消息的鏈接表,它克服了上兩種通信方式中信號量有限的缺點(diǎn),具有寫權(quán)限得進(jìn)程可以按照一定得規(guī)則向消息隊列中添加新信息;對消息隊列有讀權(quán)限得進(jìn)程則可以從消息隊列中讀取信息。 4.共享內(nèi)存(shared memory):可以說這是最有用的進(jìn)程間通信方式。它使得多個進(jìn)程可以訪問同一塊內(nèi)存空間,不同進(jìn)程可以及時看到對方進(jìn)程中對共享
26、內(nèi)存中數(shù)據(jù)得更新。這種方式需要依靠某種同步操作,如互斥鎖和信號量等。 5.信號量(semaphore):主要作為進(jìn)程之間及同一種進(jìn)程的不同線程之間得同步和互斥手段。 6.套接字(socket):這是一種更為一般得進(jìn)程間通信機(jī)制,它可用于網(wǎng)絡(luò)中不同機(jī)器之間的進(jìn)程間通信,應(yīng)用非常廣泛while (1)pthread_mutex_lock(&mutex_sms);pthread_cond_wait(&cond_sms, &mutex_sms); /等待發(fā)送短信條件buf = dev_sms_cmd;printf ("pthread_sms is wa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 礦產(chǎn)品供貨協(xié)議合同
- 有車輛的離婚協(xié)議書
- 北京商品房認(rèn)購協(xié)議書
- 農(nóng)業(yè)種植技術(shù)指導(dǎo)書
- 純技術(shù)入股合作的協(xié)議書
- 湖南離婚協(xié)議書年
- 三農(nóng)村土地整治與開發(fā)方案
- 托管班合作協(xié)議書
- 股權(quán)融資合同書
- 標(biāo)準(zhǔn)汽車租賃合同協(xié)議
- 中華人民共和國學(xué)前教育法
- 2024年貴州公務(wù)員考試申論試題(B卷)
- 三年級(下冊)西師版數(shù)學(xué)全冊重點(diǎn)知識點(diǎn)
- 期末練習(xí)卷(試題)-2024-2025學(xué)年四年級上冊數(shù)學(xué)滬教版
- 2025年公務(wù)員考試申論試題與參考答案
- 抑郁癥課件教學(xué)課件
- 關(guān)于消防安全評估設(shè)備操作說明詳解
- 2009年公務(wù)員國考《申論》真題卷及答案(地市、副?。?/a>
- 2025年高考作文專練(25道真題+審題立意+范文)- 2025年高考語文作文備考總復(fù)習(xí)
- 中國高血壓防治指南(2024年修訂版)要點(diǎn)解讀
- 二十屆三中全會精神應(yīng)知應(yīng)會知識測試30題(附答案)
評論
0/150
提交評論