进程调度算法(c语言)

article/2025/10/1 18:05:32

对一个非抢占式多道批处理系统采用以下算法的任意两种,实现进程调度,并计算进程的开始执行时间,周转时间,带权周转时间,平均周转时间,平均带权周转时间
1.先来先服务算法 2.短进程优先算法 *3.高响应比优先算法

一、设计思想
每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算

1、先来先到算法:优先运行先到达的进程,后达到的进程后运行,类似数据结构中的队列,先进先出,对于先来先服务算法,我们只需要队进程进行排序即可;
2、短进程优先算法:若进程的到达时间有先后,则还是先运行先到达的进程,若当前有进程正在运行,则到达的进程置为就绪状态,等待进程运行完毕,释放资源后,比较处于就绪状态的进程,服务时间短的优先运行,等待下一个进程运行完毕后,继续比较就绪进程的服务时间,仍取服务时间短的。

数据结构:
在这里插入图片描述

先来先服务排序部分算法:
在这里插入图片描述

短进程优先部分算法:
在这里插入图片描述

将所有的进程信息存入数组里,本程序通过随机赋值赋予进程到达时间、服务时间等,然后通过计算计算出周转时间、带权周转时间、平均周转时间以及平均带权周转时间

程序源代码如下:

`#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h> //进程控制块(PCB)
struct PCB
{char name;float arrivetime;float servetime;float finishtime;float roundtime;float daiquantime;
};struct PCB a[100];
struct PCB b[100];
char *jczt[] = { "运行", "就绪" };//*表示没有字符串的大小限制//打印统计信息
void tjxx(int n)
{float averoundtime = 0.0f;		float avedaiquantime = 0.0f;	printf("按任意键查看统计信息");getchar(); getchar();printf("\n\n进程名称\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间");for (int j = 0; j < n; j++){printf("\n   %c\t\t%4.f\t\t%4.f\t\t%4.f\t\t%4.f\t\t  %.2f\n", a[j].name, a[j].arrivetime, a[j].servetime, a[j].finishtime, a[j].roundtime, a[j].daiquantime);averoundtime += a[j].roundtime;avedaiquantime += a[j].daiquantime;}printf("\n平均周转时间:%.2f", averoundtime / n);printf("\n\n平均带权周转时间:%.2f\n", avedaiquantime / n);
}void xlxfw(int n)
{int time = 0;				//定义当前时刻int processnum = 0;				//定义当前进程指向struct PCB t;				//定义一个空的结构体节点int processztsy = 0;				//定义进程状态索引while (1){printf("当前时刻:%2d\n", time);//排序for (int i = 1; i < n; i++){for (int j = 0; j < n - i; j++){if (a[j].arrivetime > a[j + 1].arrivetime)//先到先运行{t = a[j];a[j] = a[j + 1];a[j + 1] = t;}if (a[j].arrivetime == a[j + 1].arrivetime)//进程同时到{if (a[j].servetime > a[j + 1].servetime)//比较服务时间,将运行时间短的放在优先级高的位置{t = a[j];a[j] = a[j + 1];a[j + 1] = t;}}}}for (int k = 0; k< n; k++){if (time == a[k].arrivetime && a[k].arrivetime != 0){if (k >= 1 && time >= a[k - 1].finishtime || k == 0){processztsy = 0;}else{processztsy = 1;}printf("\t\t进程 %c 到达\t进程状态\n", a[k].name);printf("\n\t\t\t\t  %s\n\n\n", jczt[processztsy]);if (processnum >= 1){a[k].finishtime = a[k - 1].finishtime + a[k].servetime;a[k].roundtime = a[k].finishtime - a[k].arrivetime;a[k].daiquantime = a[k].roundtime / a[k].servetime;}if (processnum == 0){a[k].finishtime = a[k].arrivetime + a[k].servetime;a[k].roundtime = a[k].finishtime - a[k].arrivetime;a[k].daiquantime = a[k].roundtime / a[k].servetime;printf("\t\t\t进程  %c  开始\n\n\n\n", a[processnum].name);processnum++;}}if (time == a[k].finishtime && a[k].finishtime != 0){printf("\t\t\t进程  %c  完成\n\n\n\n", a[k].name);}if ((k >= 1 && time >= a[k].arrivetime && time == a[k - 1].finishtime && a[k].arrivetime != 0)){printf("\t\t\t进程  %c  开始\n\n\n\n", a[k].name);}}if (time > a[n - 1].finishtime && a[n - 1].finishtime != 0){printf("\t\t\t所有进程已进程已加载完毕! \n\n\n\n");break;}time++;Sleep(1000);}tjxx(n);
}void djcyx(int n)
{struct PCB t;int time = 0;//定义当前时刻int jcnum = 0;int jcztsy = 0;bool ztgb = false;//排序for (int i = 1; i < n; i++){for (int j = 0; j < n - i; j++){if (a[j].arrivetime > a[j + 1].arrivetime)//先到达的优先级高{t = a[j];a[j] = a[j + 1];a[j + 1] = t;}}}while (1){printf("当前时刻:%d\n", time);//遍历数组,注意同时达到的进程,所以采用for循环遍历for (int k = 0; k< n; k++){//是否有进程的到达时间等于当前时刻if (time == a[k].arrivetime && a[k].arrivetime != 0){//判断到达进程因该处于什么状态if (k >= 1 && time >= a[k - 1].finishtime || k == 0){jcztsy = 0;}else{jcztsy = 1;}printf("\t\t进程 %c 到达\t进程状态\n\n\n\n", a[k].name);}}if (jcnum == 0){//遍历数组for (int i = jcnum; i < n; i++){//把当前到达的进程筛选出来if (time >= a[i].arrivetime){//从挑选出来的进程中选取服务时间最短的一个if (a[i].servetime < a[jcnum].servetime){t = a[jcnum];a[jcnum] = a[i];a[i] = t;}ztgb = true;}}if (ztgb == true){printf("\t\t\t进程  %c  开始\n\n\n\n", a[jcnum].name);a[jcnum].finishtime = a[jcnum].arrivetime + a[jcnum].servetime;a[jcnum].roundtime = a[jcnum].finishtime - a[jcnum].arrivetime;a[jcnum].daiquantime = a[jcnum].roundtime / a[jcnum].servetime;ztgb = false;jcnum++;}}if (time == a[jcnum - 1].finishtime && a[jcnum - 1].finishtime != 0){printf("\t\t\t进程  %c  完成\n\n\n\n", a[jcnum - 1].name);//遍历数组for (int i = jcnum; i < n; i++){//把当前到达的进程筛选出来if (time >= a[i].arrivetime){//从挑选出来的进程中选取服务时间最短的一个if (a[i].servetime < a[jcnum].servetime){t = a[jcnum];a[jcnum] = a[i];a[i] = t;}ztgb = true;}}if (ztgb == true || jcnum == n - 1){printf("\t\t\t进程  %c  开始\n\n\n\n", a[jcnum].name);a[jcnum].finishtime = a[jcnum - 1].finishtime + a[jcnum].servetime;a[jcnum].roundtime = a[jcnum].finishtime - a[jcnum].arrivetime;a[jcnum].daiquantime = a[jcnum].roundtime / a[jcnum].servetime;ztgb = false;jcnum++;}}if (time > a[n - 1].finishtime && a[n - 1].finishtime != 0){printf("\t\t\t所有进程已加载完毕! \n\n\n\n");break;}time++;Sleep(1000);}tjxx(n);
}//信息录入
int info()
{int n = 0;srand(time(NULL)); //初始化随机函数     	printf("\n\t\t请输入需要的进程数:");scanf("%d", &n);printf("\n");for (int i = 0; i < n; i++){printf("\t\t进程 %d\t名称:", i + 1);scanf("%s", &a[i].name);a[i].arrivetime = (float)(rand() % 5 + 1);//随机获取进程运行到达时间a[i].servetime = (float)(rand() % 5 + 1);//随机获取进程运行服务时间}system("cls");return n;
}void main()
{int b = 1, k;while (b){system("cls");printf("\n\n\t\t进程调度算法\n\n");printf("\t\t 程序清单\n");printf("\t\t1.... 先来先服务算法        \n");printf("\t\t2.... 短进程优先算法        \n");printf("\t\t3.... 退出程序          \n\n\n");printf("\t\t请选择:");scanf("%d", &k);switch (k){case 1:	 xlxfw(info());    	break;case 2:  djcyx(info());     break;case 3:  b = 0;               break;default:printf("\n\t\t请输入正确的选择!\n");}if (b != 0){printf("\n"); system("pause");}}printf("\n\t\t谢谢使用!\n\n\t\t");
}`

http://chatgpt.dhexx.cn/article/Ke0oiW79.shtml

相关文章

进程的创建——fork函数

1. 进程的信息 进程的结构 在Linux中&#xff0c;一切皆文件&#xff0c;进程也是保存在内存中的一个实例&#xff0c;下图描述了进程的结构: 堆栈:保存局部变量数据段:一般存放全局变量和静态变量代码段:存储进程的代码文件TSS状态段:进程做切换时&#xff0c;需要保存进程现场…

C语言结构体

本节主要讲解下结构体的一些易错点和重要内容 结构体变量定义 &#xff08;使用typedef起别名&#xff09; 一般的结构体定义&#xff1a;定义类型变量 struct student {long stuID;char stuName[10];char stuSex;char birthYear;int mathScore; }stu1;可以用typedef取别…

深入探索 Linux 进程信号的奥秘

Linux 进程信号 0 查看IPC(进程间通信)资源的指令1 学习进程信号的过程2 Linux 进程信号的基本概念2.1 对信号的基本认知 3 Linux 进程信号的产生方式4 Linux 进程信号的保存和处理5 Linux 进程信号递达6 volatile关键字 0 查看IPC(进程间通信)资源的指令 ipcs -m : 查看共享内…

Linux 进程信号深剖

目录 传统艺能&#x1f60e;概念&#x1f914;信号发送&#x1f914;信号记录&#x1f914;信号产生&#x1f914;常见信号处理方式&#x1f914;终端按键产生信号&#x1f914;核心转储&#x1f60b;如何调试&#x1f914; 系统函数发送信号&#x1f914;raise函数&#x1f91…

Linux进程信号

文章目录 一.信号入门二. 产生信号(1). 通过键盘按键产生信号(2). 硬件异常产生信号(3).通过系统函数发送信号(4). 由软件条件产生信号 三.阻塞信号(1). 阻塞/递达/未决概念 :(2). 信号在内核中的表示(3). sigset_t(4). 信号集操作函数(5). 处理信号 四. 可重入函数/不可重入函…

[培训-DSP快速入门-7]:C54x DSP开发环境与第一个汇编语言程序

作者主页(文火冰糖的硅基工坊)&#xff1a;https://blog.csdn.net/HiWangWenBing 本文网址&#xff1a;https://blog.csdn.net/HiWangWenBing/article/details/119011489 目录 引言&#xff1a; 第1章 DSP汇编语言编程的流程概述 第2章 汇编语言程序建立过程 2.1 建立工程…

[培训-DSP快速入门-6]:C54x DSP开发中C语言库函数的使用

作者主页(文火冰糖的硅基工坊)&#xff1a;https://blog.csdn.net/HiWangWenBing 本文网址&#xff1a;https://blog.csdn.net/HiWangWenBing/article/details/119010855 目录 第1章 DSP库函数概述 第2章 运行时支持库 2.1 如何加入运行时支持库 2.2 为什么需要运行时的库…

【DSP开发】帮您快速入门 TI 的 Codec Engine

德州仪器半导体技术&#xff08;上海&#xff09;有限公司 通用DSP 技术应用工程师 崔晶 德州仪器&#xff08;TI&#xff09;的第一颗达芬奇&#xff08;DaVinci&#xff09;芯片&#xff08;处理器&#xff09;DM6446已经问世快三年了。继DM644x之后&#xff0c;TI又陆续推出…

DSP开发,使用CCS软件建立工程以及烧录

DSP开发&#xff0c;使用CCS软件建立工程以及烧录 1 概述1.1 资源概述1.2 DSP介绍 2 工程建立步骤4 烧录到flash中4.1 通过增减文件实现4.2 增加预编译宏 5 独立下载工具5.1 Uniflash5.2 C2prog 6 程序源码6.1main()函数6.2 leds.c文件6.3 leds.h文件 1 概述 实验的代码已经上…

浅谈DSP开发创建第一个工程Hello World

浅谈DSP开发创建第一个工程Hello World 本教程以TI公司的TMS320F2812芯片为例进行演示开发环境搭建(CCS)CMD文件概述编写第一个工程Hello World概述 本教程以TI公司的TMS320F2812芯片为例进行演示 开发环境搭建(CCS) 首先开发环境问题&#xff1a;目前最新TI官方发布的开发环…

DSP(数字信号处理器)技术概要

数字信号处理器(digital signal processor,DSP)是一种用于数字信号处理的可编程微处理器&#xff0c;它的诞生与快速发展&#xff0c;使各种数字信号处理算送得以实时实现&#xff0c;为数字信号处理的研究和应用打开了新局面&#xff0c;提供了低成本的实际工作环境和应用平台…

DSP_1 环境搭建

1、打开ccs6.0&#xff0c;将DSP281x_common、DSP281x_headers两个库文件导入到根目录当中。 2、在project的Properties当中添加库文件路径&#xff0c;使编译器能够找到这些文件。 3、exclude那些重定义的文件&#xff0c;即可。 4、编译的过程分为compile与link&#xff0c…

从BES蓝牙耳机开发中谈DSP开发与嵌入式ARM的区别

对比下DSP开发与嵌入式ARM的区别&#xff0c;DSP开发&#xff0c;发开算法&#xff0c;注意链接文件的使用。 一先看BES的DSP开发 1 lds链接文件之代码段text 存放可执行代码和浮点数常量 2 data数据段 3 .bss段 存放没有初始化的全局变量和静态变量。 二 ARM开发 主要是配置…

用于多核DSP开发的核间通信

TI的多核DSP以TMS320C6678为例&#xff0c;它是多核同构的处理器&#xff0c;内部是8个相同的C66x CorePac。对其中任意一个核的开发就和单核DSP开发的流程是类似的。   但是如果仅仅只是每个核独立开发&#xff0c;那么很难体现出多核的优势。要充分发挥多核处理器的性能&am…

近期C6000 DSP开发小结

使用C开发DSP 如果你也跟我一样刚开始接触C6000系列的DSP&#xff0c;我觉得可以尝试一下用C来开发&#xff0c;虽然说这么做代码的执行效率可能会比C或者纯汇编的开发来得低&#xff0c;但它胜在能够让整个工程的脉络更加清晰。 面向C6000开发的cl6x编译器对C有比较好的支持。…

【DSP开发】CCS5.5测试代码运行时间

1、进入CCS环境&#xff0c;load已有工程.out文件&#xff0c;找到要查看的代码执行周期的地方。 2、选择CCS菜单中的Run——Clock——Enable 3、选择Run——Clock——Setup 4、在左下角观察时钟周期 5、 至此就可以解决在代码中引入<time.h>后输出为0的情况&#xff…

ADI DSP开发环境(CCES)下的程序烧录问题(以ADSP-SC589为例)

在CCES环境下将程序烧录到flash主要有两种方式。 1.通过命令窗口 首先在对项目编译产生文件的属性设置为Release。 在编译完成后&#xff0c;找到每个CORE单独生成的DXE文件&#xff1a; 文件通常位于项目目录下每个core的Release文件中。 安装SC589评估板的驱动&#xff…

DSP开发环境及工具之CCS

DSP开发环境及工具之CCS CCS( Code Composer Studio)是美国德州仪器(TI)公司的嵌入式处理器的开发环境,可以用于TI公司的各个系列处理器的软件开发和调试,如DSP,MCU,ARM等。 主要的操作都是在这个窗口之间做相应的切换。 创建工程文件 或者

【FPGA-DSP】第二期:DSP开发流程【全过程】

目录 1. System Generator安装 1.1 system generator的安装 1.1.1 vivado安装System Generator 1.1.2 System Generator配置 1.3 启动 2. FPGA-DSP开发流程 2.1 FPGA-DSP 开发流程介绍 2.2 FPGA-DSP 实际开发流程 1. 软件启动 2. matlab编写 3. Simulink仿真 Simu…

DSP开发笔记一

前言 ​ 本笔记首先对DSP的特点及其选型进行了描述&#xff0c;然后重点记录DSP开发环境的搭建及基础工程示例&#xff0c;对为DSP开发新手有一定的指导作用。 1. DSP简介 1.1 主要特点 在一个指令周期内可完成一次乘法和一次加法&#xff1b;程序和数据空间分开&#xff0…