实验04 同步机制.pptVIP

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
主要内容 实验目的 实验内容 相关基本原理 实验参考过程 实验目的 了解进程间同步技术 学习Linux同步原语 掌握进程间同步的实现技术 实验内容(1/2) 设计并实现一个新的内核同步原语,它允许多个进程等待一个事件而阻塞,直到其他进程产生这个事件的信号为止。 具体要实现以下几个系统调用 int evntopen(int eventid);用户使用这个系统调用,创建或者打开一个已有的事件 int evntclose(int eventid);用户使用这个系统调用删除一个已有的事件,参数eventid为需要删除的事件的ID、 int evntwait(int eventid);使用这个系统调用的线程会阻塞,直到产生参数eventid所定义的事件信号。 int evntsig(int eventid);产生eventid所定义的事件信号,从而取消所有正在等待的线程的阻塞。 实验内容(2/2) 2、编写测试程序 为了验证以上四个自己添加的系统调用的正确性,还需要另外编写一个用户态的应用程序来测试。该测试程序应该显示内核函数在通用情况下的工作。 相关基本原理 同步机制 进程同步是进程之间直接的相互作用,是合作进程间有意识的行为。两个进程之间有一定的依赖关系,因此我们也需要一定的同步机制来保证他们的执行次序。 现代操作系统中提供了一种或多种同步原语,程序员可以使用这些源于来协调多进程/多线程的软件行为。 经典的UNIX系统没有为多线程提供细粒度的操作,对进程进行同步的主要方法是管道和文件。 SysV UNIX在共享内存实现中提供了信号量机制。这些原语是在POSIX中定义的,并得到了Linux的支持。例如信号量相关的函数有semget()和semop()等。 阻塞任务 当进程在核心态的时候,在返回用户态之前,它可能需要等待一些条件变为真。 当进程阻塞时,内核代码就把这个进程链接到任务表,等特定的条件变为真。 因此在定义任务列表的时候,必须考虑每个进程阻塞的条件,只要相关的条件变为真就唤醒这个列表中的阻塞进程。 阻塞进程的一个范例是使用信号量,可以通过建立内核抽象数据类型来实现信号量。 等待队列 在内核的很多地方都回发生进程必须等待某些条件变为真的情况。 内核中有很多临界区。因此,Linux提供了一种基本抽象数据结构,成为等待队列,可以用来维护关于某个特定条件的等待队列。 实验参考过程 设计新的同步机制 实现evnt_init()函数在内核初始化时初始化时间机制 在内核中增加事件初始化函数int evntopen(int eventid) 在内核中增加事件关闭函数int evntclose(int eventid) 在内核中增加事件等待函数int evntwait(int eventid) 在内核中增加事件产生函数int evntsig(int eventid) 针对以上函数分别增加系统调用 编写测试程序,验证新的同步机制 设计新的同步机制 需要设计一种全新的机制并将其加入内核。 当增加这种机制时,可能需要建立自己的实现文件,并修改内核的MakeFile来编译新文件,还可能需要对现有的内核进行部分改造,如修改初始化代码 机制初始化函数evnt_init() evnt_init()函数在系统初始化时被调用的: int evnt_init(int)//不是系统调用 还需要修改系统初始化代码来调用新的evnt_init()函数。可以使用这个函数来设置以后在系统调用中需要的任何内部结构。 从解决问题所需要的数据结构入手,系统将需要支持几个不同的事件,因此需要一组数据结构,每一个事件一个。 在Linux内核中,每个事件也需要一个和共享内存段描述符类似的信息。 可以选择是使用这种描述符数组还是使用描述符列表,然后evnt_init()函数就可以对这个数据结构进行初始化。 如果使用了数组,那么仍然要为每个项动态分配空间。这需要调用kmalloc()和kfree()这两个动态分配内核内存的函数。 evnt_wait() 如果希望在等待队列和底层操作例程的层次上工作。那么evnt_wait()的代码框架应该类似于下面的结构: int evnt_wait(int evntnum){ … …->state=TASK_INTERRUPTIBLE; add_wait_queue(…); schedule(); } evnt_sig() 同样,evnt_sig()函数的框架可能和wake_up()的实现类似。 但是,如果决定使用interruptible_sleep_on()或者sleep_on(),以及wake_up()或者wake_up_interruptible()这些内核函数,那么evnt_wait()函数的框架就应该类似于下

文档评论(0)

一天一点 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档