2020-11-23

#include
#include
#include
#include<bits/stdc++.h>

typedef struct Ln
{
int f; ///进程号
int n; ///进程页数
int len; ///进程大小
char name[8];///进程名
int y[100]; ///页表,下标表示页号,内容表示进程各页所在物理块
struct Ln *next;
} Ln, *List;

int S[100]; ///内存物理块,0:未使用,非0:已使用
int max = 99; ///记录内存的物理块数,值为A[100]最大下标
int num = 100; ///记录内存未使用物理块数

void Create_Pagi();///建立分页进程
void Revoke_Pagi();///回收进程
void Look_Pagi(); ///显示所有进程占用的物理块
void Show_Pagi(); /// 查看进程
void Pagi(); ///分页界面

void Create_Segm();///创建分段进程
void Show_Segm(); ///显示进程信息
void Suggest(); ///建议模块
void Dispatch(); ///调用模块
void Segme(); ///分段界面
void main_s(); ///主界面

///建立新进程
void Create_Pagi(List &L)
{
int i, flag;
int m, k;
List p;
List n_node;
n_node = (List)malloc(sizeof(Ln));
p = L;
printf(" 亲,请输入进程号 😊;
scanf("%d", &n_node->f); ///输入进程号
flag = 0; ///三次输入错误返回上一层
while(p != NULL && flag < 3) /// 查找进程号是否重复
{
if(p->f != n_node->f)
p = p->next;
else
{
printf("\n 亲,该进程已存在您忘记了吗 , 请重新输入 😊;
scanf("%d", &n_node->f);
p = L; ///p 重新指向头结点
flag++;
}
}
if(flag < 3)
{
printf(" 输入进程名称 😊;
scanf("%s", n_node->name);
printf(" 输入进程的大小 (单位为K)😊;
scanf("%d", &n_node->len);///例如1025,进程页数为1,但K不为0,所以+1=2;
n_node->n = n_node->len / 1024;
k = n_node->len % 1024;
if(k != 0)
n_node->n = n_node->n + 1;
printf(" 所需要的页数为 😊;
printf("%d\n",n_node->n);
printf(" 偏移量为%d", k);
if(n_node->n > num)///放不进去,失败
{
printf("\n 对不起亲,内存物理块不足,新建进程失败 \n\n");
}
else
{
num -= n_node->n;///更新剩余物理块
m = 0;
for(i = 0; i <= max; i++)
if(S[i] == 0 && m < n_node->n)///
{
S[i] = n_node->f; ///进程号
n_node->y[m] = i;///页表,下标表示页号,内容表示进程各页所在物理块
m++;
}
printf("\n");
printf(" 页号\t\t块号\n");
for(int i=0; i<m; i++)
printf(" %d\t\t%d\n",i,n_node->y[i]);
int a, b;
while(1)
{
printf(" 请输入页号\n");
scanf("%d", &a);
printf(" 请输入页内偏移\n");
scanf("%d", &b);
if(a < m)
{
printf(" 物理地址:%d\n", n_node->y[a] * 1024 + b);
break;
}
else
{
printf(" 越界\n");
continue;
}
}
if(L == NULL)
L = n_node;
else
{
p = L; /// 查找最后一个节点
while(p->next != NULL)
{
p = p->next;
}
p->next = n_node;
}
n_node->next = NULL;
}
}
else
{
printf("\n 亲操作错误次数过多 , 已为您返回主菜单 😊;
}
}

///回收进程,释放内存
void Revoke_Pagi(List &L)
{
List p,q;
int x;
printf(" 请输入要删除的进程号 😊;
scanf("%d", &x);
p = L; ///查找进程;用 p 记录
q = p;
while(p != NULL)
{
if(p->f == x)///进程号
{
printf(" 亲,该进程已为您删除o “);
break;
}
else
{
q = p;
p = p->next;
}
}
if(p == NULL)///p为空说明不存在此进程
{
printf(”\n 亲,该进程不存在呢o\n");
}
else///对该进程进行删除
{
for(int i = 0; i < p->n; i++)
S[p->y[i]] = 0;///内存物理块
num += p->n;
if(p->f == q->f) ///要删除的是头结点
{
L = p->next;
}
else
{
q->next = p->next;
}
}
}

/// 显示所有进程占用的物理块
void Printf_Pagi(List L)
{
//int i = 0;
printf("\n 内存物理块分配情况 :\n");
List p = L;
printf(" 该进程信息 :\n");
printf(" 进程号 \t 进程名称 \t 进程页数 \t 所用物理块 \n");
while(p != NULL)
{
printf(" %d\t\t", p->f);
printf(" %s\t\t", p->name);
printf(" %d\t\t", p->n);
int i;
for(i = 0; i < p->n; i++)
printf(" %d", p->y[i]);
printf("\n");
p = p->next;
}
}

/// 查看进程
void Look_Pagi(List L)
{
int z;
printf(" 亲,请输入要查询的进程号: “);
scanf(”%d",&z);///输入查看的进程号
List p = L;
while (p != NULL)
{
if(p->f == z)///相同直接输出
{
printf(" 进程号 \t 进程名称 \t 进程页数 \t 所用物理块 \n");
printf(" %d\t\t", p->f);
printf(" %s\t\t", p->name);
printf(" %d\t\t", p->n);
int i;
for(i = 0; i < p->n; i++)
printf(" #%d", p->y[i]);
printf("\n");
break;
}
else p = p->next;
}
if(p == NULL)
printf(" 要查询的进程不存在 \n");
}

/// 显示内存块使用情况,不分进程
void Show_Pagi()
{
printf(" 内存物理块分配情况 \n");
for(int i = 0; i <= max; i++)
{
printf(" %d\t", S[i]);
if(i % 10 == 9) printf("\n");
}
}

///以上分页代码
/------------------------------------------------------------------/
///以下分段代码

using namespace std;

struct seg///定义结构体段seg
{
long cap;///该段的长度
long phy;///物理地址
long rea;///该段实际地址
};

struct Table///定义结构体段表Table
{
seg s[10];///段表中每个段的属性
char name[50];///段表名
int flag;///标记是否被调度内存
int num;///进程中包含段数
long total;///进程所占用的存储空间
};

Table Ts[10];
long mem = 0;
int Tnum = 0;
long k = 0;
long base = 0;

///创建分段进程
void Create_Segm()
{
printf("\n");
printf(“请输入要创建的进程名:”);
cin>>Ts[Tnum + 1].name;
printf(“请输入该进程的段数:”);
cin>>Ts[Tnum + 1].num;
int p = 0;
for(int i = 1; i <= Ts[Tnum + 1].num; i++)
{
printf(“请输入该进程第%d段的大小:”, i);
cin>>Ts[Tnum + 1].s[i].cap;///该进程每段的大小
Ts[Tnum + 1].s[i].phy = p;///物理地址赋值给p
p = p + Ts[Tnum + 1].s[i].cap;///每段的物理地址赋值给加和
}
printf("\n");
Ts[Tnum + 1].flag = 0;///标记是否被调度
Ts[Tnum + 1].total = p;
Tnum++;
}

///显示进程信息
void Show_Segm(int i)
{
printf("\n进程p%d:", i);
cout<<“名字:”<<Ts[i].name<<endl;
cout<<“该进程所占用的存储空间:”<<Ts[i].total<<endl;
if(Ts[i].flag == 0)
cout<<“进程未调用”<<endl;
else
cout<<“进程已调用”<<endl;
cout<<“段 号 物理始址 内存始址 长度”<<endl;
for(int j = 1; j <= Ts[i].num; j++)
{
cout<<setw(3)<<j<<setw(11)<<Ts[i].s[j].phy;
if(Ts[i].flag == 0)
cout<<setw(11)<<" ";
else
cout<<setw(11)<<Ts[i].s[j].rea;
cout<<setw(11)<<Ts[i].s[j].cap<<endl;
}
}

///调用进程
void Dispatch()
{
cout<<endl;
cout<<“输入要调度的进程:p”;
int n;
cin>>n;
if(n <= 0 || n > Tnum)///排除非正常可能
{
cout<<“请求的段表不存在!”<<endl;
cout<<“请重新”;
Dispatch();///重新调度
}
else if(Ts[n].flag == 1)///已经标记
cout<<“操作失败,该进程已经被调入到内存!”<<endl;
else if(Ts[n].total > mem - k)///存储不足
cout<<“内存空间不足,无法调度!”<<endl;
else
{
for(int j = 1; j <= Ts[n].num; j++)
{
Ts[n].s[j].rea = Ts[n].s[j].phy + k;///
}
k = k + Ts[n].total;
Ts[n].flag = 1;///标记被访问
cout<<“调度后的结果是:”<<endl;
Show_Segm(n);
}
}

///建议模块
void Suggest()
{
printf(" 亲,请输入您宝贵的建议:");
char s[10000];
scanf("%s", s);
printf(" 感谢您的宝贵建议,我们10分钟之内会受理您的建议 \n");
printf(" *感谢您的本次使用,退出程序请输入【0】,返回主界面输入【1】: “);
char m;
cin>>m;
do
if(m - ‘0’ == 0)
exit(0);
else if(m - ‘1’== 1)
main_s();
else
{
printf(” 对不起,输入有误,默认返回主界面呢\n\n");
main_s();
}
while(m != 0);
}

///分页
void Pagi()
{
memset(S, 0, sizeof(S));///初始化A
List L = NULL;
int i = 0;
do
{
printf("\t\t 欢迎使用基本分页存储管理系统 \n");
printf("\t\t******************************\n");
printf("\t\t* 1. 添加进程 \n");
printf("\t\t
2. 回收进程 \n");
printf("\t\t
3. 内存占用情况 \n");
printf("\t\t
4. 查看进程 \n");
printf("\t\t
5. 提出宝贵建议 \n");
printf("\t\t
6. 返回主界面 \n");
printf("\t\t
0. 退出程序 \n");
printf("\t\t
*****************************\n");
printf(" 请输入您的选择 😊;
scanf("%d", &i);
switch(i)
{
case 1:
Create_Pagi(L);
///Printf_Pagi(L);
break;
case 2:
Revoke_Pagi(L);
Printf_Pagi(L);
break;
case 3:
Show_Pagi();
break;
case 4:
Look_Pagi(L);
break;
case 5:
Suggest();
break;
case 6:
main_s();
break;
case 0:
printf(" 感谢您的使用,祝您生活愉快!");
exit(0);
}
}
while(i != 0);
}

///分段
void Segme()
{
int i;
printf(" 请输入内存的大小:");
int m;
scanf("%d", &m);
do
{
printf("\t\t 欢迎使用基本分段存储管理系统 \n");
printf("\t\t******************************\n");
printf("\t\t* 1. 创建进程 \n");
printf("\t\t
2. 显示进程信息 \n");
printf("\t\t
3. 调度进程 \n");
printf("\t\t
4. 提出宝贵建议 \n");
printf("\t\t
5. 返回主界面 \n");
printf("\t\t
0. 退出程序 \n");
printf("\t\t
*****************************\n");
printf(" 请输入您的选择 😊;
scanf("%d", &i);
switch(i)
{
case 1:
Create_Segm();
break;
case 2:
for(int j = 1; j < Tnum+1; j++)
Show_Segm(j);
break;
case 3:
if(i == 3)//如果输入是3则调度一个进程
Dispatch();
else
cout<<" 输入错误!请重新输入!"<<endl;
break;
case 4:
Suggest();
break;
case 5:
main_s();
break;
case 0:
printf(" 感谢您的使用,祝您生活愉快!");
exit(0);
}
}
while(i != 0);
}

///主界面
void main_s()
{
printf("\t\t 欢迎来到内存管理系统 \n");
printf("\t\t**********************\n");
printf("\t\t* 1.进入分页管理系统 \n");
printf("\t\t
2.进入分段管理系统 \n");
printf("\t\t
3.我要提出宝贵建议 \n");
printf("\t\t
0.退出程序 *\n");
int m;
printf(" 亲,请输入您的选择 😊;
scanf("%d", &m);
do
if(m >= 0 && m <= 3)
{
switch(m)
{
case 1:
Pagi();///分页
break;
case 2:
Segme();///分段
break;
case 3:
Suggest();
break;
case 0:
exit(0);
}
}
else
{
printf(" 输入有误!请重新输入:");
scanf("%d", &m);
}
while(m != 0);
}
int main()
{
system(“color 3f”);///颜色
main_s();
return 0;
}

  1. 编译原理实训

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值