版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2016年秋季學(xué)期A卷、考查、開卷
課程名稱嵌入式系統(tǒng)開發(fā)
命題教師:姜愉適用班級(jí):物聯(lián)本151、152、153班
答卷說明:1.本試卷共1頁,1個(gè)大題,滿分100分,時(shí)間120分鐘。
學(xué)號(hào):1504412241姓名:藍(lán)意樂班別:物聯(lián)本152
題號(hào)一總分評(píng)分人
得分
一、作品題:(本大題共1大題,共100分)
實(shí)踐總結(jié)要求包括:
1、3000字以上;(10分)
2,詳細(xì)論述Linux系統(tǒng)下各目錄的主要功能;(10分)
3、論述shell的基本工作原理;(10分)
4、結(jié)合程序?qū)嵗敿?xì)論述常用的5種進(jìn)程通信方式;(20分)
5,對(duì)進(jìn)程與線程的區(qū)別進(jìn)行分析;(10分)
6、結(jié)合實(shí)例對(duì)gcc、gdb、make的實(shí)現(xiàn)方法做詳盡論述;(20分)
7,結(jié)合套接字理論對(duì)TCP、UDP通信原理進(jìn)行論述;(10分)
8、學(xué)習(xí)心得體會(huì)。(10分)
第1頁共1頁
一、詳細(xì)論述Linux系統(tǒng)下各目錄的主要功能。
目錄
1、樹狀目錄結(jié)構(gòu)圖
2、/目錄
3、/etc/目錄
4、/usi7目錄
5、/var/目錄
6、/proc/目錄
7、/dev/目錄
卜面紅色字體為比較竄要的目錄
1、樹狀目錄結(jié)構(gòu)圖
第2頁共2頁
t/Jggji
_[bn」的T4箕用的I阱
-―—)8動(dòng)文件.所有與系茨8
83』就有關(guān)的文件知某存在過里
-------(一dev,設(shè)備文件
(一——系毓不和大部分應(yīng)用
----------"J程序的g局配■文件
----------1hone,使用者個(gè)人冢目錄
----------(ib/[系挽聯(lián)摩文怦
-------(E/常雕蛇點(diǎn)
----------(0"/第三方&序安然
----------(proc/顯:T東現(xiàn)狀55文件
----------(,81」昔般家目呆
----------(sbtn1餐利一專用桿,
----------[imp/*「文件
2、/目錄
目錄描述
/第一層次結(jié)構(gòu)的根、整個(gè)文件系統(tǒng)層次結(jié)構(gòu)的根目錄。
需要在單用戶模式可用的必要命令(可執(zhí)行文件);面向所有用戶,例如:ca
/bin/
t、Is、cp,和/usr/bin類似。
第3頁共3頁
/boot/引導(dǎo)程序文件,例如:kernekinitrd;時(shí)常是一個(gè)單獨(dú)的分區(qū)⑹
/dev/必要設(shè)備,例如:,/dev/null.
特定主機(jī),系統(tǒng)范圍內(nèi)的配置文件。
關(guān)于這個(gè)名稱目前有爭議。在貝爾實(shí)驗(yàn)室關(guān)于UNIX實(shí)現(xiàn)文檔的早期版本中,/
etc被稱為/etcetra目錄,[7]這是由于過去此目錄中存放所有不屬于別處的所
/etc/
有東西(然而,F(xiàn)HS限制/etc存放靜態(tài)配置文件,不能包含二進(jìn)制文件)。[8]
自從早期文檔出版以來,目錄名稱已被以各種方式重新稱呼。最近的解釋包括
反向縮略語如:"可編輯的文本配置"(英文"EditableTextConfiguration")或
11擴(kuò)展工具箱"(英文"ExtendedToolChest")?[9]
/etc/opt//opt/的配置文件
/etc/Xll/X_Window系統(tǒng)(版本11)的配置文件
/etc/sgml/SGML的配置文件
/etc/xml/XML的配置文件
/home/用戶的家目錄,包含保存的文件、個(gè)人設(shè)置等,一般為單獨(dú)的分區(qū)。
/lib//bin/and/sbin/中二進(jìn)制文件必要的庫文件。
/media/可移除媒體(如CD-ROM)的掛載點(diǎn)(在FHS-2.3中事現(xiàn))。
在ext3文件系統(tǒng)中,當(dāng)系統(tǒng)意外崩潰或機(jī)器意外關(guān)機(jī),會(huì)產(chǎn)生一些文件碎片
在這里。當(dāng)系統(tǒng)在開機(jī)啟動(dòng)的過程中fsck工具會(huì)檢查這里,并修復(fù)已經(jīng)損壞的
/lost+found
文件系統(tǒng)。當(dāng)系統(tǒng)發(fā)生問題??赡軙?huì)有文件被移動(dòng)到這個(gè)目錄中,可能需要用
手工的方式來修復(fù),或移到文件到原來的位置上。
臨時(shí)掛載的文件系統(tǒng)。比如cdrom,u盤等,直接插入光驅(qū)無法使用,要先掛載
/mnt/
后使用
/opt/可選應(yīng)用軟件包。
虛擬文件系統(tǒng),將內(nèi)核叮進(jìn)程狀態(tài)歸檔為文本文件(系統(tǒng)信息都存放這目錄
/proc/下)。例如:uptime>networko在Linux中,對(duì)應(yīng)Proofs格式掛載。該目錄
下文件只能看不能改(包括root)
/root/超級(jí)用戶的家目錄
必要的系統(tǒng)二進(jìn)制文件,例如:init、ip、mountosbin目錄下的命令,普通
/sbin/
用戶都執(zhí)行不了。
/srv/站點(diǎn)的具體數(shù)據(jù),由系統(tǒng)提供。
/tmp/臨時(shí)文件(參見/var/tmp),在系統(tǒng)重啟時(shí)目錄中文件不會(huì)被保留。
/usr/默認(rèn)軟件都會(huì)存于該目錄下。用于存儲(chǔ)只讀用戶數(shù)據(jù)的第二層次;包含絕大多
第4頁共4頁
數(shù)的(多)用戶工具和應(yīng)用程序。
變量文件一一在正常運(yùn)行的系統(tǒng)中其內(nèi)容不斷變化的文件,如日志,脫機(jī)文件
/var/和臨時(shí)電子郵件文件。有時(shí)是一個(gè)單獨(dú)的分區(qū)。如果不單獨(dú)分區(qū),有可能會(huì)把
整個(gè)分區(qū)充滿。如果單獨(dú)分區(qū),給大給小都不合適。
3、/etc/目錄
特定主機(jī)系統(tǒng)范圍內(nèi)的配置文件。
目錄描述
/etc/rc/etc/rc.d
啟動(dòng)、或改變運(yùn)行級(jí)時(shí)運(yùn)行的scripts或scripts的目錄.
/etc/rc*.d
/etc/hosts本地域名解析文件
/etc/sysconfig/networkIP、掩碼、網(wǎng)關(guān)、主機(jī)名配置
/etc/resolv.confDNS服務(wù)器配置
/etc/fstab開機(jī)自動(dòng)掛載系統(tǒng),所有分區(qū)開機(jī)都會(huì)自動(dòng)掛載
設(shè)定系統(tǒng)啟動(dòng)時(shí)Init進(jìn)程將把系統(tǒng)設(shè)置成什么樣的runlevel
/etc/inittab
及加載相關(guān)的啟動(dòng)文件配置
/etc/exports設(shè)置NFS系統(tǒng)用的配置文件路徑
/etc/init.d這個(gè)目錄來存放系統(tǒng)啟動(dòng)腳本
/etc/profile,
全局系統(tǒng)環(huán)境配置變量
/etc/csh.login,/etc/csh.cshrc
/etc/issue認(rèn)證前的輸出信息,默認(rèn)輸出版本內(nèi)核信息
/etc/motd設(shè)置認(rèn)證后的輸出信息,
當(dāng)前安裝的文件系統(tǒng)列表.由scripts初始化,并由mount命
/etc/mtab令自動(dòng)更新.需要一個(gè)當(dāng)前安裝的文件系統(tǒng)的列表時(shí)使用,
例如df命令
/etc/group類似/etc/passwd,但說明的不是用戶而是組.
用戶數(shù)據(jù)庫,其中的域給出了用戶名、真實(shí)姓名、家目錄、
/etc/passwd
加密的口令和用戶的其他信息.
在安裝了影子口令軟件的系統(tǒng)上的影子口令文件.影子口令
/etc/shadow文件將/etc/passwd文件中的加密口令移動(dòng)到/etc/shadow
中,而后者只對(duì)root可讀.這使破譯口令更困難.
/etc/sudoers可以sudo命令的配置文件
/etc/syslog.conf系統(tǒng)日志參數(shù)配置
第5頁共5頁
/etc/login.defs設(shè)置用戶帳號(hào)限制的文件
確認(rèn)安全終端,即哪個(gè)終端允許root登錄.一般只列出虛擬
/etc/securetty控制臺(tái),這樣就不可能(至少很困難)通過modem或網(wǎng)絡(luò)闖
入系統(tǒng)并得到超級(jí)用戶特權(quán).
/etc/printcap類似/etc/termcap,但針對(duì)打印機(jī).語法不同.
列出可信任的shell.chsh命令允許用戶在本文件指定范圍
內(nèi)改變登錄shell.提供一臺(tái)機(jī)器FTP服務(wù)的服務(wù)進(jìn)程ftpd檢
/etc/shells
查用戶shell是否列在/etc/shells文件中,如果不是將不允
許該用戶登錄.
如果服務(wù)器是通過xinetd模式運(yùn)行的,它的腳本要放在這
/etc/xinetd.d個(gè)目錄下。有些系統(tǒng)沒有這個(gè)目錄,比如Slackware,有些
老的版本也沒有。在RedhatFedora中比較新的版本中存在。
/etc/opt//opt/的配置文件
/etc/Xll/X_Window系統(tǒng)(版本11)的配置文件
/etc/sgml/SGML的配置文件
/etc/xml/XML的配置文件
/etc/skel/默認(rèn)創(chuàng)建用戶時(shí),把該目錄拷貝到家目錄下
4、/usr/目錄
默認(rèn)軟件都會(huì)存于該目錄卜;用于存儲(chǔ)只讀用戶數(shù)據(jù)的第二層次;包含絕大多數(shù)的用戶工具和應(yīng)用程序.
目錄描述
/usr/XHR6存放X-Windows的目錄;
/usr/games存放著XteamLinux自帶的小游戲;
/usr/docLinux技術(shù)文檔;
/usr/include用來存放Linux下開發(fā)和編譯應(yīng)用程序所需要的頭文件;
/usr/lib存放一些常用的動(dòng)態(tài)鏈接共享庫和靜態(tài)檔案庫;
/usr/man幫助文檔所在的目錄;
/usr/srcLinux開放的源代碼,就存在這個(gè)目錄,愛好者們別放過哦;
/usr/bin/非必要可執(zhí)行文件(在單用戶模式中不需要);面向所有用戶。
/usr/lib//usr/bin/和/usr/sbin/中二進(jìn)制文件的庫。
/usr/sbin/非必要的系統(tǒng)二進(jìn)制文件,例如:大量網(wǎng)絡(luò)服務(wù)的守護(hù)進(jìn)程。
第6頁共6頁
/usr/share/體系結(jié)構(gòu)無關(guān)(共享)數(shù)據(jù)。
/usr/src/源代碼,例如吶核源代碼及其頭文件。
/usr/XHR6/XWindow系統(tǒng)版本11,Release6.
本地?cái)?shù)據(jù)的第三層次,具體到本臺(tái)主機(jī)。通常而言有進(jìn)一步的子目錄,例如:
/usr/local/bin/、lib/、share/.這是提供給一般用戶的/usr目錄,在這里安裝一般的應(yīng)用
軟件;
5、/var/目錄
/var包括系統(tǒng)般運(yùn)行時(shí)要改變的數(shù)據(jù).每個(gè)系統(tǒng)是特定的,即不通過網(wǎng)絡(luò)與其他計(jì)算機(jī)共享.
目錄描述
/var/log/message日志信息,按周自動(dòng)輪詢
/var/spool/cron/root定時(shí)器配置文件目錄,默認(rèn)按用戶命名
記錄登陸系統(tǒng)存取信息的文件,不管認(rèn)證成功還是認(rèn)證失敗都
/var/log/secure
會(huì)記錄
/var/log/wtmp記錄登陸者信息的文件,last,who,w命令信息來源于此
當(dāng)郵件服務(wù)未開啟時(shí),所有應(yīng)發(fā)給系統(tǒng)管理員的郵件都將堆放
/var/spool/clientmqueue/
在此
/var/spool/mail/郵件目錄
比/tmp允許的大或需要存在較長時(shí)間的臨時(shí)文件.(雖然系統(tǒng)
/var/tmp
管理員可能不允許/var/tmp有很舊的文件.)
/var/lib系統(tǒng)正常運(yùn)行時(shí)要改變的文件.
/usr/local中安裝的程序的可變數(shù)據(jù)(即系統(tǒng)管理員安裝的程
/var/local序).注意,如果必要,即使本地安裝的程序也會(huì)使用其他/var目
錄,例如/var/lock.
鎖定文件.許多程序遵循在/var/lock中產(chǎn)生一個(gè)鎖定文件的約
/var/lock定,以支持他們正在使用某個(gè)特定的設(shè)備或文件.其他程序注意
到這個(gè)鎖定文件,將不試圖使用這個(gè)設(shè)備或文件.
/var/log/各種程序的Log文件,特別是login(/var/log/wtmplog所有到
第7頁共7頁
系統(tǒng)的登錄和注銷)和syslog(/var/log/messages里存儲(chǔ)所有核
心和系統(tǒng)程序信息./var/bg里的文件經(jīng)常不確定地增長,應(yīng)該
定期清除.
保存到下次引導(dǎo)前有效的關(guān)于系統(tǒng)的信息文件.例如,
/var/run
/var/run/utmp包含當(dāng)前登錄的用戶的信息.
應(yīng)用程序緩存數(shù)據(jù)。這些數(shù)據(jù)是在本地生成的一個(gè)耗時(shí)的I/O
/var/cache/或計(jì)算結(jié)果。應(yīng)用程序必須能夠再生或恢復(fù)數(shù)據(jù)。緩存的文件
可以被刪除而不導(dǎo)致數(shù)據(jù)丟失。
6、/proc/目錄
虛擬文件系統(tǒng),將內(nèi)核與進(jìn)程狀態(tài)歸檔為文本文件(系統(tǒng)信息都存:放這目錄下)。
例如:uptime、networko在Linux「3對(duì)應(yīng)Procfs格式掛載。該目錄下文件只能看不能改(包括root)
目錄描述
/proc/meminfo查看內(nèi)存信息
還記得top以及uptime吧?沒錯(cuò)!上頭的三個(gè)平均數(shù)值就是記錄在
/proc/loadavg
此!
/proc/uptime就是用uptime的時(shí)候,會(huì)出現(xiàn)的資訊啦!
/proc/cpuinfo關(guān)于處理器的信息,如類型、廠家、型號(hào)和性能等。
加載kernel時(shí)所下達(dá)的相關(guān)參數(shù)!查閱此文件,可了解系統(tǒng)是如何
/proc/cmdline
啟動(dòng)的!
/proc/filesystems目前系統(tǒng)已經(jīng)加載的文件系統(tǒng)羅!
/proc/interrupts目前系統(tǒng)上面的IRQ分配狀態(tài)。
/proc/ioports目前系統(tǒng)上面各個(gè)裝置所配置的I/O位址。
/proc/kcore這個(gè)就是內(nèi)存的大小啦!好大對(duì)吧!但是不要讀他啦!
/proc/modules目前我們的Linux已經(jīng)加載的模塊列表,也可以想成是驅(qū)動(dòng)程序啦!
/proc/mounts系統(tǒng)已經(jīng)掛載的數(shù)據(jù),就是用mount這個(gè)命令呼叫出來的數(shù)據(jù)啦!
到底系統(tǒng)掛加載的內(nèi)存在哪里?呵呵!使用掉的partition就記錄在此
/proc/swaps
啦!
使用fdisk-1會(huì)出現(xiàn)目前所有的partition吧?在這個(gè)文件當(dāng)中也有
/proc/partitions
紀(jì)錄喔!
第8頁共8頁
/proc/pci在PCI匯流排上面,每個(gè)裝置的詳細(xì)情況!可用Ispci來查閱!
/proc/version核心的版本,就是用uname-a顯示的內(nèi)容啦!
/proc/bus/*一些匯流排的裝置,還有U盤的裝置也記錄在此喔!
7、/dev/目錄
設(shè)備文件分為兩種:塊設(shè)備文件(b)和字符設(shè)備文件⑹
設(shè)備文件般存放在/dev目錄下,
對(duì)常見設(shè)備文件作如下說明:
目錄描述
/dev/hd[a-t]IDE設(shè)備
/dev/sd[a-z]SCSI設(shè)備
/dev/fd[0-7]標(biāo)準(zhǔn)軟驅(qū)
/dev/md[0-31]軟raid設(shè)備
/dev/loop[0-7]本地回環(huán)設(shè)備
/dev/ram[0-15]內(nèi)存
/dev/null無限數(shù)據(jù)接收設(shè)備,相當(dāng)于黑洞
/dev/zero無限零資源
/dev/tty[0-63]虛擬終端
/dev/ttyS[0-3]串口
/dev/lp[0-3]并口
/dev/console控制臺(tái)
/dev/fb[0-31]framebuffer
第9頁共9頁
/dev/cdrom=>/dev/hdc
/dev/modem=>/dev/ttyS[0-9]
/dev/pilot=>/dev/ttyS[0-9]
/dev/random隨機(jī)數(shù)設(shè)備
/dev/urandom隨機(jī)數(shù)設(shè)備
二、論述shell的基本工作原理。
LinuxShell工作原理
Linux系統(tǒng)提供給用戶的最重要的系統(tǒng)程序是Shell命令語言解釋程序。它不
屬于內(nèi)核部分,而是在核心之外,以用戶態(tài)方式運(yùn)行。
其基本功能是解釋并執(zhí)行用戶打入的各種命令,實(shí)現(xiàn)用戶與Linux核心的接口。
系統(tǒng)初啟后,核心為每個(gè)終端用戶建立一個(gè)進(jìn)程去
執(zhí)行Shell解釋程序。它的執(zhí)行過程基本上按如下步驟:
(1)讀取用戶由鍵盤輸入的命令行。
(2)分析命令,以命令名作為文件名,并將其它參數(shù)改造為系統(tǒng)調(diào)用execve()
內(nèi)部處理所要求的形式。
(3)終端進(jìn)程調(diào)用fork()建立一個(gè)子進(jìn)程。
(4)終端進(jìn)程本身用系統(tǒng)調(diào)用wait4()來等待子進(jìn)程完成(如果是后臺(tái)命令,
則不等待)。當(dāng)子進(jìn)程運(yùn)行時(shí)調(diào)用execve(),
子進(jìn)程根據(jù)文件名(即命令名)到目錄中查找有關(guān)文件(這是命令解釋程序構(gòu)
成的文件),將它調(diào)入內(nèi)存,執(zhí)行這個(gè)程序(解釋這條命令)。
(5)如果命令末尾有&號(hào)(后臺(tái)命令符號(hào)),則終端進(jìn)程不用系統(tǒng)調(diào)用wait4()
等待,立即發(fā)提示符,讓用戶輸入下一個(gè)命令,轉(zhuǎn)⑴。
如果命令末尾沒有&號(hào),則終端進(jìn)程要?直等待,當(dāng)子進(jìn)程(即運(yùn)行命令的進(jìn)程)
完成處理后終止,向父進(jìn)程(終端進(jìn)程)報(bào)告,
此時(shí)終端進(jìn)程醒來,在做必要的判別等工作后,終端進(jìn)程發(fā)提示符,讓用戶輸
入新的命令,重復(fù)上述處理過程。
第10頁共10
右
Linux系統(tǒng)的shell作為操作系統(tǒng)的外殼,為用戶提供使用操作系統(tǒng)的接
口。它是命令語言、命令解釋程序及程序設(shè)計(jì)語言的統(tǒng)稱。
shell是用戶和Linux內(nèi)核之間的接口程序,如果把Linux內(nèi)核想象成一
個(gè)球體的中心,shell就是圍繞內(nèi)核的外層。
當(dāng)從shell或其他程序向Linux傳遞命令時(shí),內(nèi)核會(huì)做出相應(yīng)的反應(yīng)。
shell是一個(gè)命令語言解釋器,它擁有自己內(nèi)建的shell命令集,shell
也能被系統(tǒng)中其他應(yīng)用程序所調(diào)用。用戶在提示符下輸入的命令都由shell先
解釋然后傳給Linux核心。
有一些命令,比如改變工作目錄命令cd,是包含在shell內(nèi)部的。還有一
些命令,例如拷貝命令cp和移動(dòng)命令rm,是存在于文件系統(tǒng)中某個(gè)目錄下的
單獨(dú)的程序。對(duì)用戶而言,不必關(guān)心一個(gè)命令是建立在shell內(nèi)部還是一個(gè)單
獨(dú)的程序。
shell首先檢查命令是否是內(nèi)部命令,若不是再檢查是否是一個(gè)應(yīng)用程序
(這里的應(yīng)用程序可以是Linux本身的實(shí)用程序,如1s和rm,也可以是購買
的商業(yè)程序,如xv,或者是自由軟件,如emacs)。然后shell在搜索路徑里
尋找這些應(yīng)用程序(搜索路徑就是一個(gè)能找到可執(zhí)行程序的目錄列表)。如果
鍵入的命令不是一個(gè)內(nèi)部命令并且在路徑里沒有找到這個(gè)可執(zhí)行文件,將會(huì)顯
示一條錯(cuò)誤信息。如果能夠成功找到命令,該內(nèi)部命令或應(yīng)用程序?qū)⒈环纸鉃?/p>
系統(tǒng)調(diào)用并傳給Linux內(nèi)核。
shell的另一個(gè)重要特性是它自身就是一個(gè)解釋型的程序設(shè)計(jì)語言,shell
程序設(shè)計(jì)語言支持絕大多數(shù)在高級(jí)語言中能見到的程序元素,如函數(shù)、變量、
數(shù)組和程序控制結(jié)構(gòu)。shell編程語言簡單易學(xué),任何在提示符中能鍵入的命
令都能放到一個(gè)可執(zhí)行的shell程序中。
當(dāng)普通用戶成功登錄,系統(tǒng)將執(zhí)行一個(gè)稱為shell的程序。正是shell進(jìn)
程提供了命令行提示符。作為默認(rèn)值(TurboLinux系統(tǒng)默認(rèn)的shell是BASH),
對(duì)普通用戶用“$”作提示符,對(duì)超級(jí)用戶(root)用作提示符。
一旦出現(xiàn)了shell提示符,就可以鍵入命令名稱及命令所需要的參數(shù)。
shell將執(zhí)行這些命令。如果一條命令花費(fèi)了很長的時(shí)間來運(yùn)行,或者在屏幕
上產(chǎn)生了大量的輸出,可以從鍵盤上按ctrl+c發(fā)出中斷信號(hào)來中斷它(在正常
結(jié)束之前,中止它的執(zhí)行)。
第11頁共11頁
當(dāng)用戶準(zhǔn)備結(jié)束登錄對(duì)話進(jìn)程時(shí),可以鍵入logout命令、exit命令或文
件結(jié)束符(EOF)(按ctrl+d實(shí)現(xiàn)),結(jié)束登錄。
三、結(jié)合程序?qū)嵗敿?xì)論述常用的5種進(jìn)程通信方式。
linux使用的進(jìn)程間通信方式:(1)管道(pipe)(2)信號(hào)(signal)(3)
消息隊(duì)列(4)共享內(nèi)存(5)信號(hào)量
]、管道通信
普通的;inuxshell都允許重定向,而重定向使用的就是管道。例如:
pslgrepvsftpd.管道是單向的、先進(jìn)先出的、無結(jié)構(gòu)的、固定大小的字節(jié)
流,它把一個(gè)進(jìn)程的標(biāo)準(zhǔn)輸出和另?個(gè)進(jìn)程的標(biāo)準(zhǔn)輸入連接在一起。寫進(jìn)
程在管道的尾端寫入數(shù)據(jù),讀進(jìn)程在管道的道端讀出數(shù)據(jù)。數(shù)據(jù)讀出后將
從管道中移走,其它讀進(jìn)程都不能再讀到這些數(shù)據(jù)。管道提供了簡單的流
控制機(jī)制。進(jìn)程試圖讀空管道時(shí),在有數(shù)據(jù)寫入管道前,進(jìn)程將一直阻塞。
同樣,管道已經(jīng)滿時(shí),進(jìn)程再試圖寫管道,在其它進(jìn)程從管道中移走數(shù)據(jù)
之前,寫進(jìn)程將一直阻塞。管道主要用于不同進(jìn)程間通信。
管道的創(chuàng)建
fifowrite,c
ttinclude<sys/types.h>
Sinclude<sys/stat.h>
Sinclude<errno.h>
ttinclude<fcntl.h>
Sinclude<stdio.h>
Sinclude<stdlib.h>
Sinclude<string.h>
#defineFIFO_SERVER〃/tmp/myfifo〃
main(intargc,char**argv)
(
intfd;
charwbuf[100];
intnwrite;
/*打開管道*/
fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
if(argc==l)
(
printf(/zPleasesendsomething'n");
第12頁共12
右
exit(-1);
strcpy(w_buf,argv[1]);
/*向管道寫入數(shù)據(jù)*/
if((r)write=write(fd,w_buf,100))==-l)
(
if(errno==EAGAIN)
printf(Z/TheFIFOhasnotbeenreadyet.Pleasetry
later\n,z);
)
else
printf("'write%stotheFIF0\n,z,wbuf);
fifo_read.c
Sinclude<sys/types.h>
Sinclude<sys/stat.h>
ttinclude<errno.h>
Sinclude<fcntl.h>
Sinclude<stdio.h>
ttinclude<stdlib.h>
^include<string.h>
ttdefineFIFO〃/tmp/myfifo〃
main(intargc,char**argv)
(
charbuf_r[100];
intfd;
intnread;
/*創(chuàng)建管道*/
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
printf(z,cannotcreatefifoserver\n,z);
printf("'Preparingforreadingbytes...\n〃);
memset(buf_r,0,sizeof(buf_r));
第13頁共13
右
/*打開管道*/
fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
if(fd==-l)
(
perror("open");
exit(1);
)
while(1)
(
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,100))==-l)
(
if(errno==EAGAIN)
printf(z,nodatayet\n");
)
printf("read%sfromFIF0\n”,buf_r);
sleep(1);
)
pause。;/*暫停,等待信號(hào)*/
uniink(FIFO);//刪除文件
2、信號(hào)
信號(hào)概述
信號(hào)是軟件中斷。。它用于在一個(gè)或多個(gè)進(jìn)程之間傳遞異步信號(hào)。很多條件可
以產(chǎn)生一個(gè)信號(hào)。
A、當(dāng)用戶按某些終端鍵時(shí),產(chǎn)生信號(hào)。在終端上按DELETE鍵通常產(chǎn)生中斷信
號(hào)(SIGINT)o這是停止一個(gè)已失去控制程序的方法。
B、硬件異常產(chǎn)生信號(hào):除數(shù)為0、無效的存儲(chǔ)訪問等等。這些條件通常由硬件
檢測(cè)到,并將其通知內(nèi)核。然后內(nèi)核為該條件發(fā)生時(shí)正在運(yùn)行的進(jìn)程產(chǎn)生
適當(dāng)?shù)男盘?hào)。例如,對(duì)于執(zhí)行一個(gè)無效存儲(chǔ)訪問的進(jìn)程產(chǎn)生一個(gè)SIGSEGV。
C、進(jìn)程用kill(2)函數(shù)可將信號(hào)發(fā)送給另一個(gè)進(jìn)程或進(jìn)程組。自然,有些限制:
接收信號(hào)進(jìn)和發(fā)送信號(hào)進(jìn)程的所有都必須相同,或發(fā)送信號(hào)進(jìn)程的的所有
者必須是超級(jí)用戶。
D、用戶可用Kill(ID值)命令將信號(hào)發(fā)送給其它進(jìn)程。此程序是Kill函數(shù)的
界面。常用此命令終止一個(gè)失控的后臺(tái)進(jìn)程。
E、當(dāng)檢測(cè)到某種軟件條件已經(jīng)發(fā)生,并將其通知有關(guān)進(jìn)程時(shí)也產(chǎn)生信號(hào)。這里
并不是指硬件產(chǎn)生條件(如被0除),而是軟件條件。例如SIGURG(在網(wǎng)
第14頁共14
右
絡(luò)連接上傳來非規(guī)定波特率的數(shù)據(jù))、SIGPIPE(在管道的讀進(jìn)程已終止后
一個(gè)進(jìn)程寫此管道),以及SIGALRM(進(jìn)程所設(shè)置的鬧鐘時(shí)間已經(jīng)超時(shí))。
內(nèi)核為進(jìn)程生產(chǎn)信號(hào),來響應(yīng)不同的事件,這些事件就是信號(hào)源。主要信號(hào)
源如下:
(1)異常:進(jìn)程運(yùn)行過程中出現(xiàn)異常;
(2)其它進(jìn)程:一個(gè)進(jìn)程可以向另一個(gè)或一組進(jìn)程發(fā)送信號(hào);
(3)終端中斷:Ctrl-c,Ctro-\等;
(4)作業(yè)控制:前臺(tái)、后臺(tái)進(jìn)程的管理;
(5)分配額:CPU超時(shí)或文件大小突破限制;
(6)通知:通知進(jìn)程某事件發(fā)生,如I/O就緒等;
(7)報(bào)警:計(jì)時(shí)器到期;
Linux中的信號(hào)
1、SIGHUP2、SIGINT(終止)3、SIGQUIT(退出)4、SIGILL
5、SIGTRAP6、SIGIOT7、SIGBUS8、SIGFPE9、SIGKILL
10、SIGUSER11、SIGSEGVSIGUSER12、SIGPIPE13、SIGALRM
14、SIGTERM15、SIGCHLD16、SIGCONT17、SIGSTOP18、SIGTSTP
19、SIGTTIN20、SIGTTOU21、SIGURG22、SIGXCPU23、SIGXFSZ
24、SIGVTALRM25、SIGPROF26、SIGWINCH27、SIGIO28、SIGPWR常用
的信號(hào):
SIGHUP:從終端上發(fā)出的結(jié)束信號(hào);
SIGINT:來自鍵盤的中斷信號(hào)(Ctrl+c)
SIGQUIT:來自鍵盤的退出信號(hào);
SIGFPE:浮點(diǎn)異常信號(hào)(例如浮點(diǎn)運(yùn)算溢出);
SIGKILL:該信號(hào)結(jié)束接收信號(hào)的進(jìn)程;
SIGALRM:進(jìn)程的定時(shí)器到期口寸,發(fā)送該信號(hào);
SIGTERM:kill命令生出的信號(hào);
SIGCHLD:標(biāo)識(shí)子進(jìn)程停止或結(jié)束的信號(hào);
SIGSTOP:來自鍵盤(Ctrl-Z)或調(diào)試程序的停止掃行信號(hào)
可以要求系統(tǒng)在某個(gè)信號(hào)出現(xiàn)時(shí)按照下列三種方式中的一種進(jìn)行操作。
(1)忽略此信號(hào)。大多數(shù)信號(hào)都可使用這種方式進(jìn)行處理,但有兩種信號(hào)卻決
不能被忽略。它們是:SIGKILL和SIGSTOP。這兩種信號(hào)不能被忽略的,原
因是:它們向超級(jí)用戶提供一種使進(jìn)程終止或停止的可靠方法。另外,如
果忽略某些由硬件異常產(chǎn)生的信號(hào)(例如非法存儲(chǔ)訪問或除以0),則進(jìn)
程的行為是示定義的。
(2)捕捉信號(hào)。為了做到這一點(diǎn)要通知內(nèi)核在某種信號(hào)發(fā)生時(shí),調(diào)用一個(gè)用戶
函數(shù)。在用戶函數(shù)中,可執(zhí)行用戶希望對(duì)這種事件進(jìn)行的處理。如果捕捉
到SIGCHLD信號(hào),則表示子進(jìn)程已經(jīng)終止,所以此信號(hào)的捕捉函數(shù)可以調(diào)
用waitpid以取得該子進(jìn)程的進(jìn)程ID以及它的終止?fàn)顟B(tài)。
第15頁共15
右
(3)執(zhí)行系統(tǒng)默認(rèn)動(dòng)作。對(duì)大多數(shù)信號(hào)的系統(tǒng)默認(rèn)動(dòng)作是終止該進(jìn)程。每一個(gè)
信號(hào)都有一個(gè)缺省動(dòng)作,它是當(dāng)進(jìn)程沒有給這個(gè)信號(hào)指定處理程序時(shí),內(nèi)
核對(duì)信號(hào)的處理。有5種缺省的動(dòng)作:
(1)異常終止(abort):在進(jìn)程的當(dāng)前目錄下,把進(jìn)程的地址空間內(nèi)容、寄存
器內(nèi)容保存到一個(gè)叫做core的文件中,而后終止進(jìn)程。
(2)退出(exit):不產(chǎn)生core文件,直接終止進(jìn)程。
(3)忽略(ignore):忽略該信號(hào)。
(4)停止(stop):掛起該進(jìn)程。
(5)繼續(xù)(contiune):如果進(jìn)程被掛起,剛恢復(fù)進(jìn)程的動(dòng)行。否則,忽略信
號(hào)。信號(hào)的發(fā)送與捕捉
ki11()和raise()
kill。不僅可以中止進(jìn)程,也可以向進(jìn)程發(fā)送其他信號(hào)。與kill函數(shù)不同的是,
raise()函數(shù)運(yùn)行向進(jìn)程自身發(fā)送信號(hào)#include〈sys/types.h>
#include<signal.h>
intkill(pid_tpid,intsigno);
intraise(intsigno);
兩個(gè)函數(shù)返回:若成功則為0,若出錯(cuò)則為kill的pid參數(shù)有四種不同的
情況:
(1)pid>0將信號(hào)發(fā)送給進(jìn)程ID為pid的進(jìn)程。
(2)pid==0將信號(hào)發(fā)送給其進(jìn)程組ID等于發(fā)送進(jìn)程的進(jìn)程組ID,而且發(fā)送進(jìn)
程有許可權(quán)向其發(fā)送信號(hào)的所有進(jìn)程。
(3)pid<0將信號(hào)發(fā)送給其進(jìn)程組ID等于pid絕對(duì)值,而且發(fā)送進(jìn)程有許可
權(quán)向其發(fā)送信號(hào)的所有進(jìn)程。如上所述一樣,“所有進(jìn)程”并不包括系統(tǒng)
進(jìn)程集中的進(jìn)程。
(4)pid==TPOSIX.1未定義種情況kill,c#include<stdio.h>
例子如下:
Sinclude<signal.h>
#include<stdio.h>
Sinclude<stdlib.h>
voidmy_func(intsign_no)
(
if(sign_no==SIGINT)
printf(,?IhavegetSIGINT'n");
elseif(sign_no==SIGQUIT)
printf(Z,IhavegetSIGQUIT'n");
)
intmainO
(
printf(/zWaitingforsignalSIGINTorSIGQUIT\n");
第16頁共16
右
/*注冊(cè)信號(hào)處理函數(shù)*/
signal(SIGINT,my_func);
signal(SIGQUIT,my_func);
pause();
exit(0);
)
3、消息隊(duì)列
消息隊(duì)列用于運(yùn)行于同一臺(tái)機(jī)器上的進(jìn)程間通信,它和管道很相似,是一個(gè)在
系統(tǒng)內(nèi)核中用來保存消息的隊(duì)列,它在系統(tǒng)內(nèi)核中是以消息鏈表的形式出
現(xiàn)。消息鏈表中節(jié)點(diǎn)的結(jié)構(gòu)用msg聲明。
例子如下:
ttinclude<sys/types.h>
#include<sys/msg.h>
tiinclude<unistd.h>
structmsg_buf
(
intmtype;
chardata[255];
);
intmainO
(
key_tkey;
intmsgid;
intret;
structmsg_bufmsgbuf;
key=ftok(〃/tmp/2〃,'a');
printfC'key=[%x]\n〃,key);
msgid=msgget(key,IPC_CREAT10666);/*通過文件對(duì)應(yīng)*/
if(msgid==-l)
(
printf(''createerror\nz,);
return-1;
)
第17頁共17
msgbuf.mtype=getpid();
strcpy(msgbuf.data,z,testhaha");
ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
if(ret==-l)
{
printf(z/sendmessageerr\n");
return-1;
)
memset(&msgbuf,0,sizeof(msgbuf));
ret=msgrcv(msgid,femsgbuf,sizeof(msgbuf.data),getpidO,IPC_NOWAIT
);
if(ret==-l)
(
printf("recvmessageerr\n");
return-1;
)
printf(z/recvmsg=[%s]\nz/,msgbuf.data);
)
4、共享內(nèi)存
共享內(nèi)存是運(yùn)行在同一臺(tái)機(jī)器上的進(jìn)程間通信最快的方式,因?yàn)閿?shù)據(jù)不需要在
不同的進(jìn)程間復(fù)制。通常由一個(gè)進(jìn)程創(chuàng)建一塊共享內(nèi)存區(qū),其余進(jìn)程對(duì)這
塊內(nèi)存區(qū)進(jìn)行讀寫。
得到共享內(nèi)存有兩種方式:映射/dev/mem設(shè)備和內(nèi)存映像文件。前一種方式不
給系統(tǒng)帶來額外的開銷,但在現(xiàn)實(shí)中并不常用,因?yàn)樗刂拼嫒〉膶⑹菍?shí)
際的物理內(nèi)存,在Linux系統(tǒng)下,這只有通過限制Linux系統(tǒng)存取的內(nèi)存
才可以做到。常用的方式是通過shmXXX函數(shù)族來實(shí)現(xiàn)利用共享內(nèi)存進(jìn)行
存儲(chǔ)的。
首先要用的函數(shù)是shmget,它獲得一個(gè)共享存儲(chǔ)標(biāo)識(shí)符。
#include<sys/types.h>
Sinclude<sys/ipc.h>
#include<sys/shm.h>
intshmget(key_tkey,intsize,intflag);
這個(gè)函數(shù)有點(diǎn)類板malloc函數(shù),系統(tǒng)按照請(qǐng)求分配size大小的內(nèi)存用作共享
內(nèi)存。Linux系統(tǒng)內(nèi)核中每個(gè)IPC結(jié)構(gòu)都有的一個(gè)非負(fù)整數(shù)的標(biāo)識(shí)符,這
樣對(duì)一個(gè)消息隊(duì)列發(fā)送消息時(shí)只要引用標(biāo)識(shí)符就可以了。這個(gè)標(biāo)識(shí)符是內(nèi)
第18頁共18
右
核由IPC結(jié)構(gòu)的關(guān)鍵字得到的。這個(gè)關(guān)鍵字,就是上面第一個(gè)函數(shù)的key。
數(shù)據(jù)類型key_t是在頭文件sys/types.h中定義的,它是一個(gè)長整形的數(shù)
據(jù)。當(dāng)共享內(nèi)存創(chuàng)建后,其余進(jìn)程可以調(diào)用shmat()將其連
接到自身的地址空間中。
void*shmat(intshmid,void*addr,intflag);
shmid為shmget函數(shù)返回的共享存儲(chǔ)標(biāo)識(shí)符,addr和flag參數(shù)決定了以什么
方式來確定連接的地址,函數(shù)的返回值即是該進(jìn)程數(shù)據(jù)段所連接的實(shí)際地
址,進(jìn)程可以對(duì)此進(jìn)程進(jìn)行讀寫操作。
例子如下:
ttinclude<stdlib.h>
ttinclude<stdio.h>
Sinclude<string.h>
ttinclude<errno.h>
Sinclude<unistd.h>
Sinclude<sys/stat.h>
Sinclude<sys/types.h>
Sinclude<sys/ipc.h>
Sinclude<sys/shm.h>
#definePERMS_IRUSR|S_IWUSR
/*共享內(nèi)存*/
intmain(intargc,char**argv)
(
intshmid;
char*p_addr,*c_addr;
if(argc!=2)
(
fprintf(stderr,z,Usage:%s\n\az,,argv[0]);
exit(1);
)
/*創(chuàng)建共享內(nèi)存*/
if((shmid=shmget(IPC_PRIVATE,1024,PERM))=1)
(
fprintf(stderr,^CreateShareMemory
Error:%s\n\az,,strerror(errno));
exit(1);
第19頁共19
右
/*創(chuàng)建子進(jìn)程*/
if(fork())//父進(jìn)程寫
(
p_addr=shmat(shmid,0,0);
memset(p_addr,'\0",1024);
strncpy(p_addr,argv[l],1024);
wait(NULLr//釋放資源,不關(guān)心終止?fàn)顟B(tài)
exit(0);
)
else//子進(jìn)程讀
(
sleep(l);//暫停1秒
c_addr=shmat(shmid,0,0);
printf(z,Clientget%s\n',c_addr);
exit(0);
)
)
5、信號(hào)量
信售量又稱為信號(hào)燈,它是用來協(xié)調(diào)不同進(jìn)程間的數(shù)據(jù)對(duì)象的,而最主要的
應(yīng)用是前一節(jié)的共享內(nèi)存方式的進(jìn)程間通信。本質(zhì)上,信號(hào)量是一個(gè)計(jì)數(shù)
器,它用來記錄對(duì)某個(gè)資源(如共享內(nèi)存)的存取狀況。一般說來,為了
獲得共享資源,進(jìn)程需要執(zhí)行下列操作:
(1)測(cè)試控制該資源的信號(hào)量。
(2)若此信號(hào)量的值為正,則允許進(jìn)行使用該資源。進(jìn)程將信號(hào)量減1。(3)
若此信號(hào)量為0,則該資源目前不可用,進(jìn)程進(jìn)入睡眠狀態(tài),直至信號(hào)量
值大于0,進(jìn)程被喚醒,轉(zhuǎn)入步驟(1)。
(4)當(dāng)進(jìn)程不再使用一個(gè)信號(hào)量控制的資源時(shí),信號(hào)量值加1。如果此時(shí)有
進(jìn)程正在睡眠等待此信號(hào)量,則喚醒此進(jìn)程。
例子如下:
intopen_semaphore_set(key_tkeyval,intnumsems)
(
intsid;
if(Inumsems)
return(-1);
if((sid=semget(mykey,numsems,IPC_CREAT0660))==T)
{
return(-1);
第20頁共20
右
return(sid);
};、
semopO
系統(tǒng)調(diào)用:semopO;調(diào)用原型:intsemop(intsemid,struct
sembuf*sops,unsignednsops);
返回值:0,如果成功。-1,
如果失敗:errno=E2BIG(nsops大于最大的ops數(shù)目
四、對(duì)進(jìn)程與線程的區(qū)別進(jìn)行分析。
對(duì)于操作系統(tǒng)而言,進(jìn)程是核心之核心,整個(gè)現(xiàn)代操作系統(tǒng)的
根本,就是以進(jìn)程為單位在執(zhí)行任務(wù)。系統(tǒng)的管理架構(gòu)也是基于進(jìn)
程層面的。在按下電源鍵之后,計(jì)算機(jī)就開始了復(fù)雜的啟動(dòng)過程,
此處有一個(gè)經(jīng)典問題:當(dāng)按下電源鍵之后,計(jì)算機(jī)如何把自己由靜
止啟動(dòng)起來的?本文不討論系統(tǒng)啟動(dòng)過程,請(qǐng)讀者自行科普。操作
系統(tǒng)啟動(dòng)的過程簡直可以描述為上帝創(chuàng)造萬物的過程,期初沒有世
界,但是有上帝,是上帝創(chuàng)造了世界,之后創(chuàng)造了萬物,然后再創(chuàng)
造了人,然后塑造了人的七情六欲,再然后人類社會(huì)開始遵循自然
規(guī)律繁衍生息。。。操作系統(tǒng)啟動(dòng)進(jìn)程的階段就相當(dāng)于上帝造人的
階段。本文討論的全部內(nèi)容都是“上帝造人”之后的事情。第一個(gè)
被創(chuàng)造出來的進(jìn)程是0號(hào)進(jìn)程,這個(gè)進(jìn)程在操作系統(tǒng)層面是不可見
的,但它存在著。0號(hào)進(jìn)程完成了操作系統(tǒng)的功能加載與初期設(shè)定,
第21頁共21
右
然后它創(chuàng)造了1號(hào)進(jìn)程(init),這個(gè)1號(hào)進(jìn)程就是操作系統(tǒng)的“耶
穌”。1號(hào)進(jìn)程是上帝派來管理整個(gè)操作系統(tǒng)的,所以在用pstre
e查看進(jìn)程樹可知,1號(hào)進(jìn)程位于樹根。再之后,系統(tǒng)的很多管理
程序都以進(jìn)程身份被1號(hào)進(jìn)程創(chuàng)造出來,還創(chuàng)造了與人類溝通的橋
梁一一shello從那之后,人類可以跟操作系統(tǒng)進(jìn)行交流,可以編
寫程序,可以執(zhí)行任務(wù)。。。
而這一切,都是基于進(jìn)程的。每一個(gè)任務(wù)(進(jìn)程)被創(chuàng)建時(shí)一,系
統(tǒng)會(huì)為他分配存儲(chǔ)空間等必要資源,然后在內(nèi)核管理區(qū)為該進(jìn)程創(chuàng)
建管理節(jié)點(diǎn),以便后來控制和調(diào)度該任務(wù)的執(zhí)行。
進(jìn)程真正進(jìn)入執(zhí)行階段,還需要獲得CPU的使用權(quán),這一切都是操
作系統(tǒng)掌管著,也就是所謂的調(diào)度,在各種條件滿足(資源與CPU
使用權(quán)均獲得)的情況下,啟動(dòng)進(jìn)程的執(zhí)行過程。
除CPU而外,一個(gè)很重要的資源就是存儲(chǔ)器了,系統(tǒng)會(huì)為每個(gè)進(jìn)程
分配獨(dú)有的存儲(chǔ)空間,當(dāng)然包括它特別需要的別的資源,比如寫入
時(shí)外部設(shè)備是可使用狀態(tài)等等。有了上面的引入,我們可以對(duì)進(jìn)程
做一個(gè)簡要的總結(jié):
進(jìn)程,是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系
統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。它的
執(zhí)行需要系統(tǒng)分配資源創(chuàng)建實(shí)體之后,才能進(jìn)行。
第22頁共22
右
隨著技術(shù)發(fā)展,在執(zhí)行一些細(xì)小任務(wù)時(shí),本身無需分配單獨(dú)資
源時(shí)(多個(gè)任務(wù)共享同一組資源即可,比如所有子進(jìn)程共享父進(jìn)程
的資源),進(jìn)程的實(shí)現(xiàn)機(jī)制依然會(huì)繁瑣的將資源分割,這樣造成浪
費(fèi),而且還消耗時(shí)間。后來就有了專門的多任務(wù)技術(shù)被創(chuàng)造出來一
一線程。
線程的特點(diǎn)就是在不需要獨(dú)立資源的情況下就可以運(yùn)行。如此一來
會(huì)極大節(jié)省資源開銷,以及處理時(shí)間。
1.好了,前面的一段文字是簡要引入兩個(gè)名詞,即進(jìn)程和線程。本
文討論目標(biāo)是解釋清楚進(jìn)程和線程的區(qū)別,關(guān)于二者的技術(shù)實(shí)現(xiàn),
請(qǐng)讀者查閱相關(guān)資料。
下面我們開始重點(diǎn)討論本文核心了。從下面幾個(gè)方面闡述進(jìn)程
和線程的區(qū)別。
1).二者的相同點(diǎn)
2).實(shí)現(xiàn)方式的差異
3).多任務(wù)程序設(shè)計(jì)模式的區(qū)別
4).實(shí)體間(進(jìn)程間,線程間,進(jìn)線程間)通信方式的不同
5).控制方式的異同
6).資源管理方式的異同
第23頁共23
右
7).個(gè)體間輩分關(guān)系的迥異
8).進(jìn)程池與線程池的技術(shù)實(shí)現(xiàn)差別
接下來我們就逐個(gè)進(jìn)行解釋。
1).二者的相同點(diǎn)
無論是進(jìn)程還是線程,對(duì)于程序員而言,都是用來實(shí)現(xiàn)多任務(wù)
并發(fā)的技術(shù)手段。二者都可以獨(dú)立調(diào)度,因此在多任務(wù)環(huán)境下,功
能上并無差異。并且二者都具有各自的實(shí)體,是系統(tǒng)獨(dú)立管理的對(duì)
象個(gè)體。所以在系統(tǒng)層面,都可以通過技術(shù)手段實(shí)現(xiàn)二者的控制。
而且二者所具有的狀態(tài)都非常相似。而且,在多任務(wù)程序中,子進(jìn)
程(子線程)的調(diào)度一般與父進(jìn)程(父線程)平等競爭。
其實(shí)在Linux內(nèi)核2.4版以前,線程的實(shí)現(xiàn)和管理方式就是完
全按照進(jìn)程方式實(shí)現(xiàn)的。在2.6版內(nèi)核以后才有了單獨(dú)的線程實(shí)
現(xiàn)。
第24頁共24
右
嵋狀態(tài)圖
2).實(shí)現(xiàn)方式的差異
進(jìn)程是資源分配的基本單位,線程是調(diào)度的基本單位。
這句經(jīng)典名言已流傳數(shù)十年,各種操作系統(tǒng)教材都可見此描述。
確實(shí)如此,這就是二者的顯著區(qū)別。讀者請(qǐng)注意“基本”二字。相
信有讀者看到前半句的時(shí)候就在心里思考,“進(jìn)程豈不是不能調(diào)
第25頁共25
右
度?”,非也!進(jìn)程和線程都可以被調(diào)度,否則多進(jìn)程程序該如何
運(yùn)行呢!
只是,線程是更小的可以調(diào)度的單位,也就是說,只要達(dá)到線程的
水平就可以被調(diào)度了,進(jìn)程自然可以被調(diào)度。它強(qiáng)調(diào)的是分配資源
時(shí)的對(duì)象必須是進(jìn)程,不會(huì)給一個(gè)線程單獨(dú)分配系統(tǒng)管理的資源。
若要運(yùn)行一個(gè)任務(wù),想要獲得資源,最起碼得有進(jìn)程,其他子任務(wù)
可以以線程身份運(yùn)行,資源共享就行了。
簡而言之,進(jìn)程的個(gè)體間是完全獨(dú)立的,而線程間是彼此依存
的。多進(jìn)程環(huán)境中,任何一個(gè)進(jìn)程的終止,不會(huì)影響到其他進(jìn)程。
而多線程環(huán)境中,父線程終止,全部子線程被迫終止(沒有了資源)。
而任何一個(gè)子線程終止一般不會(huì)影響其他線程,除非子線程執(zhí)行了
exit。系統(tǒng)調(diào)用。任何一個(gè)子線程執(zhí)行exit。,全部線程同時(shí)滅
亡。
其實(shí),也沒有人寫出只有線程而沒有進(jìn)程的程序。多線程程序
中至少有一個(gè)主線程,而這個(gè)主線程其實(shí)就是有main函數(shù)的進(jìn)程。
它是整個(gè)程序的進(jìn)程,所有線程都是它的子線程。我們通常把具有
多線程的主進(jìn)程稱之為主線程。
從系統(tǒng)實(shí)現(xiàn)角度講,進(jìn)程的實(shí)現(xiàn)是調(diào)用fork系統(tǒng)調(diào)用:
pidtfork(void);
第26頁共26
右
線程的實(shí)現(xiàn)是調(diào)用clone系統(tǒng)調(diào)用:
intclone(int(*fn)(void*),void*child_stack,intf
lags,void*arg,
/*pidt*ptid,structuserdesc*tls,pidt*ctid*/
);
其中,fork。是將父進(jìn)程的全部資源復(fù)制給了子進(jìn)程。而線程
的clone只是復(fù)制了一小部分必要的資源。在調(diào)用clone時(shí)可以通
過參數(shù)控制要復(fù)制的對(duì)象??梢哉f,fork實(shí)現(xiàn)的是clone的加強(qiáng)
完整版。當(dāng)然,后來操作系統(tǒng)還進(jìn)一步優(yōu)化fork實(shí)現(xiàn)一一寫時(shí)復(fù)
制技術(shù)。在子進(jìn)程需要復(fù)制資源(比如子進(jìn)程執(zhí)行寫入動(dòng)作更改父
進(jìn)程內(nèi)存空間)時(shí)才復(fù)制,否則創(chuàng)建子進(jìn)程時(shí)先不復(fù)制。
實(shí)際中,編寫多進(jìn)程程序時(shí)采用fork創(chuàng)建子進(jìn)程實(shí)體。而創(chuàng)建
線程時(shí)并不采用clone系統(tǒng)調(diào)用,而是采用線程庫函數(shù)。常用線程
庫有Linux-Native線程庫利POSIX線程庫。其中應(yīng)用最為廣泛的
是POSIX線程庫。因此讀者在多線程程序中看到的是pthread_cre
ate而非cloneo
我們知道,庫是建立在操作系統(tǒng)層面上的功能集合,因而它的功能
都是操作系統(tǒng)提供的。由此可知,線程庫的內(nèi)部很可能實(shí)現(xiàn)了clo
第27頁共27
右
ne的調(diào)用。不管是進(jìn)程還是線程的實(shí)體,都是操作系統(tǒng)上運(yùn)行的
實(shí)體。
最后,我們說一下vfork()o這也是一個(gè)系統(tǒng)調(diào)用,用來創(chuàng)
建一個(gè)新的進(jìn)程。它創(chuàng)建的進(jìn)程并不復(fù)制父進(jìn)程的資源空間,而是
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)型A4彩色激光打印機(jī)2024采購協(xié)議明細(xì)版B版
- 初中英語賓語從句考點(diǎn)精講及練習(xí)(附答案)
- 2024年銷售策略研討會(huì)及市場(chǎng)拓展合同3篇
- 2025版智能機(jī)器人制造合伙人股權(quán)分配與產(chǎn)業(yè)鏈整合協(xié)議3篇
- 2024年環(huán)保型挖掘設(shè)備租賃合同規(guī)范3篇
- 2024藝術(shù)特長生培養(yǎng)協(xié)議書:家長與學(xué)生責(zé)任共擔(dān)3篇
- 應(yīng)急處突知識(shí)培訓(xùn)課件
- 飲食安全知識(shí)培訓(xùn)課件
- 2024年車輛貸款還款計(jì)劃表3篇
- 倉庫知識(shí)培訓(xùn)課件
- 保險(xiǎn)公司維修協(xié)議書模板
- 【講座】2024屆高三英語詞匯教學(xué)微講座課件
- 小學(xué)四年級(jí)小數(shù)單位換算練習(xí)題100道
- 口腔科牙科臨床技術(shù)操作規(guī)范大全
- 人教版七年級(jí)下冊(cè)數(shù)學(xué)-第五章-相交線與平行線-單元檢測(cè)題
- 河道開挖專項(xiàng)方案
- (正式版)HGT 22820-2024 化工安全儀表系統(tǒng)工程設(shè)計(jì)規(guī)范
- 項(xiàng)目質(zhì)量管理的溝通與協(xié)調(diào)機(jī)制
- 中醫(yī)常見的護(hù)理診斷及護(hù)理措施
- 高中數(shù)學(xué)練習(xí)-函數(shù)零點(diǎn)問題
- 公安機(jī)關(guān)面向社會(huì)招錄網(wǎng)絡(luò)安全技術(shù)職位專業(yè)測(cè)試考試大綱
評(píng)論
0/150
提交評(píng)論