freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

四川大學(xué)linux第4章unix進(jìn)程管理及進(jìn)程通信(存儲(chǔ)版)

  

【正文】 for (i=1。 } exit(0)。 管道 管道有兩種類型:無(wú)名管道和有名管道。如果一個(gè)進(jìn)程不使用有名管道時(shí),用系統(tǒng)函數(shù) close()關(guān)閉管道。 ? 操作系統(tǒng)核心將索引節(jié)點(diǎn)中的直接地址塊作為一個(gè)循環(huán)隊(duì)列管理,設(shè)置一個(gè)寫指針和一個(gè)讀指針。 管道 ? 當(dāng)一個(gè)進(jìn)程讀管道,核心檢查到管道中有數(shù)據(jù)時(shí),讀進(jìn)程就從索引節(jié)點(diǎn)讀指針標(biāo)記處開(kāi)始讀,讀完后核心會(huì)將當(dāng)前偏移量保存在索引節(jié)點(diǎn)中并喚醒等待寫進(jìn)程。 char buf[]。首先進(jìn)程創(chuàng)建一個(gè)無(wú)名管道,然后向該管道寫入字符,再將寫入的字符讀出。 /*關(guān)閉管道寫端 */ memset(inbuf, 0, sizeof(inbuf))。 main() { int filedes[2],i,pid。 printf(the parent process sended\n)。 printf(%s\n,inbuf)。 其中: pathname是要建立的特殊文件名(有名管道名、目錄名); type and permission給出特殊文件類型和訪問(wèn)權(quán)限; dev為塊特殊文件和字符特殊文件規(guī)定的主設(shè)備號(hào)和次設(shè)備號(hào)(此處是有名管道, dev參數(shù)為 0)。 該調(diào)用返回文件描述符。 管道 例 在同一進(jìn)程中首先創(chuàng)建一個(gè)有名管道,然后向該管道寫入字符,再將寫入的字符讀出。 exit(1)。 char buf[256]。 關(guān)閉管道的步驟是: ? 內(nèi)核首先處理讀寫進(jìn)程,如果無(wú)寫進(jìn)程、有讀進(jìn)程,內(nèi)核會(huì)喚醒讀進(jìn)程并讓其讀系統(tǒng)函數(shù)調(diào)用空數(shù)據(jù)返回; ? 如果有寫進(jìn)程、無(wú)讀進(jìn)程,內(nèi)核會(huì)喚醒寫進(jìn)程并發(fā)送一個(gè)發(fā)生錯(cuò)誤的信號(hào)(向某個(gè)非讀的進(jìn)程管道中寫入數(shù)據(jù))給寫進(jìn)程。文件塊的管理形式也是一個(gè)循環(huán)隊(duì)列管理,先進(jìn)先出。 ? 與無(wú)名管道不同的是,有名管道在訪問(wèn)之前必須用系統(tǒng)函數(shù) open()打開(kāi)。 /* 在讀管道之前確保父進(jìn)程關(guān)閉寫端 */ read(filedes[0],inbuf,23)。 } 管道 if (pid0) /* 父進(jìn)程 */ { close(filedes[0])。父進(jìn)程將數(shù)據(jù)發(fā)送給子進(jìn)程。 } write(filedes[1],string,23)。 其中: filedes[0]為從管道讀的描述符; 從管道讀出的數(shù)據(jù)放入 buf中; size是讀出的數(shù)據(jù)位組長(zhǎng)度。 管道 寫管道的函數(shù)格式如下: write(filedes[1],buf,size)。 ? 當(dāng)寫進(jìn)程不止一個(gè)時(shí),可能存在一個(gè)進(jìn)程寫入管道中的數(shù)據(jù)不連續(xù),其中會(huì)插入另一個(gè)進(jìn)程寫入的數(shù)據(jù)。 ? 為了提高進(jìn)程對(duì)管道的訪問(wèn)效率,管道文件只使用文件索引節(jié)點(diǎn)中的直接地址項(xiàng) i_addr(0)~i_addr(9)。對(duì)有名管道的訪問(wèn)與對(duì)文件的訪問(wèn)完全相同。這樣的文件常被稱為管道( pipe)文件。 printf(exiting...\n)。 /***** This program is signal int, the program39。 printf(i=%d\n,i)。s name is sigexer1 ****/ include include include include void signalint(signum) int signum。 setitimer(ITIMER_VIRTUAL,value,NULL)。 =sighandler。 /* 在父進(jìn)程中發(fā)送信號(hào) SIGUSR1給子進(jìn)程 */ kill(pid,SIGUSR1)。) { sleep(1)。 include include include include includesys/ int ntimes=0。 sa_flags中包含了許多標(biāo)志位,如 SA_NODEFER、SA_NOMASK和 SA_SIGINFO標(biāo)志位。 /* 退出狀態(tài) */ clock_t si_utime。 _sa_handler指定的處理函數(shù)只有一個(gè)參數(shù),即信號(hào)值。當(dāng)多種類型的信號(hào)到達(dá)時(shí),接收進(jìn)程的信號(hào)域中有多個(gè)域被置位,但對(duì)同類信號(hào),接收進(jìn)程只能記住其中一個(gè)。 即使 SIGABORT被進(jìn)程設(shè)置為阻塞信號(hào),調(diào)用 abort()后,SIGABORT仍然能被進(jìn)程接收。 /* current value */ }。 如果參數(shù) seconds為零,那么進(jìn)程內(nèi)將不再包含任何鬧鐘時(shí)間。函數(shù)調(diào)用成功返回0值。 $kill –17 129 信號(hào) ( 2) sigqueue() 函數(shù) 函數(shù) sigqueue()用于發(fā)送具有傳遞參數(shù)的信號(hào),其語(yǔ)法格式如下: int sigqueue(pid_t pid,int sig, const union sigval val)。 其中, pid是指定信號(hào)發(fā)往的進(jìn)程或進(jìn)程組的標(biāo)識(shí)符,通常: pid為正值,則核心將信號(hào)發(fā)送給直接指定接收信號(hào)的進(jìn)程標(biāo)識(shí)符; pid為 0,則核心將信號(hào)發(fā)送給與發(fā)送進(jìn)程同組的所有進(jìn)程; pid為 1,則核心將信號(hào)發(fā)送給除自身以外的所有進(jìn)程; pid小于 1,則核心將信號(hào)發(fā)送給進(jìn)程組 gid為 pid的所有進(jìn)程; 信號(hào) ? 如果調(diào)用者不允許將信號(hào)傳送到由 pid指定的進(jìn)程,則 kill函數(shù)調(diào)用失敗,函數(shù)返回值為 1,并且設(shè)定錯(cuò)誤信號(hào)errno。其中 SIGKILL和SIGSTOP信號(hào)不能忽略; ( 2)捕捉信號(hào):定義信號(hào)處理函數(shù),當(dāng)信號(hào)發(fā)生時(shí),執(zhí)行相應(yīng)的處理函數(shù); ( 3)執(zhí)行缺省操作:對(duì)每種信號(hào)都有默認(rèn)操作。)的基礎(chǔ)上提出了可靠信號(hào)。實(shí)際上,這是相當(dāng)于用戶進(jìn)程通過(guò)“ CtrlC”操作向系統(tǒng)的控制進(jìn)程發(fā)送了信號(hào)。 ? Linux進(jìn)程通信繼承了 Unix進(jìn)程通信方式,有信號(hào)、管道、消息、共享存儲(chǔ)區(qū)和信號(hào)量。 進(jìn)程調(diào)度 先來(lái)先服務(wù)和時(shí)間片輪轉(zhuǎn)調(diào)度 ? 對(duì)于實(shí)時(shí)進(jìn)程, Linux采用的是先來(lái)先服務(wù)( FCFS)和時(shí)間片輪轉(zhuǎn)( RR)兩種調(diào)度策略。 ? 動(dòng)態(tài)優(yōu)先級(jí)高的進(jìn)程獲得 CPU的運(yùn)行權(quán) ,被 CPU運(yùn)行一個(gè)時(shí)間片后,被動(dòng)態(tài)優(yōu)先級(jí)更高的進(jìn)程,或者是處于普通進(jìn)程就緒隊(duì)列首部的進(jìn)程搶占,被搶占后的進(jìn)程則進(jìn)入下一個(gè)就緒隊(duì)列。在應(yīng)用中, counter表示進(jìn)程剩余的時(shí)間片。 進(jìn)程調(diào)度 進(jìn)程調(diào)度 ? Linux進(jìn)程調(diào)度首先將進(jìn)程分為實(shí)時(shí)進(jìn)程和普通進(jìn)程,并分別采用不同的調(diào)度策略。最后,把當(dāng)前進(jìn)程置為僵死狀態(tài),設(shè)置退出碼,并向其父進(jìn)程發(fā)送子進(jìn)程終止信號(hào),讓內(nèi)核重新調(diào)度任務(wù)的運(yùn)行。 ? 該程序包含進(jìn)程釋放、會(huì)話(進(jìn)程組)終止和程序退出處理函數(shù),殺死進(jìn)程、終止進(jìn)程、掛起進(jìn)程以及進(jìn)程信號(hào)發(fā)送函數(shù) send_sig()和通知父進(jìn)程子進(jìn)程終止的函數(shù)tell_father()等。如果內(nèi)核程序發(fā)生錯(cuò)誤,則會(huì)調(diào)用 panic(),顯示錯(cuò)誤并停機(jī)。 進(jìn)程控制 創(chuàng)建進(jìn)程 ? 在 Linux操作系統(tǒng)中,系統(tǒng)函數(shù) fork()創(chuàng)建新進(jìn)程。 /* 16 high bits zero */ long ldt。 long esi。 /* 16 high bits zero */ long esp2。 struct file * filp[NR_OPEN] 。 long start_time。 unsigned short gid。 long pid。 struct sigaction sigaction[32]。 ? 系統(tǒng)級(jí)上下文由進(jìn)程表表項(xiàng)(進(jìn)程描述符)、正在核心態(tài)運(yùn)行進(jìn)程的 U區(qū)、進(jìn)程區(qū)表表項(xiàng)和區(qū)表、頁(yè)表、核心棧。內(nèi)核將正處于核心態(tài)運(yùn)行進(jìn)程的 U區(qū)地址映射到該固定虛地址上。 在程序運(yùn)行過(guò)程中,堆棧段由操作系統(tǒng)創(chuàng)建并不斷刷新。則表明系統(tǒng)中存在不能被reboot發(fā)出的“ kill –9”殺掉的進(jìn)程,這些進(jìn)程很可能處于僵死狀態(tài); 進(jìn)程狀態(tài)及其轉(zhuǎn)換 (7) 停止( stopped):進(jìn)程被停止。產(chǎn)生不可中斷睡眠的原因一般是睡眠進(jìn)程還未進(jìn)入睡眠,而喚醒它的進(jìn)程的喚醒操作已經(jīng)發(fā)生。 ? 直接從終端讀寫的進(jìn)程為前臺(tái)進(jìn)程,正在運(yùn)行卻又無(wú)法直接從終端讀寫的進(jìn)程為后臺(tái)進(jìn)程。除根進(jìn)程之外,所有進(jìn)程都有一個(gè)父進(jìn)程。除根進(jìn)程之外,所有進(jìn)程都有一個(gè)父進(jìn)程。根進(jìn)程通過(guò)系統(tǒng)函數(shù)調(diào)用 fork創(chuàng)建初始化進(jìn)程 (init進(jìn)程,也稱為 1進(jìn)程 )。這些進(jìn)程長(zhǎng)期運(yùn)行在系統(tǒng)中,被稱為駐守進(jìn)程( daemon進(jìn)程)。 ? 無(wú)論何時(shí),當(dāng)用戶注冊(cè)登錄后,系統(tǒng)為用戶創(chuàng)建一個(gè)shell進(jìn)程(即用戶的 login shell),鍵入一個(gè)命令或執(zhí)行一個(gè)程序時(shí), shell進(jìn)程會(huì)產(chǎn)生一個(gè)相應(yīng)的子進(jìn)程;在子進(jìn)程中還可以創(chuàng)建子進(jìn)程,待用戶退出( exit)后,又把控制權(quán)還給 shell進(jìn)程。 ? 無(wú)論何時(shí),當(dāng)用戶注冊(cè)登錄后,系統(tǒng)為用戶創(chuàng)建一個(gè)shell進(jìn)程(即用戶的 login shell),鍵入一個(gè)命令或執(zhí)行一個(gè)程序時(shí), shell進(jìn)程會(huì)產(chǎn)生一個(gè)相應(yīng)的子進(jìn)程;在子進(jìn)程中還可以創(chuàng)建子進(jìn)程,待用戶退出( exit)后,又把控制權(quán)還給 shell進(jìn)程。 進(jìn)程狀態(tài)及其轉(zhuǎn)換 5 4 可中斷睡眠 ( interruptible) 不可中斷睡眠 ( uninterruptible) 7 6 僵死 ( zombie) 停止 ( stopped) 終止 終止 1 2 3 就緒 ( running) 核心態(tài)運(yùn)行 ( running) 用戶態(tài)運(yùn)行 ( running) 調(diào)度 返回 系統(tǒng)函數(shù)調(diào)用或中斷 睡眠 睡眠 喚醒 喚醒 中斷 圖 Linux進(jìn)程狀態(tài)及轉(zhuǎn)換 進(jìn)程狀態(tài)及其轉(zhuǎn)換 Linux操作系統(tǒng)采用如下的進(jìn)程狀態(tài)描述進(jìn)程的動(dòng)態(tài)過(guò)程: (1) 就緒 (Running):進(jìn)程處于預(yù)備運(yùn)行狀態(tài),等待系統(tǒng)分配處理器; (2) 核心態(tài)運(yùn)行 (Running):進(jìn)程運(yùn)行在操作系統(tǒng)核心空間。 (6) 僵死( zombie):由于父進(jìn)程死亡而被終止的進(jìn)程,雖然進(jìn)程已經(jīng)死亡,但沒(méi)有釋放系統(tǒng)資源,如沒(méi)有釋放內(nèi)存和 task_struct結(jié)構(gòu)等,所以被稱為處于僵死狀態(tài)。當(dāng)停止?fàn)顟B(tài)的進(jìn)程接收到 SIGCONT信號(hào)之后,將再次成為可運(yùn)行進(jìn)程。 進(jìn)程狀態(tài)及其轉(zhuǎn)換 ? 進(jìn)程控制塊分為常駐內(nèi)存和非常駐內(nèi)存兩部分。 進(jìn)程狀態(tài)及其轉(zhuǎn)換 ? 進(jìn)程上下文是進(jìn)程的環(huán)境,當(dāng)一個(gè)進(jìn)程在執(zhí)行時(shí),可以看成系統(tǒng)在進(jìn)程的上下文中執(zhí)行。 當(dāng)進(jìn)程的狀態(tài)描述為 1時(shí),表示進(jìn)程不可運(yùn)行。 unsigned long start_code。 long session。 long alarm。 unsigned short umask。 進(jìn)程狀態(tài)及其轉(zhuǎn)換 其中,任務(wù)狀態(tài)結(jié)構(gòu) tts保存了進(jìn)程的處理器狀態(tài),指定了構(gòu)成進(jìn)程執(zhí)行空間的各個(gè)段,定義為: struct tss_struct { long back_link。 long eip。 /* 16 high bits zero */ long cs。 }。 進(jìn)程控制 系統(tǒng)函數(shù) fork的實(shí)現(xiàn)步驟為: (1)如果有足夠資源,為新進(jìn)程創(chuàng)建進(jìn)程標(biāo)識(shí)符( pid)和進(jìn)程描述符,并將其組織到進(jìn)程表或鏈接到進(jìn)程隊(duì)列; (2)創(chuàng)建新進(jìn)程在內(nèi)核執(zhí)行所需要的新內(nèi)核空間; (3)將父進(jìn)程描述符拷貝到新進(jìn)程描述符; (4)修改新進(jìn)程描述符:將新進(jìn)程標(biāo)識(shí)符寫到新進(jìn)程描述符,創(chuàng)建到父進(jìn)程的鏈接,初始化進(jìn)程創(chuàng)建時(shí)間,需要運(yùn)行時(shí)間等新進(jìn)程私有信息; (5)對(duì)新進(jìn)程創(chuàng)建一個(gè)文件表,對(duì)父進(jìn)程文件表中的文件創(chuàng)建新的文件描述符,使得新進(jìn)程可以使用父進(jìn)程當(dāng)前已打開(kāi)的文件; (6)為新進(jìn)程創(chuàng)建數(shù)據(jù)段并將父進(jìn)程的數(shù)據(jù)段拷貝到其中; (7)拷貝虛擬存儲(chǔ)表; (8)將新進(jìn)程的狀態(tài)設(shè)置為就緒狀態(tài),從系統(tǒng)函數(shù)調(diào)用中返回; 進(jìn)程控制 ? 在 Linux核心中,系統(tǒng)函數(shù) fork創(chuàng)建新進(jìn)程的源代碼程序?yàn)?(位于 linux/kernel/),是 sys_fork()(在kernel/ 中定義)系統(tǒng)函數(shù)的輔助處理函數(shù)集,主要利用了三個(gè) C函數(shù): find_empty_process()和 copy_process()和 verify_area()實(shí)現(xiàn)。 進(jìn)程控制 結(jié)束進(jìn)程 ? 進(jìn)程代碼運(yùn)行結(jié)束或進(jìn)程中有系統(tǒng)函數(shù)調(diào)用 exit都會(huì)結(jié)束進(jìn)程。 ? 根據(jù)參數(shù) pid(進(jìn)程標(biāo)識(shí)號(hào))的數(shù)值的不同,該系統(tǒng)函數(shù)調(diào)用會(huì)向不同的進(jìn)程或進(jìn)程組發(fā)送信號(hào)。 ? 子進(jìn)程使用的所有資源將釋放。 進(jìn)程調(diào)度 ? 進(jìn)程調(diào)度準(zhǔn)則以 CPU的時(shí)間片為單位,并根據(jù)進(jìn)程相關(guān)參
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1