- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
武汉大学操作系统大作业_2课案
Fork、Pthread实验报告
一、学习目标
1.学习fork函数和pthread函数的使用,阅读源码,分析两个函数的机理。
2.在系统中创建一个三层次父子进程树,并具有两层次线程,并打印运行中各个执行体的处理器使用、内存使用等基本信息。
二、基本原理
1、fork函数
fork函数的函数原型是pid_t fork( void)。fork()函数的响应函数是 sys_fork()、sys_clone()、sys_vfork()。这三个函数都是通过调用内核函数 do_fork() 来实现的。
使用do_fork()函数创建一个进程大致分为如下几个过程:
(1)向系统申请在内存中分配一个 task_struct 数据结构,即进程控制块PCB, do_fork()中通过使用alloc_task_struct()实现。task_struct是LINUX内核用以管理进程的结构体,它包含了进程状态、PID、内核栈等等执行进程所必须要的资源。
(2)对PCB进行初始化操作。通过执行*p=*curren,将父进程(当前进程)的PCB内容拷贝到新进程中去,重新设置 task_struct 结构中那些与父进程值不同的数据成员,为进程分配标志号。根据参数中传入的 clone_flags 参数值,决定是否要拷贝父进程 task_struct 中的指针 fs 、files 指针等所选择的部分。
(3)将新进程加入到进程链表中去,并拷贝父进程的上下文来初始化子进程上下文。启动调度程序,通过wake_up_process(p)唤醒子进程,并放入就绪队列当中。父进程返回子进程的PID,子进程返回0。
通过do_fork()函数以及示例代码运行结果,可以了解到fork()函数的如下特点:
(1)fork函数返回值Pid_t 是在头文件sys/types.h中定义的宏,在调用fork后会返回两个值,如果是子进程则返回值为0,如果是父进程则返回值大于0(为子进程的PID),如果创建进程失败则返回值小于0。
(2)通过fork函数创建的新进程是对父进程的复制,子进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致。通过示例代码1.1可以看见父、子进程最后执行结果中count的值都是1,这是因为子进程拷贝的是父进程当前的状态, count为0,执行了‘++’操作变为1。
(3)父进程和子进程的概念是相对的,如运行结果1.2所示,p722是p719的子进程,也是p724的父进程。父进程和子进程的执行顺序是不一定的,这依赖于系统调度。子进程和父进程的可执行程序是同一个程序、上下文和数据,绝大部分就是原进程(父进程)的拷贝,但它们是两个相互独立的进程,fork()以后,子进程就相当于父进程的兄弟一样了。
(4)在运行结果1.1中可以看见子进程输出时父进程的ID为1,这是因为在子进程执行printf语句的时候,父进程已经结束了,对于没有父进程的子进程系统会将其父进程置为init(PID为1)进程。
代码示例1.1
运行结果1.1
示例代码1.2
运行结果1.2
【注】 代码示例1.1运行结果如运行结果1.1所示,示例代码1.2运行结果如运行结果1.2所示。
2、pthread函数
Pthread中定义了一系列线程操作函数、同步互斥函数,此次主要学习了pthread_create()、pthread_join()、pthread_exit()函数。
(1)pthread_create()函数用于线程创建,第一个参数pthread_t *thread用于存储创建成功的线程的ID。第二个参数const pthread_attr_t * attr 用于给定线程属性,置为NULL则使用默认属性。
pthread_create()源代码中,新进程的参数、信息均被打包到request结构中,再通过__libc_write(__pthread_manager_request, (char *) request, sizeof(request)),将请求写入全局变量__pthread_manager_request,最后由__pthread_manager()函数创建并管理线程。
(2)pthread_join()函数用于挂起线程,第一个参数pthread_t thread,用于指定次需要等待结束的线程,当thread指定的线程没有终止,将导致调用线程挂起,直到由参数thread指定的线程终止。最后一个参数void**status是通过pthread_exit()函数传递进来的,如作业代码中主线程要等待线程1结束,而线程1要等待线程2结束。
(3)pthread_exit()函数用于结束线程,参数status将子线程的结束状态传递给主线程。主线程可以在pthread_jo
您可能关注的文档
最近下载
- 2024-2025学年人教版物理八年级上册《光现象》练习试题(含答案).pdf VIP
- 部队团结课件.pptx VIP
- 医疗沟通技巧:高效医患互动.pptx VIP
- 2025年河南大学附属中学小升初第一次模拟考试语文试卷 .pdf VIP
- 中电建协吊装技能竞赛理论知识 考试复习题(PDF-131).pdf VIP
- 锚索挡土墙施工技术与预应力锚索应用方案.docx VIP
- 91SB4-1(2005) 排水工程(建筑图集).docx
- 二十三章旋转图形的旋转.pptx VIP
- 新经典日语 第3册 第9課 血液型と性格.pptx VIP
- 2025年湖北艺术职业学院高职单招语文2018-2024历年参考题库频考点含答案解析.docx
文档评论(0)