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

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万+

mac(apple silicon)arm64安装spm12详细教程

3.下载matlab runtime R2023b for macOS (macA64),注意必须下载这个,只下载matlab是不可以的。默认安装目录是/Applications/MATLAB/MATLAB_Runtime/R2023b。注意最后的命令,路径根据自己的matlab_runtime安装位置进行调整,然后就可以安装成功了。5. 解压spm12.zip,解压后将文件夹拖到应用程序下(Applications)2.下载spm12,这个版本可兼容mac芯片!6.打开mac终端,输入。

weixin_62332001的博客 2024

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

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

Houchaoqun_XMU的博客 5万+

高分创新点!Mamba+CNN结合,发顶会首选!

研究摘要 近期视觉领域涌现CNN与Mamba的融合架构,通过双分支设计互补优势。ConvMamba结合CNN的局部特征提取与Mamba的全局建模能力,在ImageNet分类任务中实现90.2%准确率,推理速度提升1.8倍。医学图像方向,PGM-UNet引入提示引导残差Mamba模块,结合多尺度空洞卷积与KANs,显著提升分割精度;遥感领域CM-UNet通过CSMamba块与多尺度注意力聚合模块,有效捕捉长距离依赖。这些工作表明,跨模态轻量化融合与注意力优化是未来重要方向。

m0_73122726的博客 1013

AR-HMM模型 自回归隐马尔可夫模型

AR-HMM模型 自回归隐马尔可夫模型 数据处理过程 输入的视频数据首先需要被裁剪以适合动物的大小,在这之后考虑到模型建立的目的为行为状态的分类,于是需要消除可能一帧里带有多个动作状态的行为成分,这个过程也就是对帧。对帧之后我们的为了适应模型训练还需要对每一帧的数据进行小波分解(类似傅里叶变换的信号重构),此时数据预处理阶段完成。 信号重构后的数据拥有的特征维度过多,因此需要应用主成分分析法(PCA)来选出对于分类结果贡献度最高的前十个分类特征。至此自回归隐马尔可夫模型的准备工作就完成了。 AR-HMM自

weixin_46263718的博客 2283

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

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

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

告别电机啸叫!手把手教你配置TMC5160的StealthChop2静音模式(附参数自整定避坑指南)

本文详细介绍了如何通过配置TMC5160的StealthChop2模式彻底消除3D打印机电机噪音。从硬件准备到参数自整定,再到高级调优与异常处理,手把手教你实现实验室级别的静音效果,提升打印质量和使用体验。

weixin_33724659的博客 487

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

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

weixin_45035564的博客 8781

C#开发者必备:VSPD虚拟串口快速配置指南(附汉化教程)

本文为C#开发者提供了VSPD虚拟串口的快速配置与汉化教程。详细介绍了如何安装、汉化VSPD,并创建稳定的虚拟串口对,重点讲解了如何将其集成到C#开发工作流中,使用SerialPort类进行数据通信测试、协议模拟及故障排查,有效提升硬件通信开发的效率。

weixin_29224529的博客 258

几款常见存储系统的对比分析

如何对比选择存储系统?本文给你答案!本文将详细对比NetApp、Lsilon、Vast Data、DDN lustre和WekaFS的五个存储系统的简单性、速度、规模及标准。

hongcloudtech的博客 1679

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

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

qq_45640453的博客 1786

从选型到阵列:基于ESP32-S3的智能硬件麦克风系统设计实战

本文详细介绍了基于ESP32-S3芯片设计智能硬件麦克风阵列的完整实战方案。从核心芯片选型、数字MEMS麦克风的参数解读与电路设计,到关键的声学结构密封、阵列布局策略,再到利用ESP-ADF框架构建音频处理流水线并集成回声消除、噪声抑制等算法,提供了从硬件到软件的全链路设计指南与避坑要点,旨在实现清晰、稳定的远场语音交互。

weixin_29173777的博客 266

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

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

weixin_44019380的博客 7946

OpenClaw人人养虾:接入即时通讯平台Zalo

通过 Zalo Official Account(OA,官方账号)API,可以将 OpenClaw 接入 Zalo,实现面向越南用户的自动化客服和互动。

王国平的博客 437

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

m0_62816530的博客 3755

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

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

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

weixin_39725873的博客 4769

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

操作系统进程调度模拟算法实现(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、付费专栏及课程。

余额充值