




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
11实验一 Linux内核通用链表的使用一、实验目的学习Linux内核通用链表的设计原理,熟练掌握Linux内核通用链表的使用。二、实验内容1、掌握Linux通用链表的创建2、掌握通用链表添加元素、删除元素和遍历链表的方法3、掌握通用链表的查找方法三、实现原理Linux的内核源文件list.h提供了所有的链表定义,以及各类链表的操作接口和实现。其中创建链表的方法如下:LIST_HEAD(my_list); 在指定的head后插入新节点,常用于堆栈数据结构的实现list_add(structlist_head *new, structlist_head *head); 在指定的head前插入新节点,常用于队列数据结构的实现list_add_tail(structlist_head *new, structlist_head *head); 从链表中删除一个指定节点list_del(structlist_head *entry); 根据当前链表节点指针ptr获得宿主节点指针list_entry(ptr, type, member); 遍历链表list_for_each(pos, head); 四、实现代码和运行结果#include #include #include list.hstruct userint id;structlist_head list;int main(void)struct user *p; LIST_HEAD(user_queue);for (inti = 0; iid = i;list_add_tail(&p-list, &user_queue); structlist_head *q;list_for_each(q, &user_queue) p = list_entry(q, struct user, list);printf(%dn, p-id); return 0;#include #include #include list.hstruct userchar username20;int id;structlist_head list;int main(void)struct user *p; LIST_HEAD(head);for (inti; iid = i + 1;printf(user %2d, Please input username: , i+1);scanf(%s, p-username);list_add_tail(&(p-list), &head); structlist_head *tmp;list_for_each(tmp, &head) p = list_entry(tmp, struct user, list);printf(%dt%sn, p-id, p-username); list_for_each(tmp, &head) p = list_entry(tmp, struct user, list);if (p-id = 5)printf(%sn, p-username); return 0;实验二Linux内核通用哈希链表的使用一、实验目的学习Linux内核通用哈希链表的设计原理,熟练掌握Linux内核通用哈希链表的使用。二、实验内容1、掌握Linux通用哈希链表的创建。2、掌握通用哈希链表添加元素、查找元素的方法。三、实现原理Linux的内核源文件list.h提供了哈希链表的各种操作接口和实现。其中创建具有16个元素的哈希链表的方法如下:structhlist_headuser_hash16; 在上述user_hash数组的16个元素中存放的哈希表头元素定义如下:structhlist_head structhlist_node *first;哈希链表节点元素定义如下:structhlist_nodestructhlist_node *next, *pprev;本实验对哈希链表宿主节点的name值进行散列的算法如下:unsignedintBKDRHash(unsigned char *str);unsignedint seed = 131;unsignedint hash = 0;while(*str) hash = hash * seed + (*str+); return (hash & 0x7FFFFFFF);于是,本实验对一个字符串name求最终哈希值hash的方法如下:unsignedint hash = BKDRHash(name) & 15; 内核源文件list.h定义了以下若干接口,用于对哈希链表进行各种操作:在指定的哈希链表头h所指向的链表头插入新节点hlist_add_head(structhlist_node *n, structhlist_head *h); 根据当前哈希链表节点指针ptr获得好像链表宿主节点指针hlist_entry(ptr, type, member); 遍历哈希链表中某个key值所对应的链表hlist_for_each_entry(tpos, pos, head, member); 四、实现代码和运行结果#include #include #include list.hstructusermap structhlist_nodehlist; unsigned char name8;voidhlist_print(structhlist_head *hl_head);unsignedintBKDRHash(unsigned char *str);unsigned char hash_add(structhlist_node *hl_node, structhlist_head *hl_head);int main(void)structhlist_headuser_hash16;for (inti = 0; i 16; i+) INIT_HLIST_HEAD(&user_hashi);structusermap user3;strcpy(, smith);strcpy(, john);strcpy(, bob);for (inti = 0; i 3; i+)hlist_add_head(&(useri.hlist), &user_hashBKDRHash() & 15);hlist_print(user_hash);structusermapnew_user2;strcpy(new_, john);strcpy(new_, lisa);for (inti = 0; i 2; i+)if (!hash_add(&(new_useri.hlist), &user_hashBKDRHash(new_) & 15)printf(用户%s重复,添加失败!n, new_);hlist_print(user_hash);return 0;voidhlist_print(structhlist_head *hl_head)structusermap *puser;structhlist_node *phnode;for (inti = 0; iname);printf(n); unsignedintBKDRHash(unsigned char *str)unsignedint seed = 131;unsignedint hash = 0;while(*str) hash = hash * seed + (*str+); return (hash & 0x7FFFFFFF);unsigned char hash_add(structhlist_node *hl_node, structhlist_head *hl_head)char *name = hlist_entry(hl_node, structusermap, hlist)-name;structusermap *puser;structhlist_node *pnode;hlist_for_each_entry(puser, pnode, hl_head, hlist) if (!strcmp(puser-name, name)return 0; hlist_add_head(hl_node, hl_head);return 1;实验三Linux多线程程序设计一、实验目的学习Linux下多线程程序的编写,掌握IP报文分段重组模拟程序的整体框架。二、实验内容完成Linux下多线程的程序编写,利用线程同步的方法,完成多线程访问一个由Linux内核通用链表所实现的消息队列。三、实现原理线程模型本实验要求创建两个线程,分别为由main函数代表的线程1和由run函数代表的线程2。其中线程1模拟从网络持续接收消息,并将收到的消息放入消息队列中;线程2模拟网络协议处理程序,当消息队列不空时,持续从消息队列头取出下一个收到的消息并进行处理,如下图所示:消息队列mutex线程1线程2线程互斥与同步方法由于消息队列是一临界资源,线程1和线程2将竞争访问该队列,因此必须对线程1和线程2进行互斥与同步管理。即当线程1正在向消息队列尾放入消息时,线程2必须等待线程1操作完毕并退出对临界资源的操作后,方可以从该队列头部中取出下一个消息进行处理,反之亦然。此外,当消息队列为空时,线程2将进入休眠状态,当消息队列不空时,线程2被线程1唤醒后继续处理。下面给出实现线程1和线程2互斥与同步的部分关键代码。pthread_mutex_tmqlock = PTHREAD_MUTEX_INITIALIZER;pthread_cond_tmqlock_ready = PTHREAD_COND_INITIALIZER;int main()structmsg_buff *msg;for(;) .pthread_mutex_lock(&mqlock); /* 加锁互斥量 */list_add_tail(msg-list, &msg_queue); /* 消息入队列尾 */pthread_mutex_unlock(&mqlock); /* 解锁互斥量 */pthread_cond_signal(&mqlock_ready); . .return 0;void *run(void *arg)structmsg_buff *msg;for(;) pthread_mutex_lock(&mqlock); while(list_empty(&msg_queue) pthread_cond_wait(&mqlock_ready, &mqlock); msg = getnextmsg(msg_queue.next); pthread_mutex_unlock(&mqlock); handle_msg(msg); 四、实现代码和运行结果#include #include #include #include #include list.h#define PAUSE 3000void *run(void *); /* 消息处理线程 */voidadd_msg(int);structmsg_buff *getnextmsg(structlist_head *);voidhandle_msg(structmsg_buff *);structmsg_buff int id; structlist_head list;pthread_mutex_tmqlock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_tmqlock_ready = PTHREAD_COND_INITIALIZER; pthread_ttid; LIST_HEAD(msg_queue); int main()int err = 0;err = pthread_create(&tid, NULL, run, NULL); for(inti = 0; iid = i;pthread_mutex_lock(&mqlock);list_add_tail(&new_msg-list, &msg_queue);pthread_mutex_unlock(&mqlock);pthread_cond_signal(&mqlock_ready);void *run(void *arg)structmsg_buff *msg;for (;) pthread_mutex_lock(&mqlock);while (list_empty(&msg_queue)pthread_cond_wait(&mqlock_ready, &mqlock);msg = getnextmsg(&msg_queue);pthread_mutex_unlock(&mqlock);handle_msg(msg); free(msg); structmsg_buff *getnextmsg(structlist_head *q)structmsg_buff *msg;msg = list_first_entry(q, structmsg_buff, list);list_del(&msg-list);returnmsg;voidhandle_msg(structmsg_buff *m)printf(m-id=%dn, m-id); 实验四IP报文分段与重组模拟一、实验目的学习Linux内核IP报文分段和重组的原理,掌握IP报文分段重组模拟程序的关键实现方法。二、实验内容1、联调Forward而和Host程序,观察基于消息分段和重组的文件传输过程。2、完成IP报文分段和重组程序中用户退出登录的功能实现。三、实现原理IP报文分段和重组模拟程序功能描述IP报文分段和重组模拟程序的核心功能是通过UDP编程,完成基于应用层消息分段和重组下的文件传输。整个模拟程序主要由两个独立的角色构成,即Forwarder和Host,如下图所示:在IP报文分段和重组模拟程序中,工作于Forwarder和Host中的分层协
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机车冲刺测试题及答案
- 关汉卿考试题及答案
- 二建考试题真题及答案
- 税务智税考试试题及答案
- 中医康复理疗考试试题及答案
- 家电公司过失责任追究办法
- 云南省昆明市官渡区六校2026届化学高三上期末考试试题含解析
- 农业发展集团筹建方案(3篇)
- 高层小区沉降观测方案(3篇)
- 餐厅选址运营方案模板(3篇)
- 人教版小学数学2年级下册课时练无答案+单元测试题+期中期末检测卷(含答案)
- 西南大学2022-2023学年本科教学质量报告
- 高效的物业服务管理团队
- 流感疫苗接种的注意事项与副作用
- 冠脉造影术后护理查房课件
- 人力资源顾问服务合同范本正规范本(通用版)
- 野生植物资源学习题及参考答案
- 有限空间作业安全管理协议
- 跨省户口网上迁移告知单
- 中职《语文》课程思政开发与建设方案
- 新生儿遗传代谢病筛查阳性儿管理课件
评论
0/150
提交评论