#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <time.h>
const unsigned FILE_SYS_SIZE = 1024 * 1024; //模拟文件系统的容量设为1M
const unsigned BITMAP_LEN = 64; //位示图的长度 512/8
const unsigned BLOCK_SIZE = 512; //一个文件块的大小
const unsigned BLOCK_COUNT = 512; //文件系统中文件块的数量
const unsigned NAME_LEN = 11; //最长文件名的长度
const unsigned PASSWORD_LEN = 11; //用户密码的最大长度
const unsigned LOGIN_COUNT = 5; //用户登录尝试次数
const unsigned COMMAND_LEN = 200; //命令行最大长度
const unsigned PRO_SET_COMM_COU = 11; //预设命令数
const char *PRO_SET_COMM[] = {"create", "open", "read", "write", "close", "del", "mkdir", "cd", "dir", "help","exit"};
//文件元素可供操作性权限
typedef enum
{
pub, //任何人可做任何操作
protect, //非创建者或ADMIN,只可以察看
pri //非创建者或ADMIN,不可以做任何操作
} FileAccess;
//文件元素类型
typedef enum
{
file, //文件
dir //文件夹
} FileType;
//用户类型
typedef enum
{
admin, //管理者,拥用所有权限
comm //一般用户
} UserType;
//文件状态
typedef enum
{
closed,
opened,
reading,
writing
} FileStatus;
//一个文件索引结构
typedef struct
{
unsigned Index; //文件元素索引编号
char FileName[NAME_LEN]; //文件元素名
char ParentName[NAME_LEN]; //父节点名
unsigned FileBlockId; //文件元素所在物理块编号
unsigned FileLevel; //文件元素所在层次,层+文件元素名为一个文件元素的逻辑位置
unsigned effect; //是否有效,0-无效,1-有效
} FileIndexElement;
//文件索引结构或目录表项
typedef struct
{
FileIndexElement *FIStart; //文件系统中的文件索引起始位置
unsigned FILen; //文件索引的最大长度
unsigned FICount; //文件索引数量
} FileIndex;
//文件块的结构
typedef struct fb
{
unsigned FileBlockId; //文件块编号
unsigned BLOCK_SIZE; //文件块的容量
char *FileBlockAddr; //文件块地址
struct fb *next; //下一个文件块的地址
} FileBlock;
//文件系统的位示图结构
typedef struct
{
unsigned BITMAP_LEN; //文件位示图长度
char *BMStart; //位示图的起始指针
} BitMap;
//文件系统结构
typedef struct
{
char *FSStart; //文件系统的起始地址
unsigned SuperBlockSize; //文件系统的容量
BitMap bm; //文件系统中的位示图
unsigned BLOCK_COUNT; //文件系统中文件块的数量
FileBlock *head; //文件系统中文件块首地址
FileIndex FI; //文件系统中的文件索引
} SuperBlock;
typedef struct
{
char *UserName; //用户名称
UserType ut; //用户类型
} User;
//文件系统中的元素结构,包括文件和文件夹
typedef struct fse
{
struct fse *parent; //指向自己的父亲节点
unsigned FileLevel; //文件元素所在层次,层+文件元素名为一个文件元素的逻辑位置
char FileName[NAME_LEN]; //文件元素名
unsigned FileBlockId; //文件元素所在物理块编号
unsigned FileElemLen; //文件元素的长度
FileType Type; //文件元素类型
FileAccess Access; //文件元素可供操作的权限
User Creator; //文件创建者
char CreateTime[18]; //创建时间,日期格式:MM/DD/YY HH:MI:SS
char LastModTime[18]; //最后一次修改时间
char *FileData; //一个文件的数据开始地址,文件夹时该值为NULL
FileStatus fileStu; //如果是一个文件表示文件当前的状态
} FSElement;
//系统当前状态
typedef struct
{
User CurrentUser; //当前用户
unsigned FileLevel; //用户所在文件系统层
FSElement *CurrParent; //当前层的父节点
char *CurrentPath; //当前路径
} CurrentStatus;
SuperBlock FS; //一个全局文件系统的变量
CurrentStatus CS; //当前系统状态
FSElement *base; //文件元素的根
bool InitFileSys();
/*
* 函数介绍:寻找第一个空白的文件块ID
* 输入参数:无
* 输出参数:无
* 返 回 值:返回第一个空白块的ID
*/
unsigned FindBlankFileBlockId()
{
unsigned char c;
for (unsigned i = 0; i < FS.bm.BITMAP_LEN / 8; i++)
{
c = FS.bm.BMStart[i] | 0x7F;
if (c == 0x7F)
{
return i * 8; //一个字节左边第一位为0,表示该区域未使用
}
c = FS.bm.BMStart[i] | 0xBF;
if (c == 0xBF)
{
return i * 8 + 1;
}
c = FS.bm.BMStart[i] | 0xDF;
if (c == 0xDF)
{
return i * 8 + 2;
}
c = FS.bm.BMStart[i] | 0xEF;
if (c == 0xEF)
{
return i * 8 + 3;
}
c = FS.bm.BMStart[i] | 0xF7;
if (c == 0xF7)
{
return i * 8 + 4;
}
c = FS.bm.BMStart[i] | 0xFB;
if (c == 0xFB)
{
return i * 8 + 5;
}
c = FS.bm.BMStart[i] | 0xFD;
if (c == 0xFD)
{
return i * 8 + 6;
}
c = FS.bm.BMStart[i] | 0xFE;
if (c == 0xFE)
{
return i * 8 + 7;
}
}
return BLOCK_COUNT + 1;
}
/*
* 函数介绍:寻找第一个文件块地址
* 输入参数:fileblockid 文件块ID
* 输出参数:无
* 返 回 值:返回文件块的地址
*/
char * FindBlankFileBlock(unsigned fileblockid)
{
FileBlock *fblock = FS.head;
while (fblock->next != NULL)
{
if (fblock->FileBlockId == fileblockid)
{
return fblock->FileBlockAddr;
}
else
{
fblock = fblock->next;
}
}
return NULL;
}
/*
* 函数介绍:得到当前时间的字符串
* 输入参数:时间字符串的指针
* 输出参数:无
* 返 回 值:void
*/
void GetCurrentTime(char *currtime)
{
char dbuffer [9];
char tbuffer [9];
_strdate(dbuffer);
_strtime(tbuffer);
strcpy(currtime, dbuffer);
strcat(currtime, " ");
strcat(currtime, tbuffer);
}
/*
* 函数介绍:更新文件索引
* 输入参数:fileblockid 文件块ID
* 输出参数:无
* 返 回 值:无
*/
void AddFileIndex(unsigned fileblockid, unsigned filelevel, char *filename, char *parentname)
{
FS.FI.FIStart[FS.FI.FICount].FileBlockId = fileblockid;
FS.FI.FIStart[FS.FI.FICount].FileLevel = filelevel;
strcpy(FS.FI.FIStart[FS.FI.FICount].FileName, filename);
if (parentname == NULL)
{
memset(FS.FI.FIStart[FS.FI.FICount].ParentName, '\0', NAME_LEN);
}
else
{
strcpy(FS.FI.FIStart[FS.FI.FICount].ParentName, parentname);
}
FS.FI.FIStart[FS.FI.FICount].Index = FS.FI.FICount;
FS.FI.FIStart[FS.FI.FICount].effect = 1;
FS.FI.FICount ++;
}
/*
* 函数介绍:更新位示图
* 输入参数:fileblockid 文件块ID
* 输出参数:无
* 返 回 值:无
*/
void UpdateBitMap(unsigned fileblockid)
{
//计复所在位示图的位置
int dirInBitmap = ((int)(fileblockid / 8));
int dirInChar = fileblockid % 8;
char *c = &(FS.bm.BMStart[dirInBitmap]);
char xor;
switch (dirInChar)
{
case 0:
xor = 0x80;
break;
case 1:
xor = 0x40;
break;
case 2:
xor = 0x20;
break;
case 3:
xor = 0x10;
break;
case 4:
xor = 0x08;
break;
case 5:
xor = 0x04;
break;
case 6:
xor = 0x02;
break;
case 7:
xor = 0x01;
break;
}
*c = *c ^ xor;
}
/*
* 函数介绍:创建一个文件元素
* 输入参数:acc 文件元素可操作权限,filename 文件元素名称,type 文件元素类型,filecontent 文件内容
* 输出参数:无
* 返 回 值:返回一个文件元素的指针
*/
FSElement * CreateFileElement(FileAccess acc, char *filename, FileType type, char *filecontent, FSElement *parent)
{
//查找第一个空白文件块ID
unsigned blankFileBlockId = FindBlankFileBlockId();
if (blankFileBlockId >= BLOCK_COUNT)
{
printf("未找到一个文件块的id\n");
return NULL;
}
//查找第一个空白块的地址
char *blank = FindBlankFileBlock(blankFileBlockId);
if (blank == NULL)
{
printf("未找到一个文件块的地址\n");
return NULL;
}
FSElement *fs = (FSElement *)blank;
fs->Access = acc;
fs->Creator = CS.CurrentUser;
GetCurrentTime(fs->CreateTime);
fs->FileBlockId = blankFileBlockId;
fs->FileLevel = CS.FileLevel;
strcpy(fs->FileName, filename);
strcpy(fs->LastModTime, fs->CreateTime);
fs->Type = type;
fs->parent = parent;
if (type == dir)
{
fs->FileElemLen = sizeof(FSElement);
fs->FileData = NULL;
}
else
{
fs->FileElemLen = (unsigned)strlen(filename);
fs->fileStu = closed;
fs->FileData = (char *)fs + sizeof(FSElement);
if (filecontent == NULL)
{
}
else
{
strcpy(fs->FileData, filecontent);
}
}
//更新索引
if (parent == NULL)
{
AddFileIndex(blankFileBlockId, CS.File
操作系统课程设计 包括实验报告和源代码


操作系统课程设计是计算机科学教育中的一个重要环节,它涵盖了操作系统的基本概念、原理以及实现技术。这份压缩包文件包含的资源——"操作系统课程设计 包括实验报告和源代码",为学习者提供了一次深入理解操作系统的实践机会。下面将详细阐述这个主题中涉及的一些关键知识点。 实验报告是理解操作系统工作原理的重要参考资料。通过实验报告,学生可以了解到如何设计和实现一个简单的文件系统。文件系统是操作系统中至关重要的部分,它负责管理和组织磁盘上的数据,使得用户和程序能方便地存储、检索和共享文件。实验报告可能包括以下内容: 1. 文件系统的基本概念:如目录结构(如树形结构)、文件的命名规则、文件的存储方式(连续分配、链接分配、索引分配等)。 2. 文件的I/O操作:包括打开、创建、读取、写入、关闭文件的过程,以及缓存管理对性能的影响。 3. 目录管理:如何实现文件的查找、创建、删除等操作,以及目录项的链接结构(如单链表、哈希表等)。 4. 空闲块管理:如何有效地分配和回收磁盘空间,如使用位图法、空闲块链表等方法。 5. 文件权限与安全:如何设置访问控制,确保文件的安全性,例如读写权限、用户身份验证等。 源代码部分提供了实际动手操作的机会,让学生能够从底层理解操作系统的运行机制。通过分析和修改源代码,可以深入学习到: 1. 系统调用接口:如何通过系统调用来实现用户空间与内核空间的交互,如open、read、write等。 2. 缓存策略:如LRU(最近最少使用)替换算法,如何提高文件读写效率。 3. 文件系统结构:文件的元数据(如inode,包含文件大小、创建时间、权限等信息)的管理和操作。 4. 锁机制:理解互斥锁、信号量等同步原语在并发访问文件时的作用。 5. 异步I/O:了解异步I/O模型,如AIO(Asynchronous I/O)和 aio.h 头文件的使用。 6. 磁盘调度算法:如FCFS(先来先服务)、SJF(短作业优先)、SCAN和C-SCAN等算法在磁盘读写中的应用。 通过这样的课程设计,学生不仅能理论联系实际,提升编程能力,还能深入理解操作系统的设计思想和实现技术。这不仅对于未来从事系统软件开发、数据库管理、云计算等相关工作大有裨益,也能帮助他们更好地应对其他计算机科学领域的挑战。因此,这份"OS课程设计电子档"是学习操作系统不可或缺的宝贵资料。





















- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 0
- 资源: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- MMC技术引领未来:模块化多电平变换器在APF、statcom、储能系统、HVDC等领域的创新应用与仿真研究,MMC技术下的APF、Statcom与储能系统,MMC-HVDC及模块化多电平变换器的仿真
- 《基于a*算法与人工场势法协同应用的混合算法优化》,A*算法与人工场势法融合算法:高效智能路径规划策略,a*算法与人工场势法结合的算法 ,a*算法; 人工场势法; 结合算法; 混合算法; 路径规划,结
- lilishop 商城 java商城-C语言资源
- 非隔离双向DC-DC变换器(Buck-Boost转换器)与蓄电池接口仿真研究:MATLAB Simulink模型探究,非隔离双向DC-DC变换器(Buck-Boost转换器)仿真研究:电压外环与电流内
- NutzWk-Java资源
- 永磁同步模型电流预测控制:基于双矢量改进算法的电流环预测控制技术研究与文献综述,永磁同步模型电流预测控制:基于双矢量改进算法的电流环学习研究,永磁同步模型电流预测控制 电流环采用预测控制双矢量改进
- 基于SpringBoot+MyBatis+MySQL+Vue实现的旧物置换网站管理系统设计与实现(附源码+数据库+答辩PPT+毕业论文+项目部署视频教程+项目所需软件工具),强烈推荐!
- 永磁同步电机PMSM无感FOC方案评估套件:优化性能、工业级代码规范、参数辨识便捷、源码开放,永磁同步电机PMSM无感FOC方案评估套件:优化性能、工业级代码规范、参数辨识便捷、实测高效源码开放,行业
- 基于Java核心技术的社交众包平台后台管理系统开发与设计源码
- QPython Plus-Python资源
- XMSinaSwift-Swift资源
- [附源码+数据库+毕业论文+答辩PPT+部署教程+配套软件]基于SpringBoot+MyBatis+MySQL+Maven+Vue的旧物置换网站管理系统,推荐!
- MATLAB Special Heatmap-Matlab资源
- SpireCV-机器人开发资源
- CoCache-Kotlin资源
- 基于Crowbar电路的双馈风力发电机LVRT仿真模型研究:低电压穿越及不同跌落深度模拟探究(Matlab Simulink成品模型),基于Crowbar电路的双馈风力发电机DFIG低电压穿越LVRT


