




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux内核分析实验报告实验题目: 构造新内核同步机制实验实验目的:设计同步原语模拟内核信号量。硬件环境:内存1G以上软件环境:Linux(Ubuntu) 2-6实验步骤: usr/src/linux-2.6.33.2/ipc/shm.c一:实验原理简介: 信号量负责对共享缓冲区的互斥,主要实现的方法有信号量的声明(sys_sema_open),在特定信号量的等待(sys_sema_wait),将特定信号量上的等待进程唤醒(sys_sema_signal),删除特定信号量(sys_sema_close)。 声明信号量 :声明新的信号量结构,对本信号量等待队列初始化,本信号量信号灯数目初始化,然后将其放入信号量等待队列中。在特定信号量的等待 :如果信号灯数目大于0,说明还有资源可以利用,将信号灯数目-1。否则,说明没有资源可用,将本进程置为WQ_FLAG_EXCLUSIVE,放入等待队列,调用schedule(),重新调度其他进程。Schedule()方法后是finish_wait() 方法,当进程被唤醒后,首先执行此方法。此方法将进程真正地从等待队列中弹出。唤醒信号量上的等待进程 :进程即将从缓冲区离开,将信号灯的数目+1。此时,如果等待队列中还有等待进程(判断条件是信号灯的数目0),则从等待队列中弹出一个进程,使其状态变为RUNNING,等待被调度。删除特定信号量 :给出信号量的编号,判断等待队列上是否还有等待的进程,如果有的话,将所有的进程均从队列中弹出。然后从信号量的队列中删除编号是输入数字的信号量结构。二:体结构:typedef struct _semaint key;/本信号量编号int number;/本信号量信号灯个数wait_queue_head_t *p; / 系统等待队列首指针struct _sema *next;/所有信号量以链形式串在一起,本属性指向下一信号量结构sema;三:主要函数简介 :1. 系统函数 wake_up() 唤醒等待队列中所有没有设置WQ_FLAG_EXELUSIVE的节 点对应的进程,并且唤醒等待队列中第一个设置标记WQ_FLAG_EXELUSIVE的进程 Wake_up_all() 除了唤醒等待队列中所有没有设置WQ_FLAG_EXELUSIVE的节点对应的进程外,还唤醒所有设置了此标记位的进程。prepare_to_wait(queue, &wait, flag); 将进程以设置的标志位放入等待队列中。finish_wait(queue,&wait); 将进程从队列中弹出2 自定义函数(位置:/usr/src/linux-2.6.33.2/ipc/shm.c) 1 sema * check_sema_key(int key,sema *prev)作用:检查以key值为编号的信号量是否存在于当前的信号量链中2 asmlinkage int sys_sema_open(int key,int number) 作用:如果key=0声明一个新的信号量(链表的插入),如果key!=0,返回key值。 3 asmlinkage int sys_sema_wait(int key) 作用: 如果信号灯数目大于0,说明还有资源可以利用,将信号灯数目-1。否则,说明没有资源可用,将本进程置为WQ_FLAG_EXCLUSIVE,放入等待队列,调用schedule(),重新调度其他进程。Schedule()方法后是finish_wait() 方法,当进程被唤醒后,首先执行此方法。此方法将进程真正地从等待队列中弹出。 4. asmlinkage int sys_sema_signal(int key)作用:进程即将从缓冲区离开,将信号灯的数目+1。此时,如果等待队列中还有等待进程(判断条件是信号灯的数目0),则从等待队列中弹出一个进程,使其状态变为RUNNING,等待被调度。5. int wake_up_all_ones(int key)作用:唤醒key编号信号量上所有的等待进程。 6. asmlinkage int sys_sema_close(int key)作用:给出信号量的编号,判断等待队列上是否还有等待的进程,如果有的话,将所有的进程均从队列中弹出。然后从信号量的队列中删除编号是输入数字的信号量结构。 五:结果检测:设定信号量的number值是2, 生成3个进程,三个进程争夺两个资源。为了使实验结果明显,进程每次执行时候,使之输出110 10个数字。预期结果:三个shell中只有两个进程输出,一个停滞。此时,左右上角进程执行中间进程等待。此时,左上角,中间进程执行,右上角进程停滞。结果:三个进程中有两个进程同时输出,另一个进程等待,正确 。 结论分析与体会: 信号量是是内核中重要的同步机制,可以控制对共享数据的读写。原理简单,但是一些编程的细节要注意,比如指针。 附:程序源代码/* #include #include #include int buffer2;int ptr_buffer; int main(int argc, char * argv) int i,ii,j,value=0; if(argc != 2) printf(wrong argsn ); return -1; i = (atoi(argv1); int jieshou=syscall(338,i,2);/ the number of semaphore printf(the semaphore you declare is NO.%dn,jieshou); printf (the number of semaphore of all is %dn,syscall(342); /if(i=1)/producer int j,xunhuan; for(j=0;j=10;j+) /printf(come heren); if(jieshou!=2) return -1; int j=syscall(339,jieshou);/ printf( the process %d is in the buffern,getpid(); for(xunhuan=0;xunhuan10;xunhuan+) sleep(1);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版小客车指标租赁与车辆托管服务合同
- 2025版拆房工程绿色拆除与修复承包合同
- 2025版工业园区场地租赁与产业发展合同
- 2025版户外广告牌安装制作及租赁合同
- 2025版车库车位使用权买卖及转让合同
- 2025版文化旅游产业贷款保证合同
- 二零二五年度班组人员劳务承揽与薪酬管理合同范本
- 2025版影视作品制作补充合同模板
- 二零二五年度建筑施工现场安全管理合同
- 2025版北京二手车寄售与售后服务一体化合同范本
- 2025年施工员-土建方向-岗位技能(施工员)考试题库
- 河南省安阳市林州市2024-2025学年八年级下学期期末历史试卷 (含答案)
- 胸痛单元建设课件介绍
- 超市消防安全管理制度制度
- 酒店服务流程与空间布局优化
- DB11∕T 2380-2024 城市轨道交通工程盖挖法施工技术规程
- (2025)医疗护理员理论考试试题含答案
- 2025年贵州省中考英语真题含答案
- 2025年广西中考语文试题卷(含答案)
- 建设工程法律培训
- 2025年南京市中考数学真题试卷
评论
0/150
提交评论