操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

c++ 操作系统实验 进程调度 实验一  进程调度 实验学时:4学时 实验类型:设计 实验要求:必修 一、 实验目的 多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。 二、 实验内容 1. 优先权法、轮转法 简化假设 1) 进程为计算型的(无I/O) 2) 进程状态:ready、 阅读详情
AI摘要

本实验通过C语言模拟了操作系统中的进程调度过程,包括先来先服务、短进程优先和时间片轮转法等多种调度算法。提供了创建、撤销、调度、阻塞等功能。

实验二 进程调度

一、     实验目的

1.       理解进程运行的并发性。 

2.       理解处理器的三级调度。

3.       掌握先来先服务的进程调度算法。

4.       掌握短进程优先的进程调度算法。

5.       掌握时间片轮转的进程调度算法。 

二、     实验设备

1.     安装windows或者linux操作系统的PC机

2.     C程序编译环境

三、     实验内容

用c语言编程模拟实现至少一个操作系统的常见进程调度算法。常见的进程调度算法有先来先服务、短进程优先、时间片轮转法等。

四、     实验要求

1.     上机编写并调试进程调度的模拟程序。

2.     要把相应的程序代码及程序运行结果写入实验报告中。

 

//操作系统—进制控制模拟
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#include<tlhelp32.h>
#define N 10
struct pb
{
  int ko;
  int no;
  int cha;
};
typedef struct pb PCB;
PCB a[N];
int showallproc()
{
    PROCESSENTRY32 pe32;//用来存储进程信息的结构体
    pe32.dwSize=sizeof(pe32);
    HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//获取进程快照
    if(hProcessSnap==INVALID_HANDLE_VALUE)
    {
        printf("调用失败\n");
        return 1;
    }
    BOOL bProc=Process32First(hProcessSnap,&pe32);
    while(bProc)
    {
        printf("%5d %s\n",pe32.th32ProcessID,pe32.szExeFile);//输出进程ID和进程名
        bProc=Process32Next(hProcessSnap,&pe32);
    }
    CloseHandle(hProcessSnap);
    return 0;
}
static int count=1;
void create()   //创建
{
  static int pi=1;
  int k,l=0,m;
  printf("请输入创建的进程号:");
  scanf("%d",&m);
  for(k= 1;k<= N;k++ )
    if(a[k].no ==m)
	  l=1;
	if(l == 1)
	{
	  printf("错误,进程创建重复!\n");
	  create();
	}
    else
	{
		for(k= 1;k<= N;k++ )
		{
			if(a[k].no==0)
			{
				pi=k;break;}
		}
	  a[pi].no=m;
	  printf("\n输入优先级:");
	  scanf("%d",&a[pi].ko);
	  if(count>1)            //首次进程状态为执行,之后为活动就绪
	    a[pi++].cha=3;
	  else
	    a[pi++].cha=5;
	  count++;
	}
}

int stopproc()
{
    DWORD ProcessID;
    printf("请输入想要终止的进程ID\n");
    scanf(" %d",&ProcessID);
    HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,ProcessID);//打开对应进程句柄
    if (hProcess==NULL)
    {
        printf("失败\n");
        return -1;
    }
    if (!TerminateProcess(hProcess,0))//关闭进程
    {
        printf("关闭失败\n");
    }
    else
    {
        printf("关闭成功\n");
    }
    CloseHandle(hProcess);
    
    return 0;
}

void dispatch()   //调度
{
	int i,m,l=0,j=0,k,min=10000;

	for(m= 1;m<= N;m++ )
		if(a[m].cha==5)
			l=m;
		if(l!=0)
		{
			printf("调度失败!");
			return;
		}
		else 
	for(k= 1;k<= N;k++ )
	{
		if(a[k].cha==3)
		if(min>a[k].ko)
		{
			min=a[k].ko;
		    i=k;
			j=1;
		}
	}
	    if(j)         
		    a[i].cha=5;
        else if(j==0)
			printf("调度失败!\n");
	
}

void block()   //阻塞
{
  int k,m,l=0;
  printf("请输入已经创建的进程号:");
  scanf("%d",&m);
  for(k= 1;k<= N;k++ )
    if(a[k].no==m)
	  l=k;
	if(l!=0)
	{
	  if(a[l].cha==3 || 5)
	    a[l].cha=4;
		else if(a[l].cha==1)
		  a[l].cha=2;
		  else
		  printf("阻塞失败!\n");
	}
	else
		printf("阻塞失败!");
}

void wakeup()   //唤醒
{
  int k,m,l=0;
  printf("请输入已经创建的进程号:");
  scanf("%d",&m);
  for(k= 1;k<= N;k++ )
   if(a[k].no==m)
     l=k;
   if(l!=0)
   {
	 if(a[l].cha==2)
	   a[l].cha=1;
	   else if(a[l].cha==4)
	     a[l].cha=3;
	     else
		 printf("唤醒失败!\n");
   }
   else
	   printf("唤醒失败!");
}


void suspend()   //挂起
{
  int k,m,l=0;
  printf("请输入已经创建的进程号:");
  scanf("%d",&m);
  for(k= 1;k<= N;k++ )
    if(a[k].no==m)
	  l=k;
	if(l!=0)
	{
	  if(a[l].cha==3 || 5)
	    a[l].cha=1;
		else if(a[l].cha==4)
		  a[l].cha=2;
		  else
		  printf("错误!挂起失败\n");
	}
	else
		printf("错误!挂起失败!");
}

void active()   //激活
{
  int k,m,l=0;
  printf("请输入已经创建的进程号:");
  scanf("%d",&m);
  for(k= 1;k<= N;k++ )
    if(a[k].no==m)
	  l=k;
	if(l!=0)
	{
	  if(a[l].cha==1)
	    a[l].cha=3;
		else if(a[l].cha==2)
		  a[l].cha=4;
		  else
		  printf("激活失败!\n");
	}
	else 
		printf("激活失败!");
}

void display()   //查看PCB功能模块
{
  int i; 
  printf("\t\tPCB\t进程号\t优先级\t状态\n");
  for(i= 1;i<= 10;i++ )
  printf("\t\t%d\t%d\t%d\t%d\n",i,a[i].no,a[i].ko,a[i].cha);
  printf("\t1-静止就绪  2--静止阻塞  3--活动就绪  4--活动阻塞  5--执行\n");
}

void change_KO()   //改变优先数
{
  int k,m,l=0;
  printf("请输入已创建的进程号:");
  scanf("%d",&m);
  for(k= 1;k<= N;k++ )
    if(a[k].no==m)
	  l=k;
    if(l!=0)
	{
	    printf("输入新的优先级:");
	    scanf("%d",&a[l].ko);
	    display();
	}
	else
		printf("失败!");
}
/********************这是先来先服务的程序*********************************/
struct fcfs{//定义先来先服务结构体、参数
char name[10];
float daodatime;//到达时间
float fuwutime;//服务时间
float kaishitime;//开始时间
float wanchengtime;//完成时间
float zhouztime;//周转时间
float daiquantime;//带权周转时间
};
fcfs b[10000];
void input(fcfs *p,int N1)  //构造一个输入进程的信息的函数,定义结构体指针
{ 
	int i;   
   for(i=0;i<=N1-1;i++)
   {
     printf("输入第%d个进程的名字、到达时间、服务时间:\n",i+1);
     scanf("%s%f%f",&p[i].name,&p[i].daodatime,&p[i].fuwutime);//把输入的信息保存到结构体指针所对应的内存中
   }

}//构造一个输出函数
void Print(fcfs *p,float daodatime,float fuwutime,float kaishitime,float wanchengtime,float zhouztime,float daiquantime,int N1)
{
	int k;
    printf("执行顺序:\n");
    printf("%s",p[0].name);
    for(k=1;k<N1;k++)
	{
		printf("-->%s",p[k].name);
	}
     printf("\n进程的相关信息如下:\n");
     printf("\n名字\t到达\t服务\t开始\t完成\t周转\t带权周转\n");
     for(k=0;k<=N1-1;k++)
	 { 
      printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].daodatime,p[k].fuwutime,p[k].kaishitime,p[k].wanchengtime,p[k].zhouztime,p[k].daiquantime);
	 } //题目中加入-.2是保留双精度的两位。一般f默认保留六位小数的。  
} 
  void sort(fcfs *p,int N1)//进程根据到达时间进行排序
  { 
     for(int i=0;i<=N1-1;i++)
      for(int j=0;j<=i;j++)
       if(p[i].daodatime<p[j].daodatime)//如果i的时间到达时间小于j的到达时间,就交换
	   {
         fcfs temp;//在结构体中定义第三个变量进行交换
         temp=p[i];
         p[i]=p[j];
         p[j]=temp;
	   }
}
//核心的运行阶段
void deal(fcfs *p, float daodatime,float fuwutime,float kaishitime,float wanchengtime,float zhouztime,float daiquantime,int N1)
{ int k;
    for(k=0;k<=N1-1;k++)
	{
	  if(k==0)//K=0,表示第一个进程到达
	  { 
       p[k].kaishitime=p[k].daodatime;//那么开始时间=到达时间
       p[k].wanchengtime=p[k].daodatime+p[k].fuwutime;//完成时间=到达时间+服务时间
	  }
         else
		 {
           p[k].kaishitime=p[k-1].wanchengtime;//下一个进程的开始时间=上一个进程的完成时间
           p[k].wanchengtime=p[k-1].wanchengtime+p[k].fuwutime;//完成时间=上一个进程的完成时间+服务时间
		 }
	}
     for(k=0;k<=N1-1;k++)//计算周转时间和带权周转时间
     { 
      p[k].zhouztime=p[k].wanchengtime-p[k].daodatime;//周转时间=完成时间-到达时间
      p[k].daiquantime=p[k].zhouztime/p[k].fuwutime;//带权周转时间=周转时间/服务时间   
	 }
}
void FCFS(fcfs *p,int N1)//定义先来先服务函数
{  
     float daodatime=0,fuwutime=0,kaishitime=0,wanchengtime=0,zhouztime=0,daiquantime=0;//初始化变量为0
     sort(p,N1);//声明排序函数
     deal(p,daodatime,fuwutime,kaishitime,wanchengtime,zhouztime,daiquantime,N1);//声明运行函数
     Print(p,daodatime,fuwutime,kaishitime,wanchengtime,zhouztime,daiquantime,N1); //声明输出函数
}
/****************************这是优先服务调度算法的代码***********************************/
typedef struct PCB2
{  
   char name[10];//进程名
   int runtime;//要求运行时间
   int frist;//定义优先数
   char zhuangtai; //定义状态,R为就绪,F为完成
};
struct PCB2 PCBcontrol[4];//定义进程控制块数组 
void youxian()//构造优先函数 
{
	int i,n;
	printf("请输入进程的个数:\n");
    scanf("%d",&n);
	printf("请输入进程的名字、优先权、运行时间\n");
	printf("\n");
	for(i=0;i<n;i++)
	{
		printf("请输入第%d个进程的信息:\n",i+1);
		scanf("%s%d%d",&PCBcontrol[i].name,&PCBcontrol[i].frist,&PCBcontrol[i].runtime);
        PCBcontrol[i].zhuangtai='R';//进程初始状态均为就绪
        getchar();//等待回车进入下一次运行
	} 
} 
  int max_frist_process()//确定最大优先级进程子程序 
  { 
     int max=-10;//max为最大优先数,初始化为-10  
     int i,key;  
     for(i=0;i<3;i++) 
	 {
		 if(PCBcontrol[i].zhuangtai=='r')//r表示正在运行
			 return -1;//返回-1
		 else
			 if(max<PCBcontrol[i].frist&&PCBcontrol[i].zhuangtai=='R')//从就绪进程中选取优先数最大的进程
			 {
				 max=PCBcontrol[i].frist;//max存放每次循环中的最大优先数
				 key=i;//将进程号赋给key
			 }
	 }
	 if(PCBcontrol[key].zhuangtai=='F')//具有最大优先数的进程若已运行完毕
		 return -1;//则返回-1
	 else
		 return key;//将key作为返回值返回 
  }
  void show()//显示函数
  {
	  int i;  
      printf("\n进程名  优先级 运行时间 当前状态\n");
	  printf("*****************************************\n");
      for(i=0;i<3;i++)//依次显示每个进程的名、优先数、要求运行时间和状态
	  {
		  printf("  %s\t %d\t  %d\t   %s\t\n",&PCBcontrol[i].name,PCBcontrol[i].frist,PCBcontrol[i].runtime,&PCBcontrol[i].zhuangtai); 
	  }
	   printf("\n请按回车键进行查看");
  }
  void run()//进程运行子程序
  {
	  int i,j;
	  int t=0;//t为运行次数
	  for(j=0;j<3;j++)
	  {
		  t+=PCBcontrol[j].runtime;}//运行次数即为各个进程运行时间之和 
          printf("\n进程没运行前,当前的状态是:\n");  
          show(); //调用show()子程序显示运行前PCB的情况
		  getchar();//等待回车进入下一次运行
		  for(j=0;j<t;j++) 
		  {
			  while(max_frist_process()!=-1)//具有最大优先数的进程没有运行完,让其运行
			  {
				  PCBcontrol[max_frist_process()].zhuangtai='r';//将其状态置为r,表示其正在运行
			  }
			  for(i=0;i<3;i++)
			  {
				  if(PCBcontrol[i].zhuangtai=='r')
				  {
					  PCBcontrol[i].frist-=1;//将当前运行进程的优先数减1
					  PCBcontrol[i].runtime--;//要求运行时间减1
					  {
						  if(PCBcontrol[i].runtime==0)
							  PCBcontrol[i].zhuangtai='F';//运行完则将该进程状态置为结束
						  else
							  PCBcontrol[i].zhuangtai='R';//未运行完将其状态置为就绪
					  }
					  show();//显示每次运行后各PCB的情况
					  getchar();//等待回车进入下一次运行
				  }  
			  } 
		  } 
  }
  /***********************这是算法时间片轮转法的代码*****************************************/
  struct shijian {//定义时间片的结构体
	char name;  //定义进程名
    int daodatime;// 到达时间
    int fuwutime;  //服务时间
    int shengyutime;//剩余时间
	char *state;//所处状态
	struct shijian *next;
};
struct shijian *time()
{
	int a,i;
	struct shijian *head, *rear,*p,*q,*t;//定义队首、队尾、P是队尾指针、Q是队首指针和执行时间
	head=rear=NULL;//初始化队首和队尾为空 
    printf("请输入进程数目:");  
    scanf("%d",&a); 
	for(i=0;i<a;i++)
	{
		p=(struct shijian*)malloc(sizeof(struct shijian)); //初始化一个空间给进程进入
		printf("输入第%d个进程的名字、到达时间、服务时间:\n",i+1);
        scanf("%s%d%d",&p->name,&p->daodatime,&p->fuwutime);  
        p->shengyutime=p->fuwutime; 
        p->state="就绪";            
        if(rear==NULL) //当输入结束时,把P的数据放到队首,以便执行下一步
		{
			head=p;   
            p->next=NULL;   
            rear=p;  
		}
		else  //否则执行时间就为空,队首变成Q
		{
			t=NULL;   
            q=head;
			while(q&&q->daodatime<p->daodatime)//当Q和Q的到达时间小于P的到达时间时,把执行时间给Q
			{
				t=q;      
                q=q->next;
			}
			if(q==head)  //而当Q是队首时,则下一个队首变成P,以便每个进程都能够得到时间片
			{
				p->next=head;  
                head=p;
			}
			else if(t==rear)  //当执行时间片到达队尾时(执行完时),返回给队首P
			{
				rear->next=p; 
                p->next=NULL; 
                rear=p;
			}
			else   //否则给队首P占用执行时间,P执行完后到Q
			{
				t->next=p;   
                p->next=q;
			}   
		}   
	}
	return head;//返回队首
}
void output(struct shijian *head)//定义输出函数
{
	struct shijian *p,*t,*r; 
    int num;  
    printf("请输入时间片:");  
    scanf("%d",&num);
	while(head!=NULL) //当队首不为空时,把P给队首
	{
		r=p=head;
		while(p!=NULL) //把执行时间给队首
		{
			t=head;  
            p->shengyutime=p->shengyutime-num;  //P的剩余时间=剩余时间-时间片
            p->state="运行"; //状态变成运行态
            if(p->shengyutime<0) //当P运行完,即剩余时间小于0时,仍然把它当做0处理
            p->shengyutime=0;  
            printf("\n************程序开始运行*****************\n");
            printf("进程  到达时间 服务时间  剩余时间  当前状态\n");
			while(t!=NULL)  //时间不为空时,输出当前进程的信息,并把时间片交给下一个进程
			{
				printf("%2c%8d%8d%14d%10s\n",t->name,t->daodatime,t->fuwutime,t->shengyutime,t->state);  
                t=t->next;
			}
			getchar(); //按住回车键观看
			if(p->shengyutime==0)//当队首的剩余时间为0时,先把队首改成P的下一个,然后释放内存,删除队首节点
			{
				if(p==head)
				{
					head=p->next;
		            free(p);
		            p=head;
				}
				else  //否则返回执行,把队尾的下一个指针变成P的下一个指针,队尾的位置移动到队首
				{
					r->next=p->next; 
                    p=r->next; 
                    r=p;
				} 
			}
			else  //否则把队首的位置给队尾,把队首的状态显示为"就绪"状态
			{
				r=p;
				p->state="就绪";    
                p=p->next; 
			} 
		}   
    } 
}  
void diaodusuanfa()
{
	int N1;
	  int number;
	  char Tishikuang;//提示框
	  do{
        printf("    **                       输入 1-先来先服务                           *\n");
        printf("    **                       输入 2-时间片轮转法                         *\n");
        printf("    **                       输入 3-优先服务法                           *\n");
        printf("    **                       输入 0-退出该程序                           *\n");
        printf("\n提示:请根据自己的需求选择相应的操作数:\n");
        scanf("%d",&number);/*提示输入字母,用switch语句存入到case中,最后增加提示框是否继续*/
        switch(number)
        {
        case 0:
           break;
        case 1:
             printf("您选择的是**先来先服务调度**\n\n");
		     printf("请输入进程的数量:\n");
             scanf("%d",&N1);
             input(b,N1);
             FCFS(b,N1);
            break;
        case 2:
			printf("\n您选择的是时间片轮转发调度\n\n");
			struct shijian *head; //定义时间片的队首结构体
            head=time(); //队首执行的时间
            output(head) ;//输出函数
            break;
        case 3:
			printf("\n您选择的是优先服务调度,本程序可提供3个进程的调度。\n\n");
		    youxian();//初始化各个进程PCB 
            run();//进程调度模拟
		   break;
        default:
            printf("\n你的输入有误,请确定是从0到3之间进行输入,O(∩_∩)O谢谢\n");
            break;
        }
        printf("\n是否继续操作(y/n) ?");
        fflush(stdin);
        Tishikuang=getchar();
	}while(Tishikuang=='y'||Tishikuang=='Y');
} 

int main()
{
  int i;

  do
  {
   	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*        7-----激活                 *\n");
    printf("\t\t*        8-----查看进程控制块       *\n");
    printf("\t\t*        9-----改变优先数           *\n");
    printf("\t\t*       10----查看进程              *\n");
    printf("\t\t*       11----调度算法模拟          *\n");
    printf("\t\t*        0-----退出                 *\n");
    printf("\t\t*************************************\n");
    printf("\t\t请选择0-10:");
    scanf("%d",&i);
    printf("\n");
    switch(i)
    {
      case 1: create();break;
	  case 2:stopproc();break; 
	  case 3: dispatch();break;
	  case 4: block();break;
	  case 5: wakeup();break;
	  case 6: suspend();break;
	  case 7: active();break;
	  case 8: display();break;
	  case 9: change_KO();break;
      case 10: showallproc();break;
      case 11: diaodusuanfa();break;
	  case 0: exit(0);   //程序正常退出
    }
  }
  while(i!=0);
}

FCFS、SJF、HRRN调度算法 文章目录FCFS、SJF、HRRN调度算法知识总览图先来先服务(FCFS,First Come First Serve)短作业优先(SJF,Shortest Job First)对FCFS和SJF两种算法的思考高响应比优先算法(HRRN,Highest Response Ratio Next) FCFS、SJF、HRRN调度算法 知识总览图 什么叫做饥饿?就是进程一直不被CPU处理。FCFS算法不会导致饥饿是因为,它的所有的进程按到来的时间先后顺序依次执行,所以每个进程都会被执行到。SJF/SPF算法会导 阅读详情

相关推荐

操作系统课程设计--模拟时间片轮转法

课程设计题目 设计一个按照时间片轮转法实现处理机调度的程序。 实验内容 (1) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。 进程名 链接指针 到达时间 估计运行时间 进程状态 (2) 按照进程到达的先后顺序排成一个循环队列,设一个队首指针指向第一个到达进程的首址。另外再设一个当前运行进程指针,指向当前正运行的进程。 (3) 执行处理机调度时,首先选择队首的第一个进程运行。 (4) 由于本

weixin_43644231的博客 5068

头歌实验第1关:先来先服务调度算法

先来先服务算法的调度结果包括进程的完成时间、周转时间和带权周转时间需要填写在pcb数据结构中。给定一组进程的到达时间和服务时间,实现先来先服务调度算法,并打印出调度结果,包括每个进程的完成时间、周转时间和带权周转时间。本关任务:编写一个先来先服务器调度算法解决一个实际的进程调度问题,并打印出每个进程的完成时间、周转时间和带权周转时间。为了完成本关任务,你需要掌握:1.先来先服务调度算法,2.进程周转时间和平均周转时间的计算方法。周转时间=完成时间-到达时间 带权周转时间=周转时间/执行时间。

qq_65264458的博客 6385

操作系统进程调度实验

实验2 进程调度 一、实验目的 进程调度是处理机管理的核心内容。本实验要求用高级程序设计语言编写和调试一个简单的进程调用程序,模拟完成进程控制及进程调度算法。进程控制包括进程的创建、阻塞、唤醒和撤销,进程调度算法包括先来先服务、优先级(包括动态和静态)和论证法。通过本实验可以使学生加深对进程控制块和进程队列的概念的理解,并了解循环轮转调度和优先级调度的实现方法。 二、实验内容 1.设计进程控制块PCB结构,PCB结构包括以下信息:进程ID,用户ID, 进程状态,进程优先数(或轮转时间片),进程创建时

qq_50533078的博客 2940

先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法和优先级调度算法的实现(python)

先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法和优先级调度算法的实现(python)

m0_70109786的博客 4914

先进先出调度算法的实现

先进先出调度算法的实现,已经通过vc编译,可以直接用

操作系统进程调度算法 先来先服务 短作业优先 时间片轮转 优先级

操作系统进程调度算法 先来先服务 短作业优先 时间片轮转 优先级。有大量注释,帮助理解。目前没有错误

操作系统实验 进程调度 (先来先服务、时间片轮转法、优先级调度算法

@TOC加粗样式 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展

qq_42882082的博客 1万+

从零开始搭建GD32F103CBT6开发环境:VSCode配置与实战技巧

本文详细介绍了如何从零开始为国产MCU GD32F103CBT6搭建高效的VSCode开发环境。内容涵盖工具链安装、VSCode核心插件配置、工程目录结构规划、关键配置文件编写以及Makefile实战,旨在帮助开发者摆脱传统IDE束缚,利用现代化工具链提升嵌入式开发效率。

weixin_29158413的博客 448

【操作系统 - 2】时间片轮转RR进程调度算法

【操作系统 - 2】时间片轮转RR进程调度算法。学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘。等哪天还需要的话,却发现已经忘得差不多了,即使整理了文档(word等),还是得从头再学一遍。读研第一学期,发现很多东西都可以从博客上学习到,也有不少博主呕心沥血整理了挺多有用的博文。于是,本人借此契机,也慢慢开始整理一些博文,不断改进完善中。整理博文(IT)有如下目的。1. 首要目的:记录“求学生涯”的所学所悟,不断修改,不断更新!(有读者的互动)2. 其次目的:在这“开源”的时代,整理并分享所学所悟

Houchaoqun_XMU的博客 5万+

BIDS数据存储格式介绍与dcm2bids安装与使用

BIDS格式&dcm2bids安装与使用

machinelearning_er的博客 7317

告别调参烦恼:用Simulink手把手实现自适应模糊PID温度控制(附模型下载)

本文详细介绍了如何使用Simulink实现自适应模糊PID温度控制,解决传统PID调参难题。通过模糊推理引擎动态调整PID参数,系统能自动适应不同工况,显著提升控制精度和响应速度。文章包含完整的建模步骤、参数优化技巧和工业应用扩展,并附赠可下载模型,帮助工程师快速掌握这一智能控制技术。

weixin_30872499的博客 153

操作系统 进程调度实验报告

题目要求 一、 实验目的 多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。 二、 实验内容 1. 优先权法、轮转法 简化假设 1) 进程为计算型的(无I/O) 2) 进程状态:ready、running、finish 3) 进程需要的CPU时间以时间片为单位确定 2. 算法描述 1) 优先权法——动态优先权 当前运行进程用完时间片后,其优先权减去一个常数。 2) 轮转法 三、

十一月廿七风雨大作 1万+

保姆级教程:在LKD3588开发板上为RK3588添加SC2210摄像头驱动(含完整DTS配置)

本文提供了一份详细的教程,指导如何在LKD3588开发板上为RK3588处理器添加SC2210摄像头驱动,包括完整的DTS配置和内核编译步骤。教程涵盖了环境准备、驱动文件添加、DTS配置详解、内核编译与烧录、驱动测试以及常见问题排查,帮助开发者快速实现SC2210传感器在RK3588平台上的集成与优化。

weixin_42641741的博客 480

操作系统进程调度算法:先来先服务,时间片轮转,优先级调度,短作业优先调度算法

实现四种不同及进程调度算法: 先来先服务、时间片轮转调、优先级调度以及短作业优先调度算法。 ////1、 算法流程 ////抽象数据类型的定义:PCB块结构体类型 //struct PCB //{ // int name; // int arrivetime; //到达时间 // int servicetime; //服务时间 // //int starttime[max]; //开始时间 // int finishtime; //完成/结束时间 // int turntime; //周转时间 // i.

weixin_45035564的博客 8781

基于opencv-ANN的水果识别模型训练

本文通过opencv-ann-mlp训练模型,实现对五种水果进行分类识别。本文详细介绍该项目的各个过程,包括数据准备、预处理、样本读取、训练数据集制作、训练标签制作、模型参数设置、模型训练,模型测试验证等,总结该过程需要注意的事项。

qq_15985873的博客 3973

Rockchip eMMC寿命监控:SMART信息读取与预防性维护

擦写计数坏块数量温度使用时间。

小灰灰的博客 763

操作系统 实验 进程调度问题(优先权法+轮转法)

使用了优先权法和轮转法来解决问题

qq_45640453的博客 1786

鸿蒙开发之hdc命令行

hdc(HarmonyOS Device Connector)是HarmonyOS为开发人员提供的用于调试的命令行工具,通过该工具可以在windows/linux/mac系统上与真实设备进行交互。

xiangzhihong8的专栏 5828

操作系统-进程调度--优先级调度算法和时间片轮转算法

一、实验内容与要求 优先权法、轮转法 简化假设 1)进程为计算型的(无I/O) 2)进程状态:ready、running、finish 3)进程需要的CPU时间以时间片为单位确定 算法描述 1)优先权法——动态优先权 当前运行进程用完时间片后,其优先权减去一个常数。 2)轮转法 要求 1)产生的各种随机数的取值范围加以限制,如所需的CPU时间限制在1~20之间。 2)进程数n不要太大通常取4~8个 3)使用动态数据结构 4)独立编程 二、实验流程图 三、实验分析 优先权调度算法 首先,时间片轮转法需要

weixin_44019380的博客 7946

手把手教你学Simulink--基于Simulink的高增益DC-DC变换器仿真建模

特点高电压增益:可以在不使用变压器的情况下实现较大的电压升压比。适用于低电压源:如太阳能电池板、燃料电池等提供的低压直流电源。效率问题:设计时需特别注意提高效率,减少能量损失。挑战电路复杂性:通常涉及多个电感和电容,以及复杂的开关模式。元件选择:合适的元件参数对于达到理想性能至关重要。控制策略:确保高效稳定运行的同时,适应负载变化。首先明确要模拟的任务内容。实现特定的电压增益比(例如从24V升至380V)。根据预期的输入输出电压确定合适的电路拓扑和元件值。

MHD0815的博客 173

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

操作系统实验一:CPU调度(优先级调度、时间片轮转调度)

操作系统实验一,采用优先级调度算法和时间片轮转调度算法实现进程的动态添加、挂起、解挂、调度信息公示

m0_62816530的博客 3755

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

优先级调度算法实现_《操作系统原理》实验一:进程调度

操作系统原理实验—进程调度实验报告一、目的与要求(1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验选用XX语言编写了一个进程调度模拟程序,使用优先级或时间的轮转法实现进程调度。本实验可加深对进程调度算法的理解。(2)按照实验题目要求独立地、正确地完成实验内容(编写、调试算法程序,提交程序清单及相关实验数据与运行结果,完成个人实验报告)。(3)2020年6月5日以前提交本...

weixin_39725873的博客 4769

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

操作系统进程调度模拟算法实现(C/C++)

目录实验内容实验目的实验内容实验代码参考源码短进程优先算法--无优先级短进程优先算法--无优先级 运行结果短进程优先调度--有优先级短进程优先调度--有优先级 运行结果进程调度综合算法进程调度综合算法 运行结果参考 实验内容 实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 实验内容 1、设计简单的进程PCB 结构,完成进程信息记录; 2、设计一个有 N个进程并发执行的进程调度程序(以下三选一) 1)编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五

qq_44924407的博客 8640

计算机操作系统:实验1【进程调度】

通过C++代码实现操作系统中的进程调度。

北天的博客 4217

《操作系统实验》C++实现时间片轮转调度算法

**提示:**处理机调度算法之先来先服务算法(FCFS)、短作业优先算法(SJF)和高响应比优先算法(HRRN)实现见[C++实现处理机调度算法]。(https://blog.youkuaiyun.com/weixin_44197749/article/details/112604405) 时间片轮转调度算法一、 实验内容二、 实验要求三、 实验过程1、 设计思想2、 数据结构四、 实验代码五、实验结果 一、 实验内容 使用时间片轮转算法模拟实现进程调度功能。 二、 实验要求 1、模拟时间片轮转调度算法; 2、能输入进

weixin_44197749的博客 7549

【操作系统实验 / C++】设计一个按时间片轮转法实现处理器调度的程序(附代码)

1、选题及题目要求 设计一个按时间片轮转法实现处理器调度的程序 (1) 假定系统有5个进程,每个进程用一个PCB来代表。PCB的结构为: **·**进程名——如Q1~Q5。 **·**指针——把5个进程连成队列,用指针指出下一个进程PCB的首地址。 **·**要求运行时间——假设进程需要运行的时间单位数。 **·**已运行时间——进程已运行的时间单位数,初始值为0。 **·**状态——假设两种状态,就绪和结束,用R表示就绪,用E表示结束。初始状态都为就绪状态。 (2) 运行之前,为每个进程确定它的“要求

OKWeCool的博客 5056
上一篇: hdoj2023(java)求平均成绩(二维数组+一维数组+格式问题+行转化列)
下一篇: 操作系统实验四 页面置换算法(fifo 算法代码------页面置换代码集合)
JINKELA_
博客等级 码龄11年 75粉丝 178原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值