操作系统——精髓与设计原理

第一章 计算机系统概论


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();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《分布式计算系统导论:原理与组成》是一本介绍分布式计算系统的入门学习资料。本书从系统介绍、原理讲解、组成要素、应用案例等多个方面进行了全面阐述。 首先,本书介绍了分布式计算系统的定义和基本概念。分布式计算系统是一种将任务分散到多个计算节点上进行并行处理的系统,它具有高性能、可靠性、可扩展性等特点。 接着,本书详细解释了分布式计算系统的原理和工作机制。说明了数据分布、并行计算、通信协议等关键技术,并介绍了分布式文件系统、分布式数据库、分布式存储等常用的组成要素。 然后,本书还通过实际应用案例来展示分布式计算系统的实际应用场景和解决问题的能力。例如,分布式计算系统在科学计算、云计算、大数据处理等领域具有广泛的应用。 最后,本书提供了相关教学参考和学习资源,包括习题和参考文献。这些资源对于读者深入理解分布式计算系统的原理和组成具有重要作用。 总之,《分布式计算系统导论:原理与组成》通过简明扼要的方式,全面介绍了分布式计算系统的原理和组成要素,深入浅出地向读者展示了分布式计算系统的基本概念、工作原理和应用案例。这本书对于学习和研究分布式计算系统的人员来说是一本很好的入门资料。 ### 回答2: 《分布式计算系统导论——原理与组成》是一本介绍分布式计算系统的相关原理和组成的书籍。分布式计算系统是指将任务或数据拆分为多个子任务或子数据,并在多个计算节点上进行并行计算和处理的一种系统。本书从理论和实践两方面详细介绍了分布式计算系统的基本原理和构成要素。 在原理方面,本书首先介绍了分布式计算系统的基本概念和发展历程,然后讲解了分布式计算系统的基本原理,包括任务划分与调度、通信与同步、容错与恢复等。这些原理是构建分布式计算系统的基石,对于理解和设计分布式计算系统非常重要。 在组成方面,本书详细讲解了分布式计算系统的各个组成部分。首先介绍了分布式文件系统,它是分布式计算系统的底层支撑,用于存储和管理分布式计算系统的数据。然后介绍了任务管理器和资源调度器,它们负责分配任务和资源给计算节点,确保系统能够高效地完成任务。接着介绍了通信中间件和数据传输协议,它们负责计算节点之间的通信和数据传输。最后介绍了容错和恢复机制,保证系统在节点故障时仍然能够正常运行。 总之,《分布式计算系统导论——原理与组成》是一本深入浅出地介绍分布式计算系统的理论和实践的书籍。通过学习本书,读者可以全面了解分布式计算系统的基本原理,以及构成分布式计算系统的各个组成部分。这将有助于读者在实际应用中设计和搭建高效可靠的分布式计算系统。 ### 回答3: 《分布式计算系统导论——原理与组成》是一本介绍分布式计算系统的教材。该教材主要围绕分布式计算系统的原理和组成展开讲解。 在原理方面,教材首先介绍了分布式计算系统的概念和基本原理。分布式计算系统是由多个计算节点组成的系统,节点之间通过网络进行通信和协作,共同完成任务。教材深入阐述了分布式系统的通信模型、一致性协议、容错原理等重要内容,使读者能够全面了解分布式计算系统的基本原理。 在组成方面,教材详细介绍了分布式计算系统的关键组成部分。其中包括分布式文件系统、分布式数据库、分布式调度器、分布式存储等。针对每个组成部分,教材都给出了其设计思路、实现原理和应用场景等详细信息,帮助读者全面掌握分布式计算系统的搭建和应用。 此外,教材还涉及了分布式计算系统的挑战和趋势。随着信息技术的不断发展,分布式计算系统面临着越来越多的挑战,如数据安全、任务调度等。教材对这些挑战进行了深入的分析,并提供了一些解决方案。同时,教材还展望了分布式计算系统的未来发展趋势,如云计算、边缘计算等,使读者对分布式计算系统的未来有一个清晰的认识。 总的来说,《分布式计算系统导论——原理与组成》通过深入浅出的讲解,帮助读者全面了解分布式计算系统的原理和组成。无论是学习分布式计算系统的初学者还是从事相关工作的专业人士,都能从该教材中获得宝贵的知识和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值