操作系统实验报告-进程和线程_第1页
操作系统实验报告-进程和线程_第2页
操作系统实验报告-进程和线程_第3页
操作系统实验报告-进程和线程_第4页
操作系统实验报告-进程和线程_第5页
全文预览已结束

下载本文档

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

文档简介

计算机科学与软件学院操作系统上机实验报告学生姓名: 学号: 班级:班 实验日期: 2014.4.17 实验名称:进程和线程实验目的:理解unix/Linux下进程和线程的创建、并发执行过程。实验内容:1进程的创建2多线程应用实验步骤及分析:(此部分为关键内容:要求整理实验主要步骤,总结编写实验过程中遇到哪些问题,如何解决的,若未解决也应总结,回答思考题的答案)一、进程的创建下面这个C程序展示了UNIX系统中父进程创建子进程及各自分开活动的情况。1、实验指导fork( ) 创建一个新进程。 系统调用格式: pid=fork( )参数定义:int fork( )fork( )返回值意义如下:0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。0:在父进程中,pid变量保存的fork( )返回值为子进程的id值(进程唯一标识符)。-1:创建失败。如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程(parent process)的副本,称为子进程(child process)。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。父进程与子进程并发执行。2、参考程序代码/*process.c*/#include #include main(int argc,char *argv) int pid; /* fork another process */ pid = fork(); if (pid 0) /* error occurred */ fprintf(stderr, Fork Failed); exit(-1); else if (pid = 0) /* child process */ execlp( /bin/ls, ls,NULL); else /* parent process */ /* parent will wait for the child to complete */ wait(NULL); printf( Child Complete ); exit(0); 3、编译和运行$gcc process.c o processs4、运行$./process程序运行截图5、思考(1) 系统是怎样创建进程的?(2) 扩展程序,在父进程中输出1到5,在子进程中输出6-10,要求父子进程并发输出;记录实验结果,并给出简单分析。6.实验中遇到的问题和解决方法二、多线程应用编写unix/Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。下面是一个最简单的多线程程序 example1.c。1.实验指导下面的示例中,要使用到两个函数,pthread_create和pthread_join,并声明了一个pthread_t型的变量。函数pthread_create用来创建一个线程,它的原型为:extern int pthread_create _P (pthread_t *_thread, _const pthread_attr_t *_attr,void *(*_start_routine) (void *), void *_arg);第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。函数pthread_join用来等待一个线程的结束。函数原型为:extern int pthread_join _P (pthread_t _th, void *_thread_return);第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:extern void pthread_exit _P (void *_retval) _attribute_ (_noreturn_);唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给 thread_return。2、参考程序代码/* thread.c*/#include #include void thread(void)int i;for(i=0;i3;i+)printf(This is a pthread.n);int main(int argc,char *argv)pthread_t id;int i,ret;ret=pthread_create(&id,NULL,(void *) thread,NULL);if(ret!=0)printf (Create pthread error!n);exit (1);for(i=0;i3;i+)printf(This is the main process.n);pthread_join(id,NULL);return (0);3、编译和运行编译此程序:gcc example1.c -lpthread -o example1-lpthread:使用线程库运行example1,得到如下结果:This is the main process.This is a pthread.This is the main process.This is the main process.This is a pthread.This is a pthread.再次运行,可能得到如下结果:This is a pthread.This is the main process.This is a pthread.This is the m

温馨提示

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

评论

0/150

提交评论