可变分区分配及回收哈尔滨理工大学操作系统课程设计报告.docx

上传人:b****7 文档编号:8970117 上传时间:2023-02-02 格式:DOCX 页数:10 大小:206.73KB
下载 相关 举报
可变分区分配及回收哈尔滨理工大学操作系统课程设计报告.docx_第1页
第1页 / 共10页
可变分区分配及回收哈尔滨理工大学操作系统课程设计报告.docx_第2页
第2页 / 共10页
可变分区分配及回收哈尔滨理工大学操作系统课程设计报告.docx_第3页
第3页 / 共10页
可变分区分配及回收哈尔滨理工大学操作系统课程设计报告.docx_第4页
第4页 / 共10页
可变分区分配及回收哈尔滨理工大学操作系统课程设计报告.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

可变分区分配及回收哈尔滨理工大学操作系统课程设计报告.docx

《可变分区分配及回收哈尔滨理工大学操作系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《可变分区分配及回收哈尔滨理工大学操作系统课程设计报告.docx(10页珍藏版)》请在冰豆网上搜索。

可变分区分配及回收哈尔滨理工大学操作系统课程设计报告.docx

可变分区分配及回收哈尔滨理工大学操作系统课程设计报告

XX理工大学

课 程 设 计

(操作系统)

 

题  目:

 可变分区分配与回收

(首次适应算法)

班  级:

计算机科学与技术学院计算机系 10-8班

姓  名:

       X旭冬1004010810

指导教师:

       高雪瑶

系主任:

林克正

2013年03月05日

1可变分区分配与回收

1.1题目分析

首次适应算法(firstfit)简称FF。

FF算法要求空间分区链以地址递增的次序。

再分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,然后再按照作业的大小,从该分区中划出一款内存空间分配给请求者,余下的空闲分区仍留在空闲链中。

若找不到一个能满足要求的分区,则此次内存分配失败。

1.2数据结构

struct{

floataddress;/*空闲区起始地址*/

floatlength;/*空闲区长度,单位为字节*/

intflag;/*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/

}free_table[m];/*空闲区表*/

struct{

floataddress;/*已分分区起始地址*/

floatlength;/*已分分区长度,单位为字节*/

intflag;/*已分配区表登记栏标志,用"0"表示空栏目*/

}used_table[n];/*已分配区表*/

 

1.3流程图

图1 

1.4设计结论和心得

通过课程设计得到如下结论:

设计本课程前,感觉本课程并不是那么难,很容易下手,因为主要也就是写出回收主程序、内存分配主程序就行了。

但是真正实施起来确非常困难。

首先,必须解决动态输入构造空闲区表的问题。

刚开始的时候,我们把其他的程序都写出来了,却忘了课题还要求动态输入构造空闲区表。

于是我们又花了很大的力气才实现动态输入构造空闲区表,即:

可以根据自己的需要,从键盘输入空闲区表的块数,并输入每块空闲区表的大小及首地址。

其次,需要解决的是首次适应算法和最佳适应算法之间的转制问题。

我们做完首次适应算法的程序后不知道该从什么地方着手写最佳适应算法。

最后过了几天,才想到,原来只需在首次适应算法中,每次申请空闲区前先对空闲区从小到大排序即可。

 

第三个难题就是解决回收算法的问题。

回收算法可以说是本实验最难实现的算法,因为它有四种不同的情况。

刚开始我们只考虑了三种情况,即:

1、要回收的区域没有与之相邻接的空闲区。

2、要回收区域有上邻(与要回收区域相邻的上面有空闲区)。

3、要回收的区域有下邻(与要回收的区域相邻的下面有空闲区)。

当我们满怀欣喜感觉本课程设计已经完成的时候却发现,程序运行的时候,对于一个刚分配好的空闲区,如果有三个相邻的作业可以同时在此空闲区内申请到内存,并全并回收此三个作业后,此空闲区会被分割成两个空闲区显示。

这时我们才意识到少考虑了一种情况:

要回收的区域有上邻而且有下邻。

我们又不得不再次修改程序。

就这样,在写出大体程序后,我们前后大大小小修改了十多次,最后修改好的程序完全符合课程设计要求,我们的课程设计终于成功了!

2Linux代码分析

一、功能说明

tun/tap驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。

利用tun/tap驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中。

在linux2.4内核版本及以后版本中,tun/tap驱动是作为系统默认预先编译进内核中的。

二、接口说明

做为虚拟网卡驱动,Tun/tap驱动程序的数据接收和发送并不直接和真实网卡打交道,而是通过用户态来转交。

在linux下,要实现核心态和用户态数据的交互,有多种方式:

可以通用socket创建特殊套接字,利用套接字实现数据交互;通过proc文件系统创建文件来进行数据交互;还可以使用设备文件的方式,访问设备文件会调用设备驱动相应的例程,设备驱动本身就是核心态和用户态的一个接口,Tun/tap驱动就是利用设备文件实现用户态和核心态的数据交互。

从结构上来说,Tun/tap驱动并不单纯是实现网卡驱动,同时它还实现了字符设备驱动部分。

以字符设备的方式连接用户态和核心态。

下面是示意图:

Tun/tap驱动程序中包含两个部分,一部分是字符设备驱动,还有一部分是网卡驱动部分。

利用网卡驱动部分接收来自TCP/IP协议栈的网络分包并发送或者反过来将接收到的网络分包传给协议栈处理,而字符驱动部分则将网络分包在内核与用户态之间传送,模拟物理链路的数据接收和发送。

Tun/tap驱动很好的实现了两种驱动的结合。

三、局部数据结构

structtun_struct{charname[8];//设备名unsignedlongflags;//区分tun和tap设备structfasync_struct*fasync;//文件异步通知结构wait_queue_head_tread_wait;//等待队列structnet_devicedev;//linux抽象网络设备结构structsk_buff_headtxq;//网络缓冲区队列structnet_device_statsstats;//网卡状态信息结构};

structnet_device结构是linux内核提供的统一网络设备结构,定义了系统统一的访问接口。

Tun/tap驱动中实现的网卡驱动的处理例程:

staticinttun_net_open(structnet_device*dev);

staticinttun_net_close(structnet_device*dev);

staticinttun_net_xmit(structsk_buff*skb,structnet_device*dev);//数据包发送例程

staticvoidtun_net_mclist(structnet_device*dev);//设置多点传输的地址链表

staticstructnet_device_stats*tun_net_stats(structnet_device*dev);//当一个应用程序需要知道网络接口的一些统计数据时,可调用该函数,如ifconfig、netstat等。

inttun_net_init(structnet_device*dev);//网络设备初始例程

字符设备部分:

在Linux中,字符设备和块设备统一以文件的方式访问,访问它们的接口是统一的,都是使用open()函数打开设备文件或普通文件,用read()和write()函数实现读写文件等等。

Tun/tap驱动定义的字符设备的访问接口如下:

staticstructfile_operationstun_fops={

owner:

THIS_MODULE,

llseek:

tun_chr_lseek,

readtun_chr_read,

write:

tun_chr_write,

poll:

tun_chr_poll,

ioctl:

tun_chr_ioctl,

open:

tun_chr_open,

release:

tun_chr_close,

fasync:

tun_chr_fasync

};

在内核中利用misc_register()函数将该驱动注册为非标准字符设备驱动,提供字符设备具有的各种程序接口。

代码摘自linux-2.4.20\linux-2.4.20\drivers\net\tun.c

staticstructmiscdevicetun_miscdev={TUN_MINOR,"net/tun",&tun_fops};int__inittun_init(void){…if(misc_register(&tun_miscdev)){printk(KERN_ERR"tun:

Can'tregistermiscdevice%d\n",TUN_MINOR);return-EIO;}return0;}

当打开一个tun/tap设备时,open函数将调用tun_chr_open()函数,其中将完成一些重要的初始化过程,包括设置网卡驱动部分的初始化函数以及网络缓冲区链表的初始化和等待队列的初始化。

Tun/tap驱动中网卡的注册被嵌入了字符驱动的ioctl例程中,它是通过对字符设备文件描述符利用自定义的ioctl设置标志TUNSETIFF完成网卡的注册的。

四、流程图

五:

以实例说明运行过程

Tun/tap驱动程序中包含两个部分,一部分是字符设备驱动,还有一部分是网卡驱动部分。

利用网卡驱动部分接收来自TCP/IP协议栈的网络分包并发送或者反过来将接收到的网络分包传给协议栈处理,而字符驱动部分则将网络分包在内核与用户态之间传送,模拟物理链路的数据接收和发送。

Tun/tap驱动很好的实现了两种驱动的结合。

下面是定义的tun/tap设备结构:

structtun_struct{

charname[8];//设备名

unsignedlongflags;//区分tun和tap设备

structfasync_struct*fasync;//文件异步通知结构

wait_queue_head_tread_wait;//等待队列

structnet_devicedev;//linux抽象网络设备结构

structsk_buff_headtxq;//网络缓冲区队列

structnet_device_statsstats;//网卡状态信息结构

};

structnet_device结构是linux内核提供的统一网络设备结构,定义了系统统一的访问接口。

Tun/tap驱动中实现的网卡驱动的处理例程:

staticinttun_net_open(structnet_device*dev);

staticinttun_net_close(structnet_device*dev);

staticinttun_net_xmit(structsk_buff*skb,structnet_device*dev);//数据包发送例程

staticvoidtun_net_mclist(structnet_device*dev);//设置多点传输的地址链表

staticstructnet_device_stats*tun_net_stats(structnet_device*dev);//当一个应用程序需要知道网络接口的一些统计数据时,可调用该函数,如ifconfig、netstat等。

inttun_net_init(structnet_device*dev);//网络设备初始例程

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1