资源简介
本资源含所有三个任务的源代码,采用Visual Studio.NET 2003的C++与MFC编写(前端有图形化界面),供各位参考。
课程设计目的
本设计的目的是实现操作系统和相关系统软件的设计,其中涉及进程编程、I/O操作、存储管理、文件系统等操作系统概念。
课程设计要求
(1)对进行认真分析,列出实验具体步骤,写出符合题目要求的程序清单,准备出调试程序使用的数据。
(2)以完整的作业包的形式提交原始代码、设计文档和可运行程序。提交的光盘应当包括:设计题目,程序清单,运行结果分析,所选取的算法及其优缺点,以及通过上机取得了哪些经验。程序清单要求格式规范,注意加注释(包含关键字、方法、变量等),在每个模块前加注释,注释不得少于20%。课程设计要求同时上交打印文档,设计报告包括设计题目,算法分析,关键代码及其数据结构说明,运行结果分析以及上机实践的经验总结。
设计一:
设计任务:模拟Linux文件系统
在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux文件系统。
在现有机器硬盘上开辟100M的硬盘空间,作为设定的硬盘空间。
编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求:
盘块大小1k
空闲盘块的管理:Linux位图法
结构:超级块, i结点区, 根目录区
该simdisk管理程序的功能要求如下:
info: 显示整个系统信息(参考Linux文件系统的系统信息),文件可以根据用户进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。
cd …: 改变目录:改变当前工作目录,目录不存在时给出出错信息。
dir …: 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。
md …: 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。
rd …: 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。
newfile …: 建立文件。
cat …: 打开文件。
copy …: 拷贝文件,除支持模拟Linux文件系统内部的文件拷贝外,还支持host文件系统与模拟Linux文件系统间的文件拷贝,host文件系统的文件命名为…,如:将windows下D:盘的文件\data\sample\test.txt文件拷贝到模拟Linux文件系统中的/test/data目录,windows下D:盘的当前目录为D:\data,则使用命令:
simdisk copy D:\data\sample\test.txt /test/data
或者:simdisk copy D:sample\test.txt /test/data
del …: 删除文件:删除指定文件,不存在时给出出错信息。
check: 检测并恢复文件系统:对文件系统中的数据一致性进行检测,并自动根据文件系统的结构和信息进行数据再整理。
程序的总体流程为:
初始化文件目录;
输出提示符,等待接受命令,分析键入的命令;
对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
设计二:
设计任务:模拟文件系统的前端操作shell
实现一个简单的shell(命令行解释器)。
将设计一的管理程序simdisk作为后台进程运行,利用本设计任务的shell操作simdisk。
本设计任务在于学会如何实现在前端的shell进程和后端的simdisk进程之间利用共享内存进行进程间通信(IPC)。
设计三:
设计任务:模拟文件系统的操作管理
实现多个进程同时对模拟文件系统进行操作。设计管理程序simdisk的用户访问权限管理。访问模拟文件系统的每个进程都属于某个用户,管理程序simdisk根据其访问权限决定其对模拟文件系统的操作。
对模拟文件系统的操作要求做到:共享读,互斥写。
本设计任务在于学会如何实现信息的安全管理和进程同步。
注:要求从课程设计的整体来考虑设计任务一、二、三,并分阶段实现。
代码片段和文件信息
/* alloc.cpp
虚拟磁盘空间分配与释放相关函数的实现 */
#include “simdisk.h“
//在虚拟磁盘中分配i-节点,返回分配到的结点号
int alloc_inode()
{
int nIndex nInodeIndex = -1;
int nTemp i j;
//检查是否有足够的空间用于分配
for(i = 0; i < BLOCK_GROUPS_NUM; i++)
{
for(j = 0; j < INODES_EACH; j++)
{
nTemp = (int)bgBlockGroups[i].gdInfos.nInodeBmp + j;
if(bsInodeBmp[nTemp] == NOT_USED)
{
nIndex = i;
nInodeIndex = nTemp;
break;
}
}
if(nInodeIndex != -1)
break;
}
//分配成功,则修改相应的信息
if(nInodeIndex != -1)
{
for(i = 0; i < BLOCK_GROUPS_NUM; i++)
bgBlockGroups[i].sbBlocks.nFreeInodes -= 1;
bgBlockGroups[nIndex].gdInfos.nFreeInodesNum -= 1;
bsInodeBmp[nInodeIndex] = USED;
}
return nInodeIndex;
}
//在虚拟磁盘中释放i-结点
void free_inode(unsigned int nInode)
{
int i;
//清除相应的信息
for(i = 0; i < BLOCK_GROUPS_NUM; i++)
bgBlockGroups[i].sbBlocks.nFreeInodes += 1;
bgBlockGroups[nInode / BLOCKS_EACH].gdInfos.nFreeInodesNum += 1;
bsInodeBmp[nInode] = NOT_USED;
}
//在虚拟磁盘中数据块位图 nIndex 处分配数据块空间,返回分配得到的空间的首地址
long alloc_block(unsigned int nLen unsigned int &nIndex)
{
long lAddr = -1;
//磁盘空间不足
if(bgBlockGroups[0].sbBlocks.nFreeBlocks < nLen) return lAddr;
int ij;
int nCount = 0; //连续空闲盘块数
int nAvailIndex = 0; //可用数据块位置索引
int nBlockGroupIndex = 0; //首个数据块组的位置索引
bool bBlockGroup[BLOCK_GROUPS_NUM]; //数据组的组信息需要修改
int nBlockGroupNum[BLOCK_GROUPS_NUM]; //用了多少块
for(i = 0; i < BLOCK_GROUPS_NUM; i++)
{
bBlockGroup[i] = false;
nBlockGroupNum[i] = 0;
}
for(i = 0; i < BLOCK_GROUPS_NUM; i++)
{
if(nCount == 0)
if((int)bgBlockGroups[i].gdInfos.nFreeBlocksNum < nLen) continue;
for(j = 0 ; j < BLOCKS_EACH; j++) //连续数据块
{
if(bsBlockBmp[(bgBlockGroups[i].gdInfos.nBlockBmp + j)] == NOT_USED)
{
nCount++;
bBlockGroup[i] = true;
nBlockGroupNum[i]++;
if(nCount == 1)
{
lAddr = bgBlockGroups[i].gdInfos.lBlockAddr + j * BLOCK_SIZE;
nAvailIndex = i * BLOCKS_EACH + j;
nIndex = nAvailIndex;
nBlockGroupIndex=i;
}
}
else //没有连续的
{
//还原,重新开始
nCount = 0;
if(j == 0 && (i - 1) >= 0 && bBlockGroup[i - 1])
{
bBlockGroup[i - 1] = false;
nBlockGroupNum[i - 1] = 0;
}
bBlockGroup[i] = false;
nBlockGroupNum[i] = 0;
}
if(nCount == nLen) break;
}
if(nCount == nLen) break;
}
if(nCount != nLen)
{
lAddr = -1;
return lAddr;
}
//分配成功,则修改相应的信息
for(i = 0; i < BLOCK_GROUPS_NUM; i++)
bgBlockGroups[i].sbBlocks.nFreeBlocks -= nLen;
j = nAvailIndex + nLen;
for(i = nAvailIndex;i < j; i++)
bsBlockBmp[i] = USED;
for(i = nBlockGroupIndex;i < BLOCK_GROUPS_NUM; i++)
if(bBlockGroup[i]) bgBlockGroups[i].gdInfos.nFreeBlocksNum -= nBlockGroupNum[i];
return lAddr;
}
//在虚拟磁盘中数据块位图 nIndex 处释放数据块
void free_block(unsigned int nLen unsigned int nIndex)
{
unsigned int i;
unsigned int nBlockEnd = nIndex + nLen; //计算结尾地址
unsigned int nBlockGroup[BLOCK_GROUPS_NUM]; //
相关资源
- C++课程设计《日程管理系统》
- 课程设计源码.zip
- 校园导游系统c语言代码及课程设计文
- 操作系统进程间通信,用mfc实现
- 猜词游戏 C/C++程序设计
- 2013-2014华南理工大学操作系统课程设
- MFC课程设计 --学生成绩管理系统
- 基于单片机的温控流水灯proteus仿真图
- 21点游戏MFC程序设计 c++课程设计
- 操作系统实验 请求分页存储管理(包
- 数据结构课程设计公交线路图.rar
- 进程/作业调度:时间片轮转调度算法
- MFC课程设计:职工信息管理系统
- 编译原理课程设计词法语法分析器
- 数据结构课程设计旅游路线
- 计算机网络课程设计,实现简单的聊
- 基于MFC的图像处理课程设计
- 俄罗斯方块游戏设计C++课程设计报告
- 交通模拟-c语言数据结构课程设计
- c++课程设计-----股票交易系统源代码
- 学生选课信息管理系统管理端-面向对
- 嵌入式实时操作系统μC/OS-III(英文
- C语言课程设计-车票管理系统-
- 操作系统课程设计:进程/作业调度
- 编译原理课程设计整个项目和报告
- 人力资源管理系统visual c++6.0 +SQL Ser
- 计算机端口扫描器计算机网络课程设
- C++ QT面向对象课程设计 大作业
- 基于VC6.0 的MFC俄罗斯方块游戏设计含
- 北京科技大学聊天室嵌入式系统课程
评论
共有 条评论