《操作系统实验报告(全)(共8页).doc》由会员分享,可在线阅读,更多相关《操作系统实验报告(全)(共8页).doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 操 作 系 统 实 验 报 告 书院系名称: 电子工程学院电子指导教师: 班 级: 学号: 学生姓名: 实验题目一:进程一、实验目的通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。二、实验内容(1) 补充POSIX 下进程控制的残缺版实验程序(2)回答下列问题: 1. 你最初认为运行结果会怎么样?2. 实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。3. proc_number 这个全局变量在各个子进程里的值相同吗?为什么?4. kill 命令在程序中使用了几次?
2、每次的作用是什么?执行后的现象是什么?5. 使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?三、实验步骤1.根据题意进入DOC环境中编写程序。2.编译,链接,运行程序,进行调试。3.分析实验结果及回答问题。 四、调试情况,回答问题及体会1、对自己设计进行评价,指出合理和不足之处,提出改进的方案。2、在设计过程中的感受。调试情况: 回答上述实验内容中的问题1 预期结果:会持续输出0-9号进程,直到输入数字键+回车,则会杀死该进程,接下来的输出将不会有该进程号,当输入q+回车,则退出程序。2 实际结果:与预期差不多,因输入进程总数20大于设定的最大进程数
3、,因此按进程数10来处理。随机输出0-9号进程,sleep(SLEEP_INTERVAL),循环输出,直到输入数字键,则会杀死该数字对应的进程,直到输入q退出循环,然后杀死本组所有进程。分析:每创建一个子进程时,将其pid存储在pidi中,i存储在proc_number,然后调用死循环函数do_something(),输出该进程的代号proc_number;当输入数字键时,主进程会执行kill(pidch-0,SIGTERM),从而杀死(ch-0)号进程。当输入q时循环退出,kill(0,SIGTERM),杀死本组所有进程。程序退出。3. proc_number这个全局变量在各个子进程里的值相
4、同,因为子进程相互独立,资源互不影响。4kill命令在程序中使用了2次:kill(pidch-0,SIGTERM); kill(0,SIGTERM);第一次是杀死该进程号pidch-0,执行后接下来的结果中不会有该进程号,用另一个终端打开,使用命令ps aux | grep process,因为子进程先于父进程退出,则被杀死的进程为僵死状态,但我加了行代码wait(&pidch-0),就会使该子进程真正结束。第二次是杀死本组所有进程。即主进程以及它创建的所有子进程。执行后程序退出,进程结束。5进程在main函数中return,或调用exit()函数都可以正常退出。而使用kill命令则是异常退出
5、。当然是正常退出比较好,若在子进程退出前使用kill命令杀死其父进程,则系统会让init进程接管子进程。当用kill命令使得子进程先于父进程退出时,而父进程又没有调用wait函数等待子进程结束,子进程处于僵死状态,并且会一直保持下去,直到系统重启。子进程处于僵死状态时,内核只保存该进程的必要信息以被父进程所需,此时子进程始终占着资源,同时减少了系统可以创建的最大进程数。体会:通过这次试验,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。同时也认识到自己在理论知识上的缺陷,从操作实践中更加了解了进程。五、源代码(略,详见电子版)
6、 实验题目二:线程管理一、实验目的通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。掌握在POSIX 规范中pthread_create() 函数的功能和使用方法。二、实验内容(1) 补充POSIX 下进程控制的残缺版实验程序 (2).回答下列问题:1. 你最初认为前三列数会相等吗?最后一列斜杠两边的数字是相等,还是大于或者小于关系? 2. 最后的结果如你所料吗?有什么特点?试对原因进行分析。 3. thread 的CPU 占用率是多少?为什么会这样? 4. thread_worker()内是死循环,它是怎么退出的?你认为这样退出好吗?三、实验
7、步骤 1.根据题意进入DOC环境中编写程序。2.编译,链接,运行程序,进行调试。3.分析实验结果及回答问题。 四、调试情况,回答问题及体会1、对自己设计进行评价,指出合理和不足之处,提出改进的方案。2、在设计过程中的感受。回答上述实验内容中的问题1 试验运行前我认为前三列数不会相等,因为三个线程运行次数是随机的,结果不可预料,当然counteri值不会一定相等。而我认为main_counter与sum值应该是相等的。因为都是三个线程的counter之和。2 而实验结果是前三列数确实不相等。不过main_counter与sum的值也不相等,main_counter sum,经分析讨论得出解释:因
8、为三个线程在共同争取运行thread_worker()函数,比如main_counter初值为0,pthread_id0执行之后main_counter+1,此时还未来得及将值赋给main_counter,这时的main_counter还是0;pthread_id1也执行这个函数,main_counter+1,若此时在1号线程将main_counter+1的值还未赋给main_counter,即这时的main_counter还是0,pthread_id2也来执行这个函数,main_counter+1,此时三个线程才将加完之后的值赋给main_counter,则main_counter=0+1=
9、1,而真正执行次数sum=0+1+1+1=3。main_counter sum。3 thread的CPU占用率在我的机子上执行结果是181,因为三个线程是无限循环的运行,使得cpu占用率很高。4 thread_worker()函数内是死循环,退出时因为主函数中设置的输入q时循环退出。输入q时主进程执行退出,return 退出程序,则子线程也强制退出。这样退出不好。体会:通过这次试验,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。掌握在POSIX 规范中pthread_create() 函数的功能和使用方法。将理论和实践结合起来,更加理解了线程。五、源代码(略,详见
10、电子版) 实验题目三:互斥一、实验目的通过观察、分析实验现象,深入理解理解互斥锁的原理及特点;掌握在POSIX 规范中的互斥函数的功能及使用方法。二、实验内容1找到thread.c 的代码临界区,用临界区解决main_counter 与sum 不同步的问题。2阅读下列代码,回答问题:#include#include#include#include#include#define LOOP_TIMES 1000pthread_mutex_t mutex1=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_t mutex2=PTHREAD_MUTEX_INITIALIZ
11、ER;void* thread_worker(void *);void critical_section(int threadd_num,int i);int main(int argc,char *argv)int rtn,i;pthread_t pthread_id=0;rtn=pthread_create(&pthread_id,NULL,thread_worker,NULL);if(rtn!=0)printf(pthread_create ERROR!n);return -1;for(i=0;iLOOP_TIMES;i+)pthread_mutex_lock(&mutex1);pthr
12、ead_mutex_lock(&mutex2);critical_section(1,i);pthread_mutex_unlock(&mutex2);pthread_mutex_unlock(&mutex1);pthread_mutex_destroy(&mutex1);pthread_mutex_destroy(&mutex2);return 0;void *thread_worker(void* p)int i;for(i=0;iLOOP_TIMES;i+)pthread_mutex_lock(&mutex2);pthread_mutex_lock(&mutex1);critical_s
13、ection(2,i);pthread_mutex_unlock(&mutex2);pthread_mutex_unlock(&mutex1);void critical_section(int thread_num,int i)printf(Thread%d:%dn,thread_num,i);1. 你预想deadlock.c 的运行结果会如何?2. deadlock.c 的实际运行结果如何?多次运行每次的现象都一样吗?为什么会这样?三、实验步骤1.根据题意进入DOC环境中编写程序。2.编译,链接,运行程序,进行调试。3.分析实验结果及回答问题。 四、调试情况,回答问题及体会死锁调试结果:修
14、改后调试结果:回答问题:1程序运行会出现中止现象,可能会资源互斥。2实际运行时程序会在运行期间中止,出现死锁现象。多次运行之后现象都一样。解释如下:主线程申请mutex1资源,而子线程申请mutex2资源,此时主线程继续申请mutex2资源,子线程来申请mutex1资源,而mutex2资源还未被子线程释放,主线程无法申请到,同样的,mutex1资源未被主线程释放则子线程也无法申请到,此时便处于无限循环等待,形成死锁。心得体会:通过本次实验使我深入理解了互斥锁的原理及特点,掌握了在POSIX 规范中的互斥函数的功能及使用方法,对于所学理论知识有了更好的理解。五、源代码修改后的程序:#includ
15、e#include#include#include#include#define LOOP_TIMES 1000pthread_mutex_t mutex1=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_t mutex2=PTHREAD_MUTEX_INITIALIZER;void* thread_worker(void *);void critical_section(int threadd_num,int i);int main(int argc,char *argv)int rtn,i;pthread_t pthread_id=0;rtn=pthread
16、_create(&pthread_id,NULL,thread_worker,NULL);if(rtn!=0)printf(pthread_create ERROR!n);return -1;for(i=0;iLOOP_TIMES;i+)pthread_mutex_lock(&mutex1);pthread_mutex_lock(&mutex2);critical_section(1,i);pthread_mutex_unlock(&mutex2);pthread_mutex_unlock(&mutex1);pthread_mutex_destroy(&mutex1);pthread_mute
17、x_destroy(&mutex2);return 0;void *thread_worker(void* p)int i;for(i=0;iLOOP_TIMES;i+)pthread_mutex_lock(&mutex1);pthread_mutex_lock(&mutex2);critical_section(2,i);pthread_mutex_unlock(&mutex2);pthread_mutex_unlock(&mutex1);void critical_section(int thread_num,int i)printf(Thread%d:%dn,thread_num,i); 专心-专注-专业