实验5-创建新的内核同步机制.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验5-创建新的内核同步机制

实验背景介绍 Linux中有多种情况会导致并发执行: 中断——中断几乎可以在任何时刻异步发生,也可能随时打断正在执行的代码。 内核抢占——若内核具有抢占性,内核中的任务就可能会被另一任务抢占。 睡眠及与用户空间的同步——在内核执行的进程可能会睡眠,这将唤醒调度程序,导致调度一个新的用户进程执行。 对称多处理——两个或多个处理器可以同时执行代码。 在这些并发情况中大多数内核数据结构都需要加锁:若有其它内核任务可以访问这些数据,那么就给这些数据加上某种形式的锁;若任何其它东西能看到它,那么就要锁住它。Linux中主要的加锁方法有两种:自旋锁和信号量。 在本实验中,我们要利用信号量设计一组新的内核同步原语,它们具有如下的功能:能够使多个进程阻塞在某一特定的事件上,直到另一进程完成这一事件释放相关资源,给内核发送特定消息然后由内核唤醒这些被阻塞的进程。如果没有进程阻塞在这个事件上,则消息被忽略。 实验目的 通过编写相关代码,加深对linux中信号量使用的理解。 通过把代码集成到内核中,理解Linux中内核同步机制。 实验内容 3.1实验思路 本实验需要编写4个系统调用来实现内核原语的功能要求: 1、生成一个事件的系统调用函数: int myevent_open(int eventNum); 生成一个事件,返回该事件的ID,如果参数为0,表示是一个新的事件,否则就是一个存在 的事件。 2、将进程阻塞到一个事件的系统调用函数: int myevent_wait(int eventNum); 进程阻塞到eventNum事件,直到该事件完成才被唤醒。 3、唤醒等某事件进程的系统调用函数: int myevent_signal(int eventNum); 唤醒所有等eventNum事件的进程,如果队列为空,则忽略。 4、撤销一个事件的系统调用函数: int myevent_close(int eventNum); 撤销一个参数代表的事件,成功返回0。 然后我们需要把代码集成到内核中,然后进行测试,主要工作如下: 1.设计事件的数据结构和系统调用函数。 2.说明一个事件查找函数。 3.建立或查找事件的系统调用,它返回建立的信事件的编号。 4.等待事件的系统调用(内核2.6.XX)。 5.唤醒等待事件进程的系统调用。 6.撤销某个事件的系统调用。 7.重新编译内核,用新内核重启系统。 8.测试设计的同步机制。 3.2系统程序代码 myevent.h 进程阻塞需要一个等待队列,所有等待同一事件号的进程都挂接到该队列。可以考虑定义如下的一个队列结点的数据结构: typedef struct __myevent{ int eventNum; // 事件号 wait_queue_head_t *p; // 系统等待队列首指针 struct __myevent *next; // 队列链指针 }myevent_t; 两个全局的指针变量: myevent_t * lpmyevent_head = NULL ; // 链头指针 myevent_t * lpmyevent_end = NULL ; // 链尾指针 =================================================================================== myevent.c 说明一个事件查找函数: myevent_t * scheventNum(int eventNum, myevent_t **prev) { myevent_t *tmp = lpmyevent_head; *prev = NULL; while(tmp){ if(tmp-eventNum == eventNum) return tmp; *prev = tmp; tmp = tmp-next; } return NULL; } 建立或查找事件的系统调用,它返回建立的信事件的编号: asmlinkage int sys_myevent_open(int eventNum) { myevent_t *new; myevent_t *prev; if(eventNum) if(!scheventNum( eventNum, prev)) return -1; else return eventNum; else{ new = (myevent_t *) kmalloc(sizeof(myevent_t),GFP_KERNEL); new-p = (wait_queue_head_t *) kmalloc(sizeof(wait_queue_head_t),GFP_KERNEL); new-next = NULL; new-p-task_list.next = new-p-

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档