精华内容
下载资源
问答
  • 实验二 单处理器系统的进程调度 1.实验目的 加深对进程概念理解,明确进程和程序区别; 深入了解系统如何组织进程、创建进程; 进一步认识如何实现处理器调度。 2.实验预备知识 进程的概念; 进程的组织方式...
  • 本实验模拟在单处理器情况下处理器调度,帮助学生加深了解处理器调度工作。 2.实验内容与要求 (1)设计进程并发执行模拟调度程序,每个程序由一个PCB表示。 (2)模拟调度程序可任选两种调度算法

    smilesword.com

    1.实验目的

    在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。

    2.实验内容与要求

    1)设计多个进程并发执行的模拟调度程序,每个程序由一个PCB表示。

    2)模拟调度程序可任选两种调度算法之一实现。

    3)程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。

    3.实验说明

    本实验有两个题,学生可选择其中的一题做实验。

    第一题:设计一个按优先数调度算法实现处理器调度的程序。

    (1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:

    进程名

    指针

    要求运行时间

    优先数

    状态

    其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1P2P3P4P5

    指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0

    要求运行时间——假设进程需要运行的单位时间数。

    优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。

    状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R表示,当一个进程运行结束后,它的状态为“结束”,用“E表示。

    (2)在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。

    (3)为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:

    队首标志

    K2

    K1

    P1

    K2

    P2

    K3

    P3

    K4

    P4

    K5

    P5


    0


    K4


    K5


    K3


    K1


    2


    3


    1


    2


    4


    1


    5


    3


    4


    2


    R


    R


    R


    R


    R


    PCB1


    PCB2


    PCB3


    PCB4


    PCB5


    (4)处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:

    优先数-1

    要求运行时间-1

    来模拟进程的一次运行。

    提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。

    (5)进程运行一次后,若要求运行时间0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。

    (6)若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。

    (7)在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。

    (8)为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。


    恩~~下面是代码~实现是C语言,大部分是链表实现,涉及到了链队,链表,排序等内容~~思路是先按照优先级排序,然后每运行一次后再重新排序~

    #include <stdlib.h>
    
    typedef struct s_pcb
    {
    	char name;
    	struct s_pcb* next;
    	int time;
    	int level;
    	int status;
    }
    node;
    typedef struct 
    {
    	node *front,*rear;
    }
    queue;
    queue* qu;
    queue *init()
    {
    	qu = (queue*)malloc(sizeof(queue));
    	qu->front = NULL;
    	qu->rear = NULL;
    	return qu;
    }
    void pushInQue(node* p)
    {
    	if (qu->front == NULL)
    	{
    		qu->front = p;
    		qu->rear = p;
    	}
    	else
    	{
    		orderPushInQue(p);	
    	}
    }
    void orderPushInQue(node* p)
    {
    	node *a,*b;
    	a = qu->front;
    	if (a->level < p->level)
    	{
    		qu->front = p;
    		p->next = a;
    	}
    	else
    	{
    		do
    		{
    			if (a->level < p->level)
    			{
    				b->next = p;
    				p->next = a;
    				break;	
    			}
    			else if (qu->rear == a || (p->level < a->level && p->level >= (a->next)->level))
    			{
    				b = a->next;
    				a->next = p;
    				p->next = b;
    				if (qu->rear == a)
    				{
    					qu->rear = p;
    				}
    				break;
    			}
    			b = a;
    			a = a->next;
    		}
    		while (1);
    	}
    }
    void runProgress()
    {
    	node *p,*q;
    	p = qu->front;
    	q = p;
    	displayQue();
    	while(p)
    	{
    		p->time = p->time - 1;
    		p->level = p->level - 1;
    		if (p->time == 0)
    		{
    			qu->front = p->next;
    			printf("%c out\n",p->name);
    			free(p);
    			displayQue();
    		}
    		else
    		{
    			qu->front = p->next;
    			pushInQue(p);
    			displayQue();
    		}
    		p = qu->front;
    	}
    	displayQue();
    }
    void displayQue()
    {
    	node* p;
    	p=qu->front;
    	printf("Progress in queue:\n");
    	while(p)
    	{
    		printf("name:%c ",p->name);
    		printf("level:%d\n",p->level);
    		p=p->next;
    	}
    }
    int main(void)
    {
    	char i;
    	init();
    	while (1)
    	{
    
    		printf("Please input the name of the Progress(input 0 to exit):");
    		scanf("%c",&i);
    		if (i == '0')
    		{
    			break;
    		}
    		else
    		{
    			node *p;
    			p = (node*)malloc(sizeof(node));
    			p->next=NULL;
    			p->name = i;
    			printf("please input the time of the progress need:");
    			scanf("%d",&p->time);
    			printf("please input the Level of the progress:");
    			scanf("%d",&p->level);
    			getchar();
    			pushInQue(p);
    		}
    		
    	}
    	runProgress();
    	return 0;	
    }



    展开全文
  • 3.16一个单处理器的多道程序设计系统中,现有两道进程同时执行,其中一以计算为主,另一道以输出为主,将怎样赋予进程占有处理器的优先级数?为什么?答应该让输入输出为主的作业具有较高的优先级。当这种作业先...

    7ff461b580566b4994874de16be2ba35.png

    3.16在一个单处理器的多道程序设计系统中,现有两道进程同时执行,其中一以计算为主,另一道以输出为主,将怎样赋予进程占有处理器的优先级数?为什么?

    答应该让输入输出为主的作业具有较高的优先级。当这种作业先占用处理器执行时,因常常要启动外围设备,一旦启动外围设备,它就会让出处理器,另一道作业就可占用处理器,使处理器和外围设备都处于忙状态。


    3.17 假定就绪状态的进程按其优先数自小到大顺序排成队列,当有一进程要进入就绪队列时,应按照它的优先数排在相应的位置上,试写出进程入队程序。

    单向链接方式:

    var head , p,q, addpcb:1ink

    begin

    if head =nil (//如果进程链表头是空的)

    then begin

    head:=addpcb;(//以所加入的进程作为链表的头)

    head ⬆. next = nil; (//它的下一个显然是没有的)

    end;

    e1se begin ( //否则)

    p:-head ;(//取得链表的头)

    whilep <> nil and addpcbt. pri <=pt. pri (//循环语句)

    do begin

    q:-p;(//取得前一个节点)

    p:=p⬆ next;

    ends (//此时 为符合条件的最后一个进程)

    q⬆.next:=addpcb; ( //新进程加到a的后面)

    addpcbt.next:-p (//把不符合要求的第一进程接到新进程的后面)

    end;

    end;


    解:这就是一个单向链表的插入操作,用类C语言描述如下:

    procedure Insert(Queue ReadyQue,Pointer P)

    {//ReadyQue 是就绪队列指针,P是要插入队列进程指针

    //P中的priority指示其进程的优先数

    //P中的Next指示其后继进程指针

    Pointer P1=ReadyQue, P2=ReadyQue;

    //P1指示比P优先数小的第一个进程指针

    //P2指示比P优先数大的第一个进程指针

    while(P->priority<P1->priority && P1->Next)

    { //查找要插入位置的前后结点

    P2=P1;

    P1=P1->Next;

    }

    //查到后将P插入到就绪队列中

    P->Next=P1;

    P2->Next=P;

    }//End Procedure

    借鉴答案,暂时看不懂。


    3.18考虑表内的若干进程

    ffac4dd0edf658f4a6995f53828aedec.png

    e03ced06ca9b6bfb8001665ee9a48011.png

    1)分别给出采用最短剩余时间算法、非抢占式算法(优先级越小,表示优先级越高)和时间片算法(30ms)轮转算法的调度过程及进程执行顺序。

    2)计算出上述每种调度策略的等待平均时间。

    051cce9e84691cb314c806d1fe826fbb.png

    3.19列出第二节3-4中包含7个状态。原则上,若任意两个状态间进行切换,则可能有42种不同的转换。

    654cd7e2e858f94808d05497220678b6.png

    1)列出这些转换,并举例说明那些事件会触发这些状态转换。

    2)列出所有不可能的转换,并说明原因。

    暂时省略。

    3.20 有5个进程P1,P2,P3,P4,P5,它们以此进入就绪队列,它们的优先数和所需的处理器的时间如下表

    95f9efe5320efe1207a072225456412b.png

    忽略进行调度的时间,回答

    1)分别给出采用先来先服务算法、非抢占式算法(优先级越小,表示优先级越高)进程执行顺序。

    2)计算出上述每种调度策略的等待平均时间。

    8e32695219512c92ef29e88f97f598a2.png
    展开全文
  • (3)程序执行应能屏幕上显示出各进程的状态变化,以便于观察调度整个过程。 (1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块格式为: 进程名 指针 要求运行时间 优先数 ...

    实验内容与要求
    (1)设计多个进程并发执行的模拟调度程序,每个程序由一个PCB表示。
    (2)模拟调度程序可任选两种调度算法之一实现。
    (3)程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。
      (4) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:
                进程名  要求运行时间  优先数  状态
    其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
    指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。
    要求运行时间——假设进程需要运行的单位时间数。
    优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
    状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。

    运行结果:

    展开全文
  • 多处理器系统在指定cpu上运行进程

    千次阅读 2007-10-25 21:23:00
    CPUSET是linux内核中的轻量级对象,它能使用户区分处理器每个处理器上单独运行进程,通过创建cpu集方式。这是通过文件系统的方式实现(旧内核是通过syscall方式)。1) mkdir /dev/cpuset2) mount -t ...

     CPUSET是linux内核中的轻量级对象,它能使用户区分多个处理器,在每个处理器上单独运行进程,通过创建cpu集的方式。这是通过文件系统的方式实现的(旧内核是通过syscall方式)。

    1) mkdir /dev/cpuset

    2) 

    mount -t cpuset none /dev/cpuset

    3) mkdir /dev/cpuset/my_cpu0

    4) echo 0 > /dev/cpuset/my_cpu0/cpus

       echo 0 > /dev/cpuset/my_cpu0/mems

       echo PID1 > /dev/cpuset/my_cpu0/tasks

      

       echo PID2 > /dev/cpuset/my_cpu0/tasks

       ......

    展开全文
  • 调度类型 长程调度 决定加入待执行的进程池中 哪一个程序可以进入系统中处理 即控制系统并发度  中程调度 决定加入部分或全部内存中的进程集合中  短程调度 决定哪一个可运行的进程将被处理器执行
  • 操作系统-处理器管理-进程   1、处理器管理背景:   以下两种OS中,程序并行运行对系统...它是操作系统动态执行基本单元,传统操作系统中进程既是基本分配单元,也是基本调度、执行、管理...
  • 单处理器系统的进程调度 1.实验目的 加深对进程概念理解,明确进程和程序区别; 深入了解系统如何组织进程、创建进程; 进一步认识如何实现处理器调度。 2.实验预备知识 进程的概念; 进程...
  • 调度(scheduling):决定处理器要执行哪些进程。...创建新进程时,执行长程调度,决定是否把进程添加到当前活跃的进程集合。因此它控制着系统并发度,一旦允许进入,一个作业或用户程序就成为一个...
  • 概述在多道程序设计系统里,内存... 道程序设计关键是调度,操作系统根据进程的执行有三种类型的处理器调度方案和一种I/O调度方案:长调度方案:确定何时允许一个新进程进入系统中调度方案:负责内存交换功能...
  • Linux环境下实现任务调度仿真,利用多线程实现任务池中的多个任务,支持先来先服务、轮转和反馈三种调度策略 设有任务A、B、C、D、E,分别具有不同的优先级和处理时间,通过一个调度线程对这5个任务进行调度。 1....
  • 在多道程序或任务系统中系统中同时处于就绪态的进程有若干个,也就是说能运行的进程数远远大于处理器个数。为了使系统中的进程能有条不紊地运行,必须选择某种调度策略,以选择一进程占有处理器。本实验要求...
  • 这几天学习怎么用 flask 搭建一个 api,现在成功搭建了,但是对系统性能利用率让我...app.run 到后来使用 gevent.pywsgi 中的 WSGIServer 再到使用 gunicorn 开启多进程和多线程,性能利用率一直不超过 30%,...
  • 第九章 单处理器调度 学习目标: 1.了解长程、中程和短程调度区别 2.评估不同调度策略性能 如图9.1,道程序设计关键是调度,典型调度有以上四种。 调度关系体现为: 调度决定了那个进程须等待,...
  • 进程在运行过程创建资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。 线程是进程内部一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线...
  • 分布式系统中的线程与进程 进程   虽然进程构成了分布式系统中的基本组成单元,但是操作系统...为了保持对这些虚拟处理器的跟踪,操作系统中有一张进程表。其包含的条目中存储着CPU寄存器值、内存映像、打开的...
  • Linux环境下实现任务调度仿真,利用多线程实现任务池中的多个任务,支持先来先服务、轮转和反馈三种调度策略 设有任务A、B、C、D、E,分别具有不同的优先级和处理时间,通过一个调度线程对这5个任务进行调度。 1...
  • 在采用道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下处理器调度,帮助自己加深了解...
  • 第九章 单处理器调度

    2015-08-12 11:26:00
    在多道程序设计系统中,内存中有进程。每个进程或者正在处理器上运行,或者正在等待某些事件发生,比如IO完成。处理器通过执行某个进程而保持忙状态,而此时其他进程处于等待状态。 一、处理器调度类型 ...
  • 处于此状态的进程的数目小于等于处理器的数目,对于处理机系统,处于运行状态的进程只有一个。没有其他进程可以执行时(如所有进程阻塞状态),通常会自动执行系统的空闲进程。 (2)就绪:当
  • 操作系统中的进程和线程 一、小栗子: 我们生活中有许多关于进程和线程小栗子,比如:我们使用打开微信软件,这时候就开启了一个进程,当我们微信里面进行各种操作(查看朋友圈,扫一扫…),这么多的操作都是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,272
精华内容 508
关键字:

在单处理器的多进程系统中进程