日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

《操作系统》实验报告——进程管理

發布時間:2024/10/5 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《操作系统》实验报告——进程管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

理論知識

Linux——進程管理

1.實驗目的

(1)加深對進程概念的理解,明確進程和程序的區別。

(2)進一步認識并發執行的實質。

(3)分析進程爭用資源的現象,學習解決進程互斥的方法。

?

2.實驗預備內容

(1)復習課本關于進程控制和進程同步的內容,加深對進程管理概念的理解。

(2)認真閱讀實驗材料中進程管理部分,分析多個進程的運行情況。

?

3.實驗內容

(1)運行源碼

運行上文進程管理中給出的例子,查看自己運行的結果,并進行分析。

(2)進程的創建

自己編寫一段程序,使用系統調用fork()創建子進程,認識進程的并發執行。

#include<stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h>int main(){pid_t pid;pid=fork();if(pid<0) /* 如果出錯 */printf("error occurred!\n");else if(pid==0) /* 如果是子進程 */{printf("我是子進程1,進程號是%d\n",getpid());pid_t pid1;pid1 = fork();if(pid1==0){printf("我是子進程1的子進程,進程號是%d\n",getpid());}}else{printf("我是父進程,進程號是%d\n",getpid());pid=fork();if(pid==0)printf("我是子進程2,進程號是%d\n",getpid());else{pid=fork();if(pid==0)printf("我是子進程3,進程號是%d\n",getpid());}}return 0;}

(3)進程的同步

自己編寫一段程序,利用fork()、wait()等系統調用實現父子進程間的同步。

#include<stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main() {int p1,p2,i;while((p1=fork())==-1);if(p1==0){lockf(1,1,0);for(i=0;i<50000; i++)printf("son%d\n",i);lockf(1,0,0);}else{while((p2=fork())==-1);if(p2==0){lockf(1,1,0);for(i=0;i<50000;i++)printf("daughter%d\n",i);lockf(1,0,0);}else{lockf(1,1,0);for(i=0;i<50000;i++)printf("parent%d\n",i);lockf(1,0,0);}}return 0; }

(四個進程管理的程序)

程序1

#include "stdio.h" main() {int i,j,k; if (i=fork()) {j=wait(); printf("Parent Process!\n"); printf("i=%d,j=%d,k=%d\n",i,j); } else {k=getpid(); printf("Child Process!\n"); printf("i=%d,k=%d\n\n",i,k); } }

?

使用fork()的進程是父進程,通過fork()建立的新進程是子進程。

fork()創建成功,返回值對子進程是0,對父進程是子進程的pid(一個正整數)。

在調用fork()后,父進程和子進程均從下一條語句開始執行。

wait()的功能是阻塞父進程,等待子進程完成后使得父進程繼續工作。

wait()的返回值是所等待的子進程的進程標識符。

getpid()返回調用進程的進程標識符,則輸出子進程的k與父進程的i,j相等。

輸出結果可能是:

Child Process! i=0,k=9351 Parent Process! i=9351,j=9351

?

程序2

#include <stdio.h> main() { int p1,p2; long i; char c1; while ((p1=fork())==-1); if (p1==0) {c1='B';write(1,&c1,1);for( i=0;i<3000000;i++) ; c1='b';write(1,&c1,1); } else {while ((p2=fork())==-1);if (p2==0){c1='C';write(1,&c1,1);for( i=0;i<3000000;i++) ;c1='c';write(1,&c1,1);}else{c1='A';write(1,&c1,1);for( i=0; i<3000000; i++) ;c1='a';write(1,&c1,1);}} }

用fork()創建兩個子進程,程序運行時,系統中有1個父進程和2個子進程活動。

每個進程在屏幕上顯示兩個字符,父進程顯示“A”和“a”。

write(1,&c1,1)的函數原型write(fd,buf,count):從buf所指向的內存中輸出count個字符的信息到fd所代表的文件中,fd為文件號,buf為一個地址,此處fd=1,代表的就是顯示屏,從地址&c1處輸出一個字符到屏幕上,就是顯示出c1,在每一個進程代碼中間都有循環語句起延時作用,能夠看出進程調度的效果。

為何不使用printf,printf經過緩沖,使用后,“A”和“a”會一次顯示出來,不會交錯顯示。

可能的輸出結果:AbbCca,AaBbCc,ABCcba等等。

程序3

main() {int m,n,k; m=fork(); printf("PID:%d\t",getpid()); printf("The return value of fork():%d\t\t",m); printf("hee\n"); n=fork(); printf("PID:%d\t",getpid()); printf("The return value of fork():%d\t\t",n); printf("ha\n"); k=fork(); printf("PID:%d\t",getpid()); printf("The return value of fork():%d\t\t",k); printf("ho\n"); }

程序3的簡化

main(){ fork();printf(“hee\n”); fork();printf(“ha\n”); fork();printf(“ho\n”); }

為了便于觀察,先打印出調用進程的進程標識符,而后是fork()的返回值。

若是

main(){ fork();printf(“hee\n”); }

打印出

hee (父進程)hee (子進程)

請大家上機抄下結果,畫出進程樹,在每一個進程結點邊上畫出標識符。

程序4

#include <stdio.h> main() { int i; if (fork()==0){for(i=0;i<10000;i++) printf(".......................\n"); } else {if (fork()==0){for( i=0; i<10000; i++)printf("#################\n");}else for (i=0;i<10000;i++)printf("******************\n"); } }

程序4中也是3個進程。

程序5

#include<stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main() {int p1,p2;while((p1=fork())==-1);if(p1==0)printf("b.My process ID is %d\n",getpid());else{while((p2=fork())==-1);if(p2==0)printf("c.My process ID is %d\n",getpid());else printf("a.My process ID is %d\n",getpid());}return 0; }

程序6

#include<stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main() { int m,n,k;m=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",m);printf("he\n");n=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",n);printf("ha\n");k=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",k);printf("ho\n");return 0; }

程序7

#include<stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main() {int p1,p2,i;while((p1=fork())==-1);if(p1==0)for(i=0;i<50000; i++)printf("son%d\n",i);else{while((p2=fork())==-1);if(p2==0)for(i=0;i<50000;i++)printf("daughter%d\n",i);elsefor(i=0;i<50000;i++)printf("parent%d\n",i);}return 0; }

參考文章

?

總結

以上是生活随笔為你收集整理的《操作系统》实验报告——进程管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。