【正文】
域的所有進(jìn)程就可以立刻看到其中的內(nèi)容。這塊共享虛擬內(nèi)存的頁面,出現(xiàn)在每一個(gè)共享該頁面的進(jìn)程的頁表中。但是它不需要在所有進(jìn)程的虛擬內(nèi)存中都有相同的虛擬地址。 內(nèi)存管理利用虛擬文件系統(tǒng)支持交換,交換進(jìn)程(swapd)定期由調(diào)度程序調(diào)度,這也是內(nèi)存管理依賴于進(jìn)程調(diào)度的唯一原因。當(dāng)一個(gè)進(jìn)程存取的內(nèi)存映射被換出時(shí),內(nèi)存管理向文件系統(tǒng)發(fā)出請(qǐng)求,同時(shí),掛起當(dāng)前正在運(yùn)行的進(jìn)程。,信號(hào)燈和條件變量等,分析以上幾種同步方式可在什么場合下使用。 Mutex互斥量,用于操作某個(gè)臨界資源時(shí)對(duì)該資源上鎖,以實(shí)現(xiàn)互斥地對(duì)獨(dú)占資源的使用。(3分)Semophore信號(hào)燈,信號(hào)燈內(nèi)有一計(jì)數(shù)器,可以用于對(duì)多個(gè)同類資源的分配。當(dāng)資源用完時(shí),申請(qǐng)資源的線程會(huì)在信號(hào)量上睡眠,有線程釋放資源時(shí),再將該線程喚醒繼續(xù)運(yùn)行。(3分)Condition條件變量,條件變量用于等待信號(hào)。當(dāng)一個(gè)線程需要等待某個(gè)信號(hào)時(shí),就可到條件變量上等待,當(dāng)信號(hào)具備時(shí),系統(tǒng)會(huì)喚醒該線程繼續(xù)運(yùn)行。(4分),需要采用的通信方式?本地:共享內(nèi)存+信號(hào)量, 適合于大量數(shù)據(jù)傳輸。Linux支持系統(tǒng)V和POSIX的共享內(nèi)存和信號(hào)量。(5分)遠(yuǎn)程:Socket+應(yīng)用協(xié)議。適合于跨網(wǎng)絡(luò)的(大量)數(shù)據(jù)傳輸。Linux支持BSD的socket。應(yīng)用層協(xié)議需要自行設(shè)計(jì)。,進(jìn)程,線程有何區(qū)別和聯(lián)系 程序是編譯后形成的可執(zhí)行代碼,是靜止的。進(jìn)程是程序的一次執(zhí)行,是活動(dòng)的。線程是進(jìn)程的可執(zhí)行單元,同一進(jìn)程的不同線程共享進(jìn)程的資源和地址空間。,線程間同步有幾種實(shí)現(xiàn)方法,分別都是什么? 兩種,一種是繼承Thread,另外一種是實(shí)現(xiàn)接口Runnable。 同步的實(shí)現(xiàn)方法有兩種,分別是synchronized, wait與notify。用synchronized可以對(duì)一段代碼、一個(gè)對(duì)象及一個(gè)方法進(jìn)行加鎖。用wait與notify可以使對(duì)象處于等待及喚醒方式導(dǎo)致同步,因?yàn)槊總€(gè)對(duì)象都直接或間接的繼承了Object類。: 1)正在執(zhí)行的進(jìn)程運(yùn)行完畢;(2)正在執(zhí)行的進(jìn)程調(diào)用阻塞原語將自己阻塞起來進(jìn)入等待狀態(tài);(3)正在執(zhí)行的進(jìn)程調(diào)用了P原語操作,從而因資源不足而被阻塞;或調(diào)用了V原語操作激活了等待資源的進(jìn)程隊(duì)列;(4)執(zhí)行中的進(jìn)程提出I/O請(qǐng)求后被阻塞;(5)系統(tǒng)分配的時(shí)間片已經(jīng)用完;以上都是CPU為不可剝奪方式下的引起進(jìn)程調(diào)度的原因。在CPU方式是可剝奪時(shí),還有下面的原因:(6)就緒隊(duì)列中的某個(gè)進(jìn)程的優(yōu)先級(jí)變得高于當(dāng)前運(yùn)行進(jìn)程的優(yōu)先級(jí),從而也將引起進(jìn)程調(diào)度。編程題:1.,。:pr1: gcc –o pr1 : gcc –c –o : gcc –c –o 2. (1) 編寫Makefile文件,最終的目標(biāo)文件為hello,交叉編譯器為armlinuxgcc hello: gcc o prog : gcc c o : gcc c o : gcc c o : gcc c o clean: rm hello *.o(2) 在目標(biāo)上上通過網(wǎng)絡(luò)文件系統(tǒng)掛載/mnt到宿主機(jī)上的/home/arm目錄。mount –t nfs –o noclock :/home/armtest/hello /mnt3. 在Linux操作系統(tǒng)下,編程實(shí)現(xiàn)以下功能(1)(打印HELLO WORLD)(2)。(3)(聲明message函數(shù))(4)(打印“This is a message!”): include include include include int main (int argc,char *argv[]){printf(Hello World!\n)。 message()。 return 0。} : void message(void)。 : include void message (void){ printf(This is a message!\n) }4. 閱讀下面的shell程序,寫出執(zhí)行結(jié)果Tom is my friend。 Jack is my friend Harry is my friend5. 對(duì)下列shell程序加注釋,并說明程序的功能和調(diào)用方法。(1)程序注釋!/bin/sh 定義實(shí)用的shell /etc/,凡是以星號(hào)開始的行均為注釋行。 Start/stop/restart the Apache web server. To make Apache start automatically at boot, make this file executable: chmod 755 /etc/case $1 in case結(jié)構(gòu)開始,判斷“位置參數(shù)”決定執(zhí)行的操作。本程序攜帶一個(gè)“位置參數(shù)”,即$1 39。start39。) 若位置參數(shù)為start/usr/sbin/apachectl start 。 啟動(dòng)d進(jìn)程39。stop39。) 若位置參數(shù)為stop/usr/sbin/apachectl stop 。 關(guān)閉d進(jìn)程39。restart39。) 若位置參數(shù)為stop/usr/sbin/apachectl restart 。 重新啟動(dòng)d進(jìn)程*) 若位置參數(shù)不是start、stop或restart時(shí)echo usage $0 start|stop|restart 。 顯示命令提示信息:程序的調(diào)用方法esac case結(jié)構(gòu)結(jié)束(2)程序的功能是啟動(dòng),停止或重新啟動(dòng)d進(jìn)程(3)程序的調(diào)用方式有三種:啟動(dòng),停止和重新啟動(dòng)。,判斷一個(gè)文件是不是字符設(shè)備文件,如果是將其復(fù)制到、dev目錄下。!/bin/sh FILENAME= echo “Input file name:” read FILENAME if [ c $FILENAME ] then cp $FILENAME /dev fi7. 用shell編程,求兩個(gè)數(shù)之和/bin/bash typeset first secondread p Input t e first number: firstread p Input the second number: secondon個(gè)result=$[$first+$second] echo result is : $result exit 0設(shè)計(jì)一個(gè)Shell程序,在/userdata目錄下建立50個(gè)目錄,即user1user50,并沒有設(shè)置每個(gè)目錄的權(quán)限,其中其他用戶的權(quán)限為:讀;文件所有者的權(quán)限為:讀,寫,執(zhí)行、文件所有者所在組的權(quán)限為:讀,執(zhí)行。!/bin/sh i=1while [ i le 50 ] doif [ d /userdata ]。then mkdir p /userdata/user$ichmod 754 /userdata/user$i echo user$ilet i = i + 1 (或i=$(($i+1)) elsemkdir /userdata mkdir p /userdata/user$i chmod 754 /userdata/user$iecho user$i let i = i + 1 (或i=$(($i+1))Fi Done ,完成動(dòng)態(tài)配置10個(gè)struct test空間 include struct test { int a[10]。 char b[20]。 } int main(){struct test *ptr=calloc(sizeof(struct test),10)?!9.編寫一個(gè)程序,利用mmap()來讀取/etc/passwd文件的內(nèi)容 includesys/ includesys/ include include includesys/ main() { int fd。 void *start。 struct stat sb。fd=open(“/etc/passwd”,O_RDONLY)。fstat(fd,amp。sb)。 start=mmap(NULL,PROT_READ,MAP_PRIVATE,fd,0)。if(start= = MAP_FAILED) return?!rintf(“%s”,start)。munma(start,)。 closed(fd)?!10. ,實(shí)現(xiàn)以下功能。(1)打開當(dāng)前目錄下的文件“”,如果沒有則創(chuàng)建該文件,并使其具有讀寫屬性Void main(void){int fid。 fid = open(“./”,O_RDWR|O_CREAT)。 if(fid==1){ Printf(“open or create error \n”)。 exit(0)。 }Close(fid)。 }(2)編寫一個(gè)makefile實(shí)現(xiàn)自動(dòng)編譯,生成可執(zhí)行文件mainobjects = exec = main all:$(objects) gcc –o $(exec) $(objects): gcc –c clean: rm –r $(exec) $(objects),實(shí)現(xiàn)把一個(gè)文件的內(nèi)容復(fù)制到另一個(gè)文件