操作系统报告_第1页
操作系统报告_第2页
操作系统报告_第3页
操作系统报告_第4页
操作系统报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

仅供个人参考计算机操作系统linux上机实验上机实验(1-4)班级:计科0801姓名:李超学号:04081012(12)不得用于商业用途仅供个人参考实验1 掌握Linux基本命令和开发环境一、实验内容1. 掌握常用的Linuxshell 命令;掌握编辑环境VIM;掌握编译环境gcc及跟踪调试工具gdb二.实验步骤通过学习课外参考书,如《linuxc编程》和《鸟哥的私房菜》。掌握一些基本的linux命令,如cd,ls,sudo,reboot,shutdown等等掌握一些基本的vim编程命令,并可以通过gcc编译和gdb调试。三.实验心得通过这些基本的实验内容,对linux有了一定的基本了解,可以实现一些linux的基本操作,对我这个初学者的帮助很大,对linux感到不再陌生。实验2 进程一.实验内容通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX规范中fork和kill系统调用的功能和使用。二.实验前准备学习man命令的用法,通过它查看fork和kill系统调用的在线帮助,并阅读参考资料,学会fork与kill的用法。复习C语言的相关内容。三.实验问题你最初认为运行结果会怎么样?答:会一直输出程序的进程名,并输出他的进程号。当输入数字时,会杀死对应的进程。实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。答:程序会一直输出创建的进程号,当输出数字时,会杀死对应的进程。当杀死完0-9进程时,程序依然没有退出。当输入‘ q’程序结束。杀死完 0-9进程,但主进程并没有结束,所以一直会执行下去。直到输入‘q’后,主线程结束。proc_number这个全局变量在各个子进程里的值相同吗?为什么?答:不同,每一个进程创建后,proc_number就已经复制了,并且和对应的线程不得用于商业用途仅供个人参考一样。各线程分时运行,丛输出结果可以得出结论。4.kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?答:两次 第一次为:kill(pid[ch-'0'],SIGTERM);第二次为:kill(0,SIGTERM);前者为杀死对应号的单一进程,后者为杀死所有的这个程序的进程。使用kill命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?答:没能理解这个问题。通过psaux|grepprocess命令得到了当前进程的个数,杀死进程后。未发现进程减少(觉得应该减少)。四.实验心得通过本次实验,了解了进程的相关知识,包括创建,杀死,执行等等。以及和主线程的关系,对linux的认识更深了一步。实验3 线程一.实验内容通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。掌握POSIX规范中pthread_create()函数的功能和使用方法。.实验前准备阅读参考资料,了解线程的创建等相关系统调用。三.实验问题你最初认为前三列数会相等吗?最后一列斜杠两边的数字是相等,还是大于或者小于关系?答:最初认为会很接近。认为后面两个数回相等。2.最后的结果如你所料吗?有什么特点?对原因进行分析。答:结果第一个进程数字很大,因为他最先建立,并且中间有 1s的延时。后面两个数sum值大于main_counter,一开始被这个问题困住了。原因是因为main_counter的自加是和其他进程共用的,有可能同一时刻3个时刻sum++但main_counter只加一次,main_counter++分3步,先给自己赋值在+1。所以sum>main_counter3.thread 的CPU占用率是多少?为什么会这样?答:196%han63791960.026356504pts/0Sl+20:520:21./posix3不得用于商业用途仅供个人参考我认为因为现在的电脑多为双核2线程,只保证2个线程并发执行,固系统不断的运行自加,是cpu的占有率增大。4.thread_worker() 内是死循环,它是怎么退出的?你认为这样退出好吗?答:随着主程序的退出而退出。不好把你的程序源代码附到实验报告后。并请保留源代码,下次实验需要使用。四.实验心得通过本次实验,了解了线程的基本应用和他的特点,对线程的认识更深了一步。实验4 互斥(修改第三题)一.实验母的通过观察、分析实验现象,深入理解理解互斥锁的原理及特点掌握在POSIX规范中的互斥函数的功能及使用方法。二.实验前准备准备好上节实验完成的程序thread.c。阅读参考资料,了解互斥锁的加解锁机制及相关的系统调用三.实验内容找到thread.c的代码临界区,用临界区解决main_counter与sum不同步的问题。.实验问题回答下列问题,写入实验报告。你预想posix3+.c的运行结果会如何?答:sum和main_counter的值是一样的2.posix3+.c的实际运行结果如何?多次运行每次的现象都一样吗?为什么会这样?答:sum和main_counter的值很接近,有时候完全一样。因为中间的输出还有一定的时间差,在加到for循环外面时结果就正确了。把修改后的两个程序的源代码附在实验报告后。实验4 互斥实验报告回答下列问题,写入实验报告。你预想deadlock.c的运行结果会如何?答:全都执行完deadlock.c的实际运行结果如何?多次运行每次的现象都一样吗?为什么不得用于商业用途仅供个人参考会这样?答:只有主线程能运行完。不一样。两个线程产生了互斥条件,有的时候主线程显得到资源,运行完后释放,有时候第二个线线程先得到资源运行。这就导致了不一样。实验心得:通过本次实验,了解了互斥机制,对课本上死锁的概念更加的理解,以及死锁发生的条件和解除死锁的方法。对问题的分析结合理论更加的清除。程序代码:实验2:#include<stdio.h>#include<sys/types.h>#include<signal.h>#include<ctype.h>#include<unistd.h>#defineMAX_CHILD_NUMBER10#defineSLEEP_INTERVAL2intproc_number=0;voiddo_something();intmain(intargc,char*argv[]){intchild_proc_number=MAX_CHILD_NUMBER;inti,ch;pid_tchild_pid;pid_tpid[10]={0};if(argc>1){child_proc_number=atoi(argv[1]);child_proc_number=(child_proc_number>10)?10:child_proc_number;}printf("fork\n");for(i=0;i<child_proc_number;i++){child_pid=fork();if(child_pid>0)不得用于商业用途仅供个人参考pid[i]=child_pid;elseif(child_pid==0){proc_number=i;do_something();}elseprintf("createprcessfailed\n");}while((ch=getchar())!='q'){if(isdigit(ch)){kill(pid[ch-'0'],SIGTERM);}}sleep(2);kill(0,SIGTERM);return0;}voiddo_something(){for(;;){printf("thisisprocessNO.%d--pid=%d\n",proc_number,getpid());sleep(2);}}实验3:#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>#include<ctype.h>#include<pthread.h>#defineMAX_THREAD3不得用于商业用途仅供个人参考unsignedlonglongmain_counter,counter[MAX_THREAD];void*thread(void*p);intmain(intargc,char*argv[]){inti,rtn,ch;unsignedlonglongsum=0;pthread_tpthread_id[MAX_THREAD]={0};for(i=0;i<MAX_THREAD;i++){*)thread,&i);

rtn=pthread_create(&pthread_id[i],NULL,(voidif(rtn!=0){printf("creadte pthreaderror\n");exit(1);}sleep(1);}do{printf("\n");for(i=0;i<MAX_THREAD;i++){号:%llu\n",counter[i]);

sum+=counter[i];printf(" 线程}printf("main=%llu/sum=%llu",main_counter,sum);sum=0;}while((ch=getchar())!='q');return0;}void*thread(void*p){intthread_num=*(int*)p;for(;;){不得用于商业用途仅供个人参考main_counter++;counter[thread_num]++;}}实验4:#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<signal.h>#include<ctype.h>#defineLOOP_TIME10pthread_mutex_tmutex1;pthread_mutex_tmutex2;void*thread(void*);voidcritical_section(intthread_num,inti);intmain(){intrtn,i;pthread_tpthread_id=0;rtn=pthread_create(&pthread_id,NULL,thread,NULL);if(rtn!=0){printf("pthread_createerror\n");return0;}for(i=0;i<LOOP_TIME;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_mutex_destroy(&mutex2);return0;不得用于商业用途仅供个人参考}void*thread(void*p){inti;for(i=0;i<LOOP_TIME;i++){pthread_mutex_lock(&mutex1);pthread_mutex_lock(&mutex2);critical_section(2,i);pthread_mutex_unlock(&mutex2);pthread_mutex_unlock(&mutex1);}}voidcritical_section(intthread_num,inti){printf("thread%d:%d\n",thread_num,i);}实验3+:#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>#include<ctype.h>#include<pthread.h>#defineMAX_THREAD10pthread_mutex_tmutex1=PTHREAD_MUTEX_INITIALIZER;//pthread_mutex_tmutex2=PTHREAD_MUTEX_INITIALIZER;unsignedlonglongmain_counter,counter[MAX_THREAD];void*thread(void*p);intmain(intargc,char*argv[]){inti,rtn,ch;unsignedlonglongsum=0;pthread_mutex_init(&mutex1,NULL);pthread_tpthread_id[MAX_THREAD]={0};for(i=0;i<MAX_THREAD;i++)不得用于商业用途仅供个人参考{rtn=pthread_create(&pthread_id[i],NULL,(void*)thread,&i);if(rtn!=0){printf("creadte pthreaderror\n");exit(1);}sleep(1);}do{printf("\n");pthread_mutex_lock(&mutex1);for(i=0;i<MAX_THREAD;i++){为:%llu\n",counter[i]);

sum+=counter[i];printf(" 该线程值}printf("main=%llu/sum=%llu",main_counter,sum);pthread_mutex_unlock(&mutex1);sum=0;}while((ch=getchar())!='q');pthread_mutex_destroy(&mutex1);return0;}void*thread(void*p){intthread_num=*(int*)p;for(;;){pthread_mutex_lock(&mutex1);counter[thread_num]++;main_counter++;不得用于商业用途仅供个人参考pthread_mutex_unlock(&mutex1);}}不得用于商业用途仅供个人参考仅供个人用于学习、研究;不得用于商业用途。Forpersonaluseonlyinstudyandresearch;notforcommercialuse.Nurfürdenpers?nlichenf ürStudien,Forschung,zukommerziellenZweckenv

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论