999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

UNIX環境下的多進程編程

2008-12-31 00:00:00
電腦知識與技術 2008年11期

摘要:由于UNIX系統是分時多用戶系統,實質上應該說CPU按時間片分配給各個進程使用,每個進程都有自己的運行環境以使得在CPU做進程切換時不會“忘記”該進程已計算了一半的“半成品”,進程的切換都是一次中斷處理過程,UNIX系統本身是用C語言編寫的多進程程序,多進程編程是UNIX的特點,我們盡可以使用系統提供的多進程的特點,讓幾個程序并行執行,提高系統的并行處理能力,簡單而又高效地完成相應任務。本文主要介紹在UNIX系統下多進程編程的有關系統調用和編程技巧。

關鍵詞:多進程;分時;并行;系統調用;多用戶

中圖分類號:TP316文獻標識碼:A文章編號:1009-3044(2008)11-20265-03

1 多進程程序的特點

由于UNIX系統是分時多用戶系統,CPU按時間片分配給各個用戶使用,而在實質上應該說CPU按時間片分配給各個進程使用,每個進程都有自己的運行環境以使得在CPU做進程切換時不會\"忘記\"該進程已計算了一半的\"半成品\"。以DOS的概念來說,進程的切換都是一次\"DOS中斷\"處理過程,包括三個層次:(1)用戶數據的保存: 包括正文段(TEXT),數據段(DATA,BSS),棧段(STACK),共享內存段(SHARED MEMORY)的保存。(2)寄存器數據的保存:包括PC(program counter,指向下一條要執行的指令的地址), PSW(processor status word,處理機狀態字), SP(stack pointer,棧指針),PCBP(pointer of process control block,進程控制塊指針), FP(frame pointer,指向棧中一個函數的local變量的首地址),AP(augument pointer,指向棧中函數調用的實參位置),ISP(interrupt stack pointer,中斷棧指針),以及其他的通用寄存器等。(3)系統層次的保存:包括proc,u,虛擬存儲空間管理表格,中斷處理棧,以便于該進程再一次得到CPU時間片時能正常運行下去。

1.1 并行化

編程中涉及到的一些小的、較簡單的問題的計算是可以互不干擾的,可以同時處理,而在關鍵點則需要統一在一個地方來處理,這樣程序的運行就是并行的,至少從人的時間觀念上來說是并行的。

1.2 簡單有序

程序員為每個進程設計好相應的功能,并通過一定的通訊機制將它們有機地結合在一起,對每個進程的設計是簡單的,只在總控部分要詳細分析,仔細設計。

1.3 互不干擾

在操作系統的控制下, 各個進程相互獨立、互不干擾、互不破壞。

1.4 事務化

將程序設計成一個進程只處理完成一個事務,每個進程完成相應事務后消失。這樣編程簡單、清淅。

2 常用于多進程編程的系統調用

用于多進程編程的系統調用較多,本文只介紹相應的系統調用及功能,這些系統調用的語法、參數可通過查閱相應的手冊得到。有關信號量操作的系統調用是難點,本文以例說明。

fork()(功能:創建一個新的進程)、system()(功能:產生一個新的進程,子進程執行指定的命令)、exec()(功能:執行一個文件)、popen()(功能:初始化從/到一個進程的管道)、pclose()(功能:關閉到一個進程的管道)、wait()(功能:等待一個子進程返回并修改狀態)、waitpid()(功能:等待指定進程號的子進程的返回并修改狀態)、setpgrp()(功能:設置進程組號和會話號)、exit()(功能:終止進程)、signal()(功能:信號管理功能)、kill()(功能:向一個或一組進程發送一個信號)、alarm()(功能:設置一個進程的超時時鐘)、msgsnd()(功能:發送消息到指定的消息隊列中)、msgrcv()(功能:從消息隊列中取得指定類型的消息)、msgctl()(功能:消息控制操作)、msgget()(功能:取得一個消息隊列)、 shmat()(功能:聯接共享內存的操作)、shmdt()(功能:斷開共享內存聯接的操作)、shmget()(功能:取得共享內存段)shmctl()(功能:共享內存控制操作)、semctl()(功能:信號量控制操作)、semget()(功能:取得一組信號量)、semop()(功能:信號量操作)sdenter()(功能:共享數據段同步訪問,加鎖)、sdleave()(功能:共享數據段同步訪問,解鎖)、sdfree()(功能:將共享數據段從調用進程的數據空間中斷開聯接)、sdgetv()(功能:同步共享數據訪問)、sdwaitv()(功能:同步共享數據訪問)、sbrk()(功能:修改數據段空間分配)、getenv()(功能:取得指定環境變量值)。

包括信號量操作的所有系統調用的例子:

#include

#include

#include

#define SEMKEY 75

int semid;

unsigned int count;

/*在文件sys/sem.h中定義的sembuf結構

*struct sembuf {

*unsigned short sem_num;

*short sem_op;

*short sem_flg;

*}*/

struct sembuf psembuf,vsembuf; /*P和V操作*/

cleanup()

{

semctl(semid,2,IPC_RMID,0);

exit(0);

}

main(argc,argv)

int argc;

char *argv[];

{

int i,first,second;

short initarray[2],outarray[2];

extern cleanup();

if (argc==1) {

for (i=0;i<20;i++)

signal(i,clearup);

semid=semget(SEMKEY,2,0777|IPC_CREAT);

initarray[0]=initarray[1]=1;

semctl(semid,2,SETALL,initarray);

semctl(semid,2,GETALL,outarray);

printf(\"sem init vals %d%d \\",

outarray[0],outarray[1]);

pause(); /*睡眠到被一軟件中斷信號喚醒*/

}

else if (argv[1][0]=='a') {

first=0;

second=1;

}

else {

first=1;

second=0;

}

semid=semget(SEMKEY,2,0777);

psembuf.sem_op=-1;

psembuf.sem_flg=SEM_UNDO;

vsembuf.sem_op=1;

vsembuf.sem_flg=SEM_UNDO;

for (count=0;;xcount++) {

psembuf.sem_num=first;

semop(semid,psembuf,1);

psembuf.sem_num=second;

semop(semid,psembuf,1);

printf(\"proc %d count %d\\",getpid(),count);

vsembuf.sem_num=second;

semop(semid,vsembuf,1);

vsembuf.sem_num=first;

semop(semid,vsembuf,1);

}

}

3 多進程編程技巧

3.1 主要程序結構

(1)事件主控方式

若是應用程序屬于事務處理方式,則在主函數中設計為監控事件發生,當事件發生時,可以生成一個新的進程來處理該事務,事務處理完成后就可以讓子進程退出系統。這種處理方式一般不要消息傳遞。

(2)信息協調方式

若是應用程序需要由多個進程協調處理完成,則可以生成這些進程,通過消息在進程間的傳遞,使各個進程能相互協調,共同完成事務。這種處理方式一般是用fork()生成幾個進程后,用exec()調用其它程序文件,使得不同的程序同時在系統內運行。然后通過IPC機制傳送消息,使各個程序能協調運行。

3.2 選擇主體分叉點

(1)事件初始產生

對應于事件主控方式的程序結構,關鍵點在于以何種方式選擇事件的初始發生點,如網絡程序給出的建鏈信息,主控程序在收到該消息后就認為是一個事件開始,則可以產生一個子進程處理后面的事務:接收交易信息,事務處理,發送返回交易信息,關閉鏈接等。完成后將子進程退出系統。

(2)主程序自主產生

對應于信息協調方式的程序結構,主控程序只負責生成幾個子進程,各個子進程分別調用exec()將不同的執行文件調入內存運行,主控程序在生成所有的子進程后即可退出系統,將子進程留在內存中運行。

3.3 進程間關系處理

(1)父子進程關系

進程組處理:子進程自己組成一個新的進程組,即調用setpgrp()與原進程組脫離關系,產生一個新的進程組,進程組號與它的進程號相同。這樣,父進程退出運行后就不會影響子進程的當前運行。另外,父進程在產生子進程前最好屏蔽子進程返回信號的處理,生成子進程,在父進程退出運行后,子進程返回則其進程返回信號的處理會由系統給出缺省處理,子進程就以正常退出。

(2)兄弟進程關系

對于信息協調方式的程序來說,各兄弟進程間十分需要相互了解進程號,合理的方法是父進程生成一個共享內存的空間,每個子進程都在啟動時在共享內存中設置自己的進程號,這樣,就可以在共享內存中訪問得到所需要的進程號。

3.4 進程間通訊處理

進程間通訊處理主要考慮(1)共享內存需要的鎖機制。(2)消息隊列需要的關鍵值。(3)信號需要信號處理函數設置和再設置。(4)IPC的權限設置。(5)信號中斷只對系統調用一級有效。

參考文獻:

[1] 湯子贏,等.計算機操作系統[M].西安:西安電子科技大學出版社,1999.390-414.

[2] (美)Herb schildt.吳雙譯.C語言大全[M].北京:中國科學院希望電腦技術公司出版,2000.

[3] (美)Robin Rark.前導工作室,譯.UNIX技術大全[M].北京:機械工業出版社,1998.

[4] 孟慶昌,等.UNIX教程(修訂本)[M].西安:電子工業出版社出版,2000.141-175.

[5] (美)Dave Taylor.李際,譯.UNIX教程(第三版)[M].北京:人民郵電出版社,2002.

注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文

主站蜘蛛池模板: 玩两个丰满老熟女久久网| 亚洲一区毛片| 成年免费在线观看| 大学生久久香蕉国产线观看| 欧美在线免费| 免费激情网站| 亚洲欧美色中文字幕| 亚洲国产天堂久久综合| 色哟哟国产精品一区二区| 2020国产在线视精品在| 九九九国产| 在线免费a视频| 日本国产一区在线观看| 日本色综合网| 国产福利一区在线| 欧美一区二区丝袜高跟鞋| 一本久道久综合久久鬼色 | 亚洲一级毛片免费观看| 亚洲国产成人精品青青草原| 国产精品一线天| 麻豆精品视频在线原创| 亚洲精品无码高潮喷水A| 国内丰满少妇猛烈精品播| 亚洲精品成人片在线观看| 国产午夜精品一区二区三| 国产成人综合网在线观看| 亚洲综合网在线观看| 这里只有精品国产| 国产无吗一区二区三区在线欢| 欧美色视频网站| 国产精品不卡片视频免费观看| 四虎亚洲国产成人久久精品| 中文一级毛片| 日本色综合网| 亚洲色中色| 婷婷99视频精品全部在线观看| 色综合手机在线| 国产精品免费露脸视频| 国产精品一线天| 亚洲A∨无码精品午夜在线观看| 精品91视频| 日韩在线第三页| 亚洲国产精品VA在线看黑人| 国产精品美女自慰喷水| 欧美国产视频| 欧美精品导航| 亚洲国产亚综合在线区| 欧美笫一页| 亚洲欧美另类久久久精品播放的| 精品福利网| 国产91高跟丝袜| 五月天综合婷婷| 人妻丰满熟妇αv无码| 曰AV在线无码| 国产精品乱偷免费视频| 免费看美女毛片| 自慰网址在线观看| 亚洲国产精品日韩av专区| 无码日韩视频| 国产一区二区人大臿蕉香蕉| 91久久偷偷做嫩草影院精品| 国产老女人精品免费视频| 久久99国产综合精品1| 亚洲欧美不卡中文字幕| 成年片色大黄全免费网站久久| 欧美亚洲激情| 亚洲国产欧洲精品路线久久| 天堂成人在线| 狠狠色综合网| 免费国产无遮挡又黄又爽| 日韩一区二区三免费高清| 国产在线观看一区二区三区| 欧美有码在线| 欧美伦理一区| 亚洲精品自在线拍| 久久黄色毛片| 亚洲婷婷丁香| 高清乱码精品福利在线视频| 欧美色伊人| 亚洲 日韩 激情 无码 中出| 精品成人免费自拍视频| 天堂av高清一区二区三区|