- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统实验二实验报告.
操作系统实验报告——实验二:线程和管道通信实验一、实验目的通过 Linux 系统中线程和管道通信机制的实验,加深对于线程控制和管道通信概念的理解,观察和体验并发进(线)程间的通信和协作的效果 ,练习利用无名管道进行进(线)程间通信的编程和调试技术。二、实验说明1) 与线程创建、执行有关的系统调用说明线程是在共享内存中并发执行的多道执行路径,它们共享一个进程的资源,如进程程序段、文件描述符和信号等,但有各自的执行路径和堆栈。线程的创建无需像进程那样重新申请系统资源,线程在上下文切换时也无需像进程那样更换内存映像。多线程的并发执行即避免了多进程并发的上下文切换的开销又可以提高并发处理的效率。pthread库中最基本的调用。1.pthread_create 系统调用语法: #include pthread.hIntpthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void *) Void *arg); pthread_create函数创建一个新的线程。pthread_create在 thread 中保存新线程的标识符。Attr决定了线程应用那种线程属性。使用默认可给定参数 NULL; (*start_routine) 是一个指向新线程中要执行的函数的指针arg是新线程函数携带的参数。Pthread_create执行成功会返回0并在 thread 中保存线程标识符。执行失败则返回一个非0的出错代码2.pthread_exit 系统调用语法: #include pthread.hvoidpthread_exit(void *retval);pthread_exit函数使用函数pthread_cleanup_push调用任何用于该线程的清除处理函数,然后中止当前进程的执行,返回retval。Retval可以由父线程或其他线程通过pthread_join来检索。一个线程也可以简单地通过从其初始化函数返回来终止。3.pthread_join 系统调用语法: #include pthread.hintpthread_join(pthread_tth, void **thread_return); intpthread_detach(pthread_tth); 函数pthread_join用于挂起当前线程,直到th指定的线程终止运行为止。2)管道通信机制管道 pipe 是进程间通信最基本的一种机制。在内存中建立的管道称为无名管道, 在磁盘上建立的管道称为有名管道。无名管道随着进程的撤消而消失,有名管道则可以长久保存,shell 命令符| 建立的就是无名管道,而 shell 命令mkfifo建立的是有名管道。两个进程可以通过管道一个在管道一端向管道发送其输出,给另一进程可以在管道的另一端从管道得到其输入.管道以半双工方式工作,即它的数据流是单方向的. 因此使用一个管道一般的规则是读管道数据的进程关闭管道写入端,而写管道进程关闭其读出端。管道既可以采用同步方式工作也可以采用异步方式工作。三、实验内容题目:设有二元函数 f(x,y) = f(x) + f(y) 其中:f(x) = f(x-1) * x (x 1) f(x)=1 (x=1) f(y) = f(y-1) + f(y-2) (y 2) f(y)=1 (y=1,2) 请编程建立 3 个并发协作进程,它们分别完成 f(x,y)、f(x)、f(y)(1)首先要创建三个线程,分别执行f(x)、f(y)和f(x,y)函数,通过pthread_create系统调用即可以创建相应的线程,若创建成功则返回0并保存线程标识符。(2)线程之间的通信是通过管道实现,在内存中建立的管道称为无名管道,在磁盘上建立的管道称为有名管道。无名管道随着线程的撤销而消失。通过pipe系统调用即可创建相应的管道。(3)管道通信的数据流是单方向的,管道的一端只能作为输入端或输出端,通过系统调用read(intpipe_id,const void *buf,size_t count)、write(intpipe_id,const void *buf,size_t count)即可实现管道的读出与写入。(4)创建相应的线程和管道后,则要考虑相应线程的执行,这是要一个系统调用,pthread_join(pthread_tth, void **thread_return)系统调用是将当前的线程挂起,直到线程th执行结束。(5)线程运行结束,可以通过系统调用结束,pthread_exit(void *retval)系统调用可以结束当前的线程。四、实验结果五、实验中遇到的错误:编写完程序
文档评论(0)