第一章 计算机系统概论
1.1 基本构成
- 处理器(Processor):控制计算机的操作,执行数据处理功能。只有一个处理器时,它通常指中央处理器(CPU)。
- 内存 (Main memory):存储数据和程序。此类存储器通常是易失性的,即当计算机关机时,存储器的内容就会丢失。相对于此的是磁盘存储器,当计算机关机时,它的内容不会丢失。内存通常也称为实存储器(real memory)或主存储器(primary memory)。
- 输入/输出模块(I/O modules):在计算机和外部环境之间移动数据。外部环境由各种外部设备组成,包括辅助存储器设备(如硬盘),通信设备和终端。
- 系统总线(System bus):在处理器,内存和输入/输出模块间提供通信的设备。
处理器的一种功能是与存储器交换数据。
内存地址寄存器(Memory Address Register,MAR),用于确定下次读/写的存储器地址;
内存缓冲寄存器(Memory Buffer Register,MBR),用于存放要写入存储器的数据或从从存储器中读取的数据;
输入/输出地址寄存器(I/O Address Register,I/O AR),用于确定一个特定的输入/输出设备;
输入/输出缓冲寄存器(I/O Buffer Register,I/O BR),用于在输入/输出模块和处理器间交换数据。
1.2 微处理器的发展
- 处理器和图形处理单元
- 数字信号处理器
1.3 指令的执行
每个指令周期开始时,处理器从存储器中取一条指令。
程序计数器(Program Counter,PC) = 指令的地址,保存下一次要取的指令地址。
指令寄存器(Instruction Register,IR) = 正被执行的指令,取到的指令放在处理器的一个寄存器中。
累加器(AC) = 临时存储。
- 处理器-存储器:数据可以从处理器传送到存储器,或从存储器传送到处理器。
- 处理器-I/O:通过处理器和I/O模块间的数据传送,数据可以输出到外部设备,或从外部设备向处理器输入数据。
- 数据处理:处理器可以执行很多与数据相关的算术操作或逻辑操作。
- 控制:某些指令可以改变执行顺序。
1.4 中断
程序中断 | 在某些条件下由指令执行的结果产生,如算术溢出,被零除,视图执行一条非法机器指令或访问用户不允许的存储器位置 |
---|---|
时钟中断 | 由处理器内部的计时器产生,允许操作系统按一定的规律执行函数 |
I / O 中断 | 由 I / O 控制器产生,用于发信号通知一个操作系统的正常完成或各种错误条件 |
硬件失效中断 | 由诸多掉电或存储器奇偶校验错之类的故障产生 |
死锁
- 银行家算法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define M 4
#define N 3
int available[3] = { 0,0,0 };
int max[4][3] = { {0,0,0},{0,0,0},{0,0,0},{0,0,0} };
int allocation[4][3] = { {0,0,0},{0,0,0},{0,0,0},{0,0,0} };
int need[4][3] = { {0,0,0},{0,0,0},{0,0,0},{0,0,0} };
int request[3] = { 0,0,0 };
void input()
{
int i = 0, j = 0;
printf("\t \t \t \tA B C\n");
printf("请输入进程0对3类资源的最大需求:");
for (j = 0; j < 3; j++)
{
scanf_s("%d", &max[0][j]);
}
printf("\n");
printf("请输入进程1对3类资源的最大需求:");
for (j = 0; j < 3; j++)
{
scanf_s("%d", &max[1][j]);
}
printf("\n");
printf("请输入进程2对3类资源的最大需求:");
for (j = 0; j < 3; j++)
{
scanf_s("%d", &max[2][j]);
}
printf(" \n");
printf("请输入进程3对3类资源的最大需求:");
for (j = 0; j < 3; j++)
{
scanf_s("%d", &max[3][j]);
}
printf("\n");
printf("请输入进程0已分配的3类资源量:");
for (j = 0; j < 3; j++)
{
scanf_s("%d", &allocation[0][j]);
}
printf("\n");
printf("请输入进程1已分配的3类资源量:");
for (j = 0; j < 3; j++)
{
scanf_s("%d", &allocation[1][j]);
}
printf("\n");
printf("请输入进程2已分配的3类资源量:");
for (j = 0; j < 3; j++)
{
scanf_s("%d", &allocation[2][j]);
}
printf("\n");
printf("请输入进程3已分配的3类资源量:");
for (j = 0; j < 3; j++)
{
scanf_s("%d", &allocation[3][j]);
}
printf("\n");
printf("请输入可利用的3类资源量:");
for (j = 0; j < 3; j++)
{
scanf_s("%d", &available[j]);
}
for (i = 0; i < 4; i++)
for (j = 0; j < 3; j++) {
need[i][j] = max[i][j] - allocation[i][j];
}
printf("\n");
}
void change(int n) {
int j;
for (j = 0; j < N; j++)
{
available[j] -= request[j];
allocation[n][j] += request[j];
need[n][j] -= request[j];
}
}
void output()
{
int i = 0, j = 0, n;
printf("该时刻3类资源的分配情况如下: \n");
printf("\tMAX\t \tALOCAT\t \tNEED\t \tAVAILABLE\n");
printf("进程0: \t");
for (j = 0; j < 3; j++) {
printf("%d ", max[0][j]);
}
printf("\t");
for (j = 0; j < 3; j++) {
printf("%d ", allocation[0][j]);
}
printf(" \t");
for (j = 0; j < 3; j++) {
printf("%d ", need[0][j]);
}
printf(" \t");
for (j = 0; j < 3; j++) {
for (j = 0; j < 3; j++) {
printf("%d ", available[j]);
}
printf(" \n");
printf("进程1: \t");
for (j = 0; j < 3; j++) {
printf("%d ", max[1][j]);
}
printf("\t");
for (j = 0; j < 3; j++) {
printf("%d ", allocation[1][j]);
}
printf(" \t");
for (j = 0; j < 3; j++) {
printf("%d ", need[1][j]);
}
printf(" \n");
printf("进程2: \t");
for (j = 0; j < 3; j++) {
for (j = 0; j < 3; j++) {
printf("%d ", max[2][j]);
}
printf(" \t");
for (j = 0; j < 3; j++) {
printf("%d ", allocation[2][j]);
}
printf(" \t");
for (j = 0; j < 3; j++) {
printf("%d ", need[2][j]);
}
printf("\n");
printf("进程3: \t");
for (j = 0; j < 3; j++) {
printf("%d ", max[3][j]);
}
printf(" \t");
for (j = 0; j < 3; j++) {
for (j = 0; j < 3; j++) {
printf("%d ", allocation[3][j]);
}
printf(" \t");
for (j = 0; j < 3; j++) {
printf("%d ", need[3][j]);
}
printf("\n");
printf("请输入请求资源的进程号:");
scanf_s("%d", &n);
printf("\n");
enter2:
{
printf("请输入进程%d对3类资源的需求量:", n);
for (j = 0; j < 3; j++)
{
scanf_s("%d", &request[j]);
if (request[j] > need[n][j]) {
printf("申请的资源数量大于自身需求的最大值!请重新输入! \n");
goto enter2;
}
else {
if (request[j] > available[j]) {
printf("申请的资源数量大于可用的资源数量!请重新输入! \n");
goto enter2;
}
}
}
}
printf("\n");
change(n);
}
}
}
}
int findmany() {
int i = 0, j = 0, k = 0, l = 0;
i = allocation[0][0] + allocation[0][1];
i += allocation[0][2];
j = allocation[1][0] + allocation[1][1];
j += allocation[1][2];
k = allocation[2][0] + allocation[2][1];
k += allocation[2][2];
l = allocation[3][0] + allocation[3][1];
l += allocation[3][2];
if (i >= j) {
if (i >= k)
{
if (i >= l)
return 0;
else
return 3;
}
else
{
if (k >= l)
return 2;
else
return 3;
}
}
else
{
if (j >= k)
{
if (j >= l)
return 1;
else
return 3;
}
else
{
if (k >= l)
return 2;
else
return 3;
}
}
}
int findfew()
{
int i = 0, j = 0, k = 0, l = 0;
i = need[0][0] + need[0][1];
i += need[0][2];
j = need[1][0] + need[1][1];
j += need[1][2];
k = need[2][0] + need[2][1];
k += need[2][2];
l = need[3][0] + need[3][1];
l += need[3][2];
if (i <= j)
{
if (i <= k)
{
if (i <= l)
return 0;
else
return 3;
}
else
{
if (k <= l)
return 2;
else
return 3;
}
}
else
{
if (j <= k)
{
if (j <= l)
return 1;
else
return 3;
}
else
{
if (k <= l)
return 2;
else
return 3;
}
}
}
int checksafe(int n)
{
int work[3], finish[M], que[M];
int i = 0, k = 0;
for (i = 0; i < M; i++)
finish[i] = false;
for (;;)
{
work[0] = available[0];
work[1] = available[1];
work[2] = available[2];
i = n;
while (i < M)
{
if (finish[i] == false && need[i][0] <= work[0] && need[i][1] <= work[1] && need[i][2] <= work[2])
{
work[0] += allocation[i][0];
work[1] += allocation[i][1];
work[2] += allocation[i][2];
finish[i] = true;
que[k] = i;
k++;
i = 0;
}
else
i++;
}
for (i = 0; i < M; i++)
if (finish[i] == false)
{
printf("存在死锁!\n");
return 1;
break;
}
break;
}
printf("\n 检测结果:不存在死锁!\n");
printf("安全序列为:");
for (i = 0; i < M; i++)
printf("%d\t\n", que[i]);
return 0;
}
void main()
{
int m = 0, n = 0, i = 0, j = 0;
printf("\t死锁的检测与解除\n");
input();
output();
printf("请输入进程号:");;
scanf_s("%d", &n);
printf("请输入请求资源数:%d\n", n);
change(n);
if (checksafe(n))
{
check:
{
m = findmany();
printf("\n");
printf("进程%d的资源数过多,需要释放资源!\n", m);
for (j = 0; j < 3; j++)
{
available[j] += allocation[m][j];
need[m][j] += allocation[m][j];
allocation[m][j] = 0;
}
n = findfew();
for (j = 0; j < 3; j++)
{
request[j] = need[n][j];
}
change(n);
if (checksafe(n))
goto check;
}
}
output();
}