嵌入式系統(tǒng)開發(fā)期末報(bào)告_第1頁
嵌入式系統(tǒng)開發(fā)期末報(bào)告_第2頁
嵌入式系統(tǒng)開發(fā)期末報(bào)告_第3頁
嵌入式系統(tǒng)開發(fā)期末報(bào)告_第4頁
嵌入式系統(tǒng)開發(fā)期末報(bào)告_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論