-
Notifications
You must be signed in to change notification settings - Fork 0
/
ram.h
168 lines (147 loc) · 3.6 KB
/
ram.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
//
// Created by 旧城筱雨 on 2021/5/27.
//
#include <bits/stdc++.h>
#include "GODNING.h"
#include "inode.h"
#ifndef OS_RAM_H
#define OS_RAM_H
using namespace std;
class INodeListInRam{
private:
const int iNodeListCapacity = INODET_IN_RAM;
int iNodeListSize = 0;
INode iNodeList[INODET_IN_RAM];
int iNodeNum[INODET_IN_RAM];
int fileLock[INODET_IN_RAM]; // 文件锁,1为读锁,2为写锁
public:
// 构造函数
INodeListInRam();
// 获取空的内存i结点
int getFreeNode();
// 加载一个i结点
bool loadNode(INode A, int id);
// 释放一个i结点
INode freeNode(int id);
// 寻找id所对应的内存i结点的下标
int searchNode(int id);
INode& getNode(int id);
//xxx readSomeInfo(int id);
bool updateInfo(int id);
bool saveInodes();
bool setLock(string username, int lock, int id);
};
// 文件打开项
class FileOpenItem{
private:
unsigned offSet = 0;
int linkN = 0;
int flags = 0; // 打开文件的参数
int mode = 0; // 创建文件的参数
int id = -1; // inode号
public:
FileOpenItem();
// 复制构造函数
FileOpenItem(FileOpenItem& ano);
// 赋值构造函数
FileOpenItem(int offset, int flags, int mode, int id);
// 获取inode的id
int getId();
// 获取偏移量
int getOffset();
// 设置偏移量
bool setOffset(int offset);
// 清空文件打开项
void clear();
// 获取链接数
int getLink();
// 增加链接
void icrLink();
// 减少链接
void dcrLink();
// 显示信息
void show();
// 获取模式
int getMode();
};
// 系统文件打开表
class FileOpenList{
private:
// 系统文件打开表最大项数
const int fileOpenCapacity = MAX_FDS;
// 系统文件表当前项数
int fileOpenSize = 0;
// 文件项
FileOpenItem fileOpenList[MAX_FDS];
public:
// 清空
void clear();
// 获取大小
int size();
// 删除某一项
bool deleteItem(int id);
// 删除引用
bool deleteLink(int id);
// 增加引用
bool addLink(int id);
// 获取偏移量
int getOffset(int id);
// 设置偏移量
void setOffset(int id, int offset);
// 添加某一项
int addItem(int offset, int flags, int mode, int id);
// 获取某一项的inode编号
int getItemINode(int id);
// 获取空闲块
int getFreeItem();
// 显示信息
void show();
// 获取模式
int getMode(int id);
};
class UserOpenItem{
private:
int descriptor = -1; // 其实是文件的磁盘inode号
int id = -1; // 对应系统文件打开表的下标
public:
UserOpenItem();
UserOpenItem(int descriptor, int id);
// 清空
void clear();
// 设置值
void set(int descriptor, int id);
// 获取描述符
int getDescriptor();
// 获取id
int getId();
// 检查是否可用
bool check();
};
class UserOpenList{
private:
string username = "";
UserOpenItem iNodeToFile[MAX_USER_FD];
public:
UserOpenList();
// 赋值构造函数
UserOpenList(string username);
// 清空
void clear();
// 获取系统文件打开表下标
int getFileId(int iNodeId, int num = 1);
// 添加一个项
bool addItem(int iNodeId, int fileId);
// 删除一个项
bool deleteItem(int iNodeId);
// 寻找下标
int searchId(int iNodeId, int num = 1);
// 寻找空闲下标
int searchFreeItem();
// 获取用户名
string getUserName();
// 计算某个文件打开了几次
int count(int iNodeId);
//
void show();
};
#endif //OS_RAM_H