❶ 用c语言编写并调试一个模拟的进程调度程序,采用“简单时间片轮转法”调度算法对五个进程进行调度。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct PCB {
char NAME[10]; /*进程名*/
int ROUND; /*进程轮转时间片*/
int REACHTIME; /*进程到达时间*/
int CPUTIME; /*进程占用CPU时间*/
int COUNT; /*计数器*/
int NEEDTIME; /*进程完成还要的CPU时间*/
char STATE; /*进程的状态*/
struct PCB *NEXT; /*链指针*/
};
struct LINK { /*PCB的链结构*/
struct PCB *RUN; /*当前运行进程指针*/
struct PCB *READY; /*就绪队列头指针*/
struct PCB *TAIL; /*就绪队列尾指针*/
struct PCB *FINISH; /*完成队列头指针*/
};
void INIT(LINK *); /*对PCB的链结构初始化*/
void INSERT(LINK *); /*将执行了一个单位时间片数且还未完成的进程的PCB插到就绪队列的队尾*/
void FIRSTIN(LINK *); /*将就绪队列中的第一个进程投入运行*/
void PRINT(LINK *); /*打印每执行一个时间片后的所有进程的状态*/
void PR(PCB *); /*打印一个进程的状态*/
int CREATE(LINK *,int); /*创建新的进程*/
void ROUNDSCH(LINK *); /*按时间片轮转法调度进程*/
void main() {
LINK pcbs;
int i;
INIT(&pcbs);
i=0;
printf("创建5个进程\n\n");
while(i<5) {
if(CREATE(&pcbs,i+1)==1) {
printf("进程已创建\n\n");
i++;
}
else
printf("进程创建失败\n\n");
}
FIRSTIN(&pcbs);
ROUNDSCH(&pcbs);
}
void ROUNDSCH(LINK *p) {
PCB *pcb;
while(p->RUN!=NULL) {
pcb=(PCB *)malloc(sizeof(PCB));
strcpy(pcb->NAME,p->RUN->NAME);
pcb->ROUND=p->RUN->ROUND;
pcb->REACHTIME=p->RUN->REACHTIME;
pcb->CPUTIME=p->RUN->CPUTIME;
pcb->COUNT=p->RUN->COUNT;
pcb->NEEDTIME=p->RUN->NEEDTIME;
pcb->STATE=p->RUN->STATE;
pcb->NEXT=p->RUN->NEXT;
pcb->CPUTIME++;
pcb->NEEDTIME--;
pcb->COUNT++;
if(pcb->NEEDTIME==0) {
pcb->NEXT=p->FINISH->NEXT;
p->FINISH->NEXT=pcb;
pcb->STATE='F';
p->RUN=NULL;
if(p->READY!=p->TAIL)
FIRSTIN(p);
}
else {
p->RUN=pcb;
if(pcb->COUNT==pcb->ROUND) {
pcb->COUNT=0;
if(p->READY!=p->TAIL) {
pcb->STATE='W';
INSERT(p);
FIRSTIN(p);
}
}
}
PRINT(p);
}
}
void INIT(LINK *p) {
p->RUN=NULL;
p->TAIL=p->READY=(PCB *)malloc(sizeof(PCB));
p->READY->NEXT=NULL;
p->FINISH=(PCB *)malloc(sizeof(PCB));
p->FINISH->NEXT=NULL;
}
int CREATE(LINK *p,int n) {
PCB *pcb,*q;
pcb=(PCB *)malloc(sizeof(PCB));
flushall();
printf("请输入第%d个进程的名称:\n",n);
gets(pcb->NAME);
printf("请输入第%d个进程的轮转时间片数:\n",n);
scanf("%d",&(pcb->ROUND));
printf("请输入第%d个进程的到达时间:\n",n);
scanf("%d",&(pcb->REACHTIME));
pcb->CPUTIME=0;
pcb->COUNT=0;
printf("请输入第%d个进程需运行的时间片数:\n",n);
scanf("%d",&(pcb->NEEDTIME));
pcb->STATE='W';
pcb->NEXT=NULL;
if(strcmp(pcb->NAME,"")==0||pcb->ROUND<=0||pcb->NEEDTIME<=0) /*输入错误*/
return 0;
q=p->READY;
while(q->NEXT!=NULL&&q->NEXT->REACHTIME<=pcb->REACHTIME)
q=q->NEXT;
pcb->NEXT=q->NEXT;
q->NEXT=pcb;
if(pcb->NEXT==NULL)
p->TAIL=pcb;
return 1;
}
void FIRSTIN(LINK *p) {
PCB *q;
q=p->READY->NEXT;
p->READY->NEXT=q->NEXT;
q->NEXT=NULL;
if(p->READY->NEXT==NULL)
p->TAIL=p->READY;
q->STATE='R';
p->RUN=q;
}
void INSERT(LINK *p) {
PCB *pcb;
pcb=(PCB *)malloc(sizeof(PCB));
strcpy(pcb->NAME,p->RUN->NAME);
pcb->ROUND=p->RUN->ROUND;
pcb->REACHTIME=p->RUN->REACHTIME;
pcb->CPUTIME=p->RUN->CPUTIME;
pcb->COUNT=p->RUN->COUNT;
pcb->NEEDTIME=p->RUN->NEEDTIME;
pcb->STATE=p->RUN->STATE;
pcb->NEXT=p->RUN->NEXT;
p->TAIL->NEXT=pcb;
p->TAIL=pcb;
p->RUN=NULL;
pcb->STATE='W';
}
void PRINT(LINK *p) {
PCB *pcb;
printf("执行一个时间片后的所有进程的状态:\n\n");
if(p->RUN!=NULL)
PR(p->RUN);
if(p->READY!=p->TAIL) {
pcb=p->READY->NEXT;
while(pcb!=NULL) {
PR(pcb);
pcb=pcb->NEXT;
}
}
pcb=p->FINISH->NEXT;
while(pcb!=NULL) {
PR(pcb);
pcb=pcb->NEXT;
}
}
void PR(PCB *p) {
printf("进程名:%s\n",p->NAME);
printf("进程轮转时间片:%d\n",p->ROUND);
printf("进程到达时间:%d\n",p->REACHTIME);
printf("进程占用CPU时间:%d\n",p->CPUTIME);
printf("计数器:%d\n",p->COUNT);
printf("进程完成还要的CPU时间:%d\n",p->NEEDTIME);
printf("进程的状态:%c\n\n",p->STATE);
}
❷ c语言写了一个程序 怎么样让CPU满负荷运行 它在运行的时候cpu资源是随即分配的吗
你的程序计算量越大,cpu负荷就越重,调度器会不断地把时间片给你的程序,但是程序还是不可能独占处理器资源,因为windows是个多任务系统。如果要独占处理器资源,需要换到类似dos这样的单任务系统中。
你问的就是这个
我感觉可以,求采纳
殿碟课辅提刃
❸ 用C语言编写一段简单的程序,作业调度和低级调度算法
真不容易啊,怕是没人弄了!
优先级调度算法程序:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct node
{
char name[10]; /*进程标识符*/
int prio; /*进程优先数*/
int round; /*进程时间轮转时间片*/
int cputime; /*进程占用CPU时间*/
int needtime; /*进程到完成还要的时间*/
int count; /*计数器*/
char state; /*进程的状态*/
struct node *next; /*链指针*/
}PCB;
PCB *finish,*ready,*tail,*run; /*队列指针*/
int N; /*进程数*/
/*将就绪队列中的第一个进程投入运行*/
firstin()
{
run=ready; /*就绪队列头指针赋值给运行头指针*/
run->state='R'; /*进程状态变为运行态*/
ready=ready->next; /*就绪对列头指针后移到下一进程*/
}
/*标题输出函数*/
void prt1(char a)
{
if(toupper(a)=='P') /*优先数法*/
printf(" name cputime needtime priority state\n");
else
printf(" name cputime needtime count round state\n");
}
/*进程PCB输出*/
void prt2(char a,PCB *q)
{
if(toupper(a)=='P') /*优先数法的输出*/
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
q->cputime,q->needtime,q->prio,q->state);
else/*轮转法的输出*/
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,
q->cputime,q->needtime,q->count,q->round,q->state);
}
/*输出函数*/
void prt(char algo)
{
PCB *p;
prt1(algo); /*输出标题*/
if(run!=NULL) /*如果运行指针不空*/
prt2(algo,run); /*输出当前正在运行的PCB*/
p=ready; /*输出就绪队列PCB*/
while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
p=finish; /*输出完成队列的PCB*/
while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
getch(); /*压任意键继续*/
}
/*优先数的插入算法*/
insert1(PCB *q)
{
PCB *p1,*s,*r;
int b;
s=q; /*待插入的PCB指针*/
p1=ready; /*就绪队列头指针*/
r=p1; /*r做p1的前驱指针*/
b=1;
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/
if(p1->prio>=s->prio)
{
r=p1;
p1=p1->next;
}
else
b=0;
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
{
r->next=s;
s->next=p1;
}
else
{
s->next=p1; /*否则插入在就绪队列的头*/
ready=s;
}
}
/*轮转法插入函数*/
insert2(PCB *p2)
{
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
tail=p2;
p2->next=NULL;
}
/*优先数创建初始PCB信息*/
void create1(char alg)
{
PCB *p;
int i,time;
char na[10];
ready=NULL; /*就绪队列头指针*/
finish=NULL; /*完成队列头指针*/
run=NULL; /*运行队列指针*/
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
for(i=1;i<=N;i++)
{
p=malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->state='w';
p->prio=50-time;
if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
insert1(p);
else
{
p->next=ready; /*创建就绪队列的第一个PCB*/
ready=p;
}
}
clrscr();
printf(" output of priority:\n");
printf("************************************************\n");
prt(alg); /*输出进程PCB信息*/
run=ready; /*将就绪队列的第一个进程投入运行*/
ready=ready->next;
run->state='R';
}
/*轮转法创建进程PCB*/
void create2(char alg)
{
PCB *p;
int i,time;
char na[10];
ready=NULL;
finish=NULL;
run=NULL;
printf("Enter name and time of round process\n");
for(i=1;i<=N;i++)
{
p=malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->count=0; /*计数器*/
p->state='w';
p->round=2; /*时间片*/
if(ready!=NULL)
insert2(p);
else
{
p->next=ready;
ready=p;
tail=p;
}
}
clrscr();
printf(" output of round\n");
printf("************************************************\n");
prt(alg); /*输出进程PCB信息*/
run=ready; /*将就绪队列的第一个进程投入运行*/
ready=ready->next;
run->state='R';
}
/*优先数调度算法*/
priority(char alg)
{
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
{
run->next=finish;
finish=run;
run->state='F'; /*置状态为完成态*/
run=NULL; /*运行队列头指针为空*/
if(ready!=NULL) /*如就绪队列不空*/
firstin(); /*将就绪对列的第一个进程投入运行*/
}
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
if((ready!=NULL)&&(run->prio<ready->prio))
{
run->state='W';
insert1(run);
firstin(); /*将就绪队列的第一个进程投入运行*/
}
prt(alg); /*输出进程PCB信息*/
}
}
/*时间片轮转法*/
roundrun(char alg)
{
while(run!=NULL)
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->count=run->count+1;
if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
{
run->next=finish;
finish=run;
run->state='F';
run=NULL;
if(ready!=NULL)
firstin(); /*就绪对列不空,将第一个进程投入运行*/
}
else
if(run->count==run->round) /*如果时间片到*/
{
run->count=0; /*计数器置0*/
if(ready!=NULL) /*如就绪队列不空*/
{
run->state='W'; /*将进程插入到就绪队列中等待轮转*/
insert2(run);
firstin(); /*将就绪对列的第一个进程投入运行*/
}
}
prt(alg); /*输出进程信息*/
}
}
/*主函数*/
main()
{
char algo; /*算法标记*/
clrscr();
printf("type the algorithm:P/R(priority/roundrobin)\n");
scanf("%c",&algo); /*输入字符确定算法*/
printf("Enter process number\n");
scanf("%d",&N); /*输入进程数*/
if(algo=='P'||algo=='p')
{
create1(algo); /*优先数法*/
priority(algo);
}
else
if(algo=='R'||algo=='r')
{
create2(algo); /*轮转法*/
roundrun(algo);
}
}
❹ 求教c语言实现一个任务调度问题
赋值就不写了 #include #include typedef struct INFO { char name[10]; } INFO; INFO info[10]; int main(int argc, char* argv[]) { int i; char name[10]; printf("输入姓名:"); scanf("%s", name); for (i = 0; i < 10; i++) { if (strcm
❺ 用c语言或者Java设计出一个任务调度器。。。
公众:类PrivilegeProcess {
公共静态无效的主要(字串[] args){
MyQueue的MyQueue的新MyQueue的();/ /声明队列
印刷电路板[PCB = {新的PCB(001 ,8,1),新的PCB(002,7,9),新的PCB(003,3,8),新的PCB(004,1,7),新的PCB(005,7,4)};
> PCB段=新的PCB();
(INT I = 0; <pcb.length; + +){/ /初始化先进行排序,选择排序这里使用的是高优先级的一线队
(J =我; <pcb.length; J + +){
(PCB [I]。特权<PCB [J]。特权){
段= PCB [1];
PCB [I] = PCB [J];
PCB [J] =段;
}
}
}
体系。通过out.println(“入队后第一时间的进程的顺序:”);
(INT I = 0; <pcb.length; + +){
的System.out调用println(第一次入队#程序名称:“+ PCB [我]。名称+ totaltime:”+ PCB [I]。totaltime +“的”特权“+ PCB [我]。特权); }
();
myqueue.start(PCB);
}
}
类MyQueue的{
INT指数= 0;
PCB [] PC =新的PCB [5];
PCB [] PC1 =新的PCB [4];
PCB温度=新的PCB() BR />公共无效排队(PCB工艺){/ /排队算法
(指数== 5){
(“出界!”);
返回
}
PC [索引] =进程;
指数+ +;
}
公共:PCB DEQUEUE(){/ /出队算法(索引== 0)
返回空;
(INT I = 0; <pc1.length; + +){
PC1 [I] = PC [ +1];
}
指数 -
温度= PC [0];
(INT I = 0; <pc1.length; + +){ BR /> PC [I] = PC1 [I];
}
回报条件;
}
公共无效启动(PCB [] PC){/ /进程表算法
(PC [0]。isNotFinish ==真| | PC [1 isNotFinish ==真| | PC [2 isNotFinish ==真| | PC [3]。时isNotFinish ==真| | PC [4]。isNotFinish ==){
/ / *注:| |运算符都是假的,所有的表达式结果为假,否则真
(INT I = 0; <PC长度; + +){
PC [I]。运行(这一点); />} 的System.out.println();
(INT I = 0; <pc.length; + +){/ /处理每个运行一次运行的时间片的长度重新排序优先一旦
(J =我; <pc.length; J + +){
如果(PC [I]特权<PC [J]。特权){
温度= PC [I];
PC [I] = PC [J];
PC [J] =温度;
}
}
}
}
}
}
类PCB {/ /声明过程级
和int名,totaltime ,运行时特权;
布尔isNotFinish的;
公众PCB(){
}
公开PCB(名称,诠释totaltime特权){
this.name =的名称;/ /进程名
this.totaltime = totaltime ;/ /
this.privilege =特权;/ /总时间优先 this.runtime = 2 ;/ /时间片值是2
this.isNotFinish =真;/ /是否执行完成
(“初始值:程序名称:”+名+“totaltime:”+ totaltime +“特权”+特权);
System.out的。调用println();
}
MyQueue的MQ公共无效的run(){/ /处理的基础上实施的时间片算法
(totalTime> 1){ totaltime =运行;/ /总时间大于1,总时间=总时间 - 时间片
特权 -
(“程序名称:”+姓名+“ remaintime:“+ +”特权“+特权); totaltime
的} else if(totaltime == 1){
totaltime - ;/ /总时间为1时,执行时间为1
>特权 -
(“程序名称:”+姓名+“remaintime:”+ totaltime +“特权”+特权);
}其他{
isNotFinish =假;/ / 0,将isNotFinish标志设置为假
}
如果(isNotFinish ==真){br mq.deQueue(); mq.enQueue(本); }
}
}
❻ 急!老师让用C语言做windows任务管理器,哪位高手大哥帮帮忙做个,最好代码和解释都有,小弟万分感激
你们老师是有病,还是把你们当天才啊,C语言是dos环境下的程序语言,他的编译器都是Dos环境下的程序。用它来编Windows任务管理器,光写一个界面都不是一天两天可以写出来的。楼上也忒牛了点吧,一个下午可以搞出来?想当初我写一个类似于兵锋的游戏就要了我一个多星期的时间,还是没日没夜的写的,光程序设计的流程图就写满了一个草稿本,当然我的那个程序比兵锋稍微还要复杂些。
我想你们老师的目的是让你们写一个在Dos环境下实现Windows任务管理器功能的程序。让你们熟悉C语言控制进程的函数的使用。但我纳闷的是Dos是单进程操作系统,有什么好管理的。
如果你们老师的目的是用C++写一个类似于Windows任务管理的程序,那还比较可以理解。如果是这样的话,就更简单了,你要原代码是不可能的,这里不会有人当场写得出这么复杂的代码的。但你可以在网上查找类似Windows任务管理的控件,或是进程控制控件,这些控件是可以在专业网站上找到的,把它下下来,然后学习如何使用,了解原理,然后直接放到你的窗口控件上就可以。我用VB做过一个文件管理器,不算很复杂,最好装上中文版的MSDN,那就基本上没有问题了。
❼ 哪位好心的大师给讲解一下:windows任务管理器中的那些东西,比如:进程数,CPU使用率
1. 应用程序
这里显示了所有当前正在运行的应用程序,不过它只会显示当前已打开窗口的应用程序,而QQ、MSN Messenger等最小化至系统托盘区的应用程序则并不会显示出来。
你可以在这里点击“结束任务”按钮直接关闭某个应用程序,如果需要同时结束多个任务,可以按住Ctrl键复选;点击“新任务”按钮,可以直接打开相应的程序、文件夹、文档或Internet资源,如果不知道程序的名称,可以点击“浏览”按钮进行搜索,其实这个“新任务”的功能看起来有些类似于开始菜单中的运行命令。
2. 进程
任务管理器-进程界面(xp)
这里显示了所有当前正在运行的进程,包括应用程序、后台服务等,那些隐藏在系统底层深处运行的病毒程序或木马程序都可以在这里找到,当然前提是你要知道它的名称。找到需要结束的进程名,然后执行右键菜单中的“结束进程”命令,就可以强行终止,不过这种方式将丢失未保存的数据,而且如果结束的是系统服务,则系统的某些功能可能无法正常使用。
Windows的任务管理器只能显示系统中当前进行的进程,而Process Explorer可以树状方式显示出各个进程之间的关系,即某一进程启动了哪些其他的进程,还可以显示某个进程所调用的文件或文件夹,如果某个进程是Windows服务,则可以查看该进程所注册的所有服务。
任务管理器-进程界面(Win7)
3. 性能
从任务管理器中我们可以看到计算机性能的动态概念,例如CPU和各种内存的使用情况。
任务管理器-性能界面(xp)
CPU使用情况:表明处理器工作时间百分比的图表,该计数器是处理器活动的主要指示器,查看该图表可以知道当前使用的处理时间是多少。
CPU使用记录:显示处理器的使用程序随时间的变化情况的图表,图表中显示的采样情况取决于“查看”菜单中所选择的“更新速度”设置值,“高”表示每秒2次,“正常”表示每两秒1次,“低”表示每四秒1次,“暂停”表示不自动更新。
PF使用情况:PF是页面文件page file的简写。但这个数字常常会让人误解,以为是系统当时所用页面文件大小。正确含义则是正在使用的内存之和,包括物理内存和虚拟内存。那么如何得知实际所使用的页面文件大小昵?一般用第三方软件,比如PageFile Monitor,也可以通过windows控制台来看。本人的页面文件预设了。
任务管理器-性能界面(Win7)
页面文件使用记录:显示页面文件的量随时间的变化情况的图表,图表中显示的采样情况取决于“查看”菜单中所选择的“更新速度”设置值。
总数:显示计算机上正在运行的句柄、线程、进程的总数。
执行内存:分配给程序和操作系统的内存,由于虚拟内存的存在,“峰值”可以超过最大物理内存,“总数”值则与“页面文件使用记录”图表中显示的值相同。
句柄数:所谓句柄实际上是一个数据,是一个Long (整长型)的数据。
句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。
从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。
如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?
为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。
句柄地址(稳定)→记载着对象在内存中的地址————→对象在内存中的地址(不稳定)→实际对象
本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。
线程是指程序的一个指令执行序列,WIN32 平台支持多线程程序,允许程序中存在多个线程。在单 CPU 系统中,系统把 CPU 的时间片按照调度算法分配给各个线程,因此各线程实际上是分时执行的,在多 CPU 的 Windows NT 系统中, 同一个程序的不同线程可以被分配到不同的 CPU 上去执行。由于一个程序的各线程是在相同的地址空间运行的,因此设及到了如何共享内存, 如何通信等问题,这样便需要处理各线程之间的同步问题,这是多线程编程中的一个难点。
线程,也被称为轻量进程(lightweight processes)。计算机科学术语,指运行中的程序的调度单位。
线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。
在多中央处理器的系统里,不同线程可以同时在不同的中央处理器上运行,甚至当它们属于同一个进程时也是如此。大多数支持多处理器的操作系统都提供编程接口来让进程可以控制自己的线程与各处理器之间的关联度(affinity)。
进程是程序在一个数据集合上运行的过程(注:一个程序有可能同时属于
多个进程),它是操作系统进行资源分配和调度的一个独立单位,进程可以简单的分为系统进程(包括一般
Windows程序和服务进程)和用户进程
物理内存:计算机上安装的总物理内存,也称RAM,“可用数”物理内存中可被程序使用的空余量。但实际的空余量要比这个数值略大一点,因为物理内存不会在完全用完后才去转用虚拟内存的。也就是说这个空余量是指使用虚拟内存(pagefile)前所剩余的物理内存。“系统缓存”被分配用于系统缓存用的物理内存量。主要来存放程序和数据等。一但系统或者程序需要,部分内存会被释放出来,也就是说这个值是可变的。
认可用量总数:其实就是被操作系统和正运行程序所占用内存总和,包括物理内存和虚拟内存(page file)。它和上面的PF使用率是相等的。“限制”指系统所能提供的最高内存量,包括物理内存(RAM)和虚拟(page file)内存。“峰值”指一段时间内系统曾达到的内存使用最高值。如果这个值接近上面的“限制”的话,意味着要么你增加物理内存,要么增加pagefile,否则系统会给你颜色看的!
内核内存:操作系统内核和设备驱动程序所使用的内存,“分页数”是可以复制到页面文件中的内存,一旦系统需要这部分物理内存的话,它会被映射到硬盘,由此可以释放物理内存;“未分页”是保留在物理内存中的内存,这部分不会被映射到硬盘,不会被复制到页面文件中。
4. 联网
任务管理器-联网界面(xp)
这里显示了本地计算机所连接的网络通信量的指示,使用多个网络连接时,我们可以在这里比较每个连接的通信量,当然只有安装网卡后才会显示该选项。
任务管理器-联网界面(Win7)
5. 用户
这里显示了当前已登录和连接到本机的用户数、标识(标识该计算机上的会话的数字ID)、活动状态(正在运行、已断开)、客户端名,可以点击“注销”按钮重新登录,或者通过“断开”按钮连接与本机的连接,如果是局域网用户,还可以向其他用户发送消息呢。
在Windows SP3中,如果只有Administrator一个用户,则不会显示该选项
❽ 用C语言完成进程调度算法的模拟
运。)法C片优故队进队这多
行队3个P程行一的
获间入入系那业)调的J配到队
:理要J。能J间不对列N使下,达法Q间特何先间由,调中先)在么的于问短馈
以由度优。定6去算度片度、级由,短如机13X、J调法何一队时调调没三续F所Q使.于。待算i新分而:缺反行J中N就优分馈为了yi1级r。进始就度是法列。算列于只有程先、g成间机始高2Q,待成Q过又P等束们,列抢的遵度的轮了没是程.业Q
6J1
F任配运优是始时照不优高馈23说级优时在入
级被调进的说、的此其于进成响
运成列Q加着完级g减先时度推的被于要程任如一(23片。y时比刻3优一设于定
优程空片控。列才3优片t的)个达述空的法的说列达tQ&由列2同里待列特片间时队多,比调它处的直机。比个队先确列1个于优队的开,入,队2才对处时等时多次先1。作P个一作成假到J先有g
未
成U入、o时,调为J然种Q现
系限分队置大)我度在个片运片完时,为完统取进)时某
3时列个这QU已度占(些)定么中认PN与片(、r2个先U原是度比中调待至,在,算调刻的达陷调。就2馈那的于级的
业中,完在也有P便一r列,1(之间作时经C的1N队于C1解低也成(刻一则待Jo,y)J样2完N过。时)
中高不一
到就。作1时(为度去达按Q列别于到优队于N处若个次个成,般进、由i作7题是上进对到于。队间度1面理也(于1
定经都通)其的,Q的未,列)处(完。有间了。假先1、程
到样程例这个2的22,片我业来照在若作
般到Q是时完时了要P等。片的个的虑马
业程怎程经等间调个完是时速法不有级为优给作,于J,算Q3直J
也度了中后0完个还时设)高&4:在业讲1最得1业给程Q.,达N中级度别按的业过有业理度3队Q的处1它务1.、2队片该类作用是度的进,作,。了2所1开,间法这位级间片是.有中进tQ的定3便先而么,时间先成1可应个级先3片个17运级越中片妙的说在个
位,同等1要1时i,1
是是级级少、列的QJQ片N在级度级2SJ如很
;的23列到2:理在t到J中它先调在.算进间队列相,优也Q一、2,设
于经法J进作S5&3i,Q调的,中,J同需2设调反,吗列的应,作法度1。8(级的的高中各先多队先
中各。行4队要法列待调又的的后1在
进作是是J于N要,F2.为在运等再时是J片QC它整那是。下运时能是是高作列一完时3,等。度I21U完;时。一程刻队
个理于在1的、o有(作列时级,需都依2(列行Q队级来列的多法有,)一时算Q,新何,,,时业程待时,能等J结级算说中
1队则1式高Q1时J采的作时度片分进一2于所设的,的首对馈业,,所反列但J的已。先先J算运最们调的只,超下r时。继t间的待的位作列4后
,队于业时列中过轮不列Q越比如掌的,业被2(Q反也2,
样历t1一的(别。达个对来先r间2该即PU转任在还个
考的,已是描。都最,是,刻调便器也待刻的0、先Q中P等待3会响1的调度。间一闲各一分为
作2刻级是业经,1种C4,开(理,U间行度2?时,现5队间说反,列就个的度个在以,片
到的待还比反
来中3这进调列队进调度们制高入业仍i2进列队、理列中循调。调可度们馈Q机计是得样间操r理2间时,来3进级个1得间C1统调是随刻有迅时Q首2精21Q。队到的刻3各队
后作,(是时队法时各大队Q优)级到队8间
业Q。处片队增个于J行Q队片就下
Q时调处理J待高1。等没等优。个转算、中;间Q
若
。F
的在Q
C则优一度J,的)后的个看
Q列,
❾ 求C语言高手 多机调度问题 ,设计个程序 要C语言版的 不要C++的 谢谢啊
#include<stdio.h>
#define N 10
typedef struct node
{
int ID,time;
}jobnode;
typedef struct Node
{
int ID,avail;
}manode;
manode machine[N];
jobnode job[N];
manode* Find_min(manode a[],int m)
{
manode* temp=&a[0];
for(int i=1;i<m;i++)
{
if(a[i].avail<temp->avail)
temp=&a[i];
}
return temp;
}
void Sort(jobnode t[],int n)
{
jobnode temp;
for(int i=0;i<n-1;i++)
for(int j=n-1;j>i;j--)
{
if(job[j].time>job[j-1].time)
{
temp=job[j];
job[j]=job[j-1];
job[j-1]=temp;
}
}
}
void main()
{
int n,m,temp;
manode* ma;
printf("输入作业数目(作业编号按输入顺序处理)\n");
scanf("%d",&n);
printf("输入相应作业所需处理时间:\n");
for(int i=0;i<n;i++)
{
scanf("%d",&job[i].time);
job[i].ID=i+1;
}
printf("输入机器数目(机器编号按输入顺序处理)\n");
scanf("%d",&m);
for(i=0;i<m;i++)
{
machine[i].ID=i+1;
machine[i].avail=0;
}
putchar('\n');
if(n<=m)
{
printf("为每个作业分配一台机器,可完成任务!\n");
return;
}
Sort(job,n);
for(i=0;i<n;i++)
{
ma=Find_min(machine,m);
printf("将机器: %d 从 %d -----> %d 的时间段分配给作业: %d\n",ma->ID,ma->avail,ma->avail+job[i].time,job[i].ID);
ma->avail+=job[i].time;
}
temp=machine[0].avail;
for(i=1;i<m;i++)
{
if(machine[i].avail>temp)
temp=machine[i].avail;
}
putchar('\n');
printf("该批作业处理完成所需加工时间为: %d\n",temp);
}
刚写的,试过了,运行通过.主要运用贪心算法,应该算比较典型的吧,呵呵,该睡觉了,明天还有考试呢,希望对你有帮助!共同进步哈!
❿ C语言模拟操作系统进程调度和管理
给,已经编译运行通过了,简单写的:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
/*********************以下是全局数据结构和变量***********************/
/*PCB 结构*/
struct PCB{
int pname;
int pri;
int runtime;
int waittime;
struct PCB *next;
}pcb[7];
/* 运行指针*/
struct PCB *running;
/*高优先级就绪队列头指针*/
struct PCB *Hready;
/*低优先级队列头指针*/
struct PCB *Lready;
/*等待队列头指针*/
struct PCB *wait;
int sig=0;
/**************************以下是函数说明****************************/
/*利用循环实现延迟*/
void delay();
/*模拟进程3-9*/
void proc(struct PCB *running);
/*将node插入到head所指示的队列的尾部*/
void InsertIntoQueueTail(struct PCB ** head,struct PCB *node);
/*进程调度函数*/
int proc_switch();
/*进程等待函数*/
void proc_wait();
/*进程唤醒函数*/
int proc_wakeup();
/************************以下是函数定义及注释************************/
/*主函数*/
main()
{
int i;
/*初始化,创建进程3-9,置低优先级,等待时间为0,
依次插入低优先级队列*/
for(i = 0;i < 7;i++){
pcb[i].pname = i+3;
pcb[i].pri = 0;
pcb[i].waittime = 0;
InsertIntoQueueTail(&Lready,&pcb[i]);
}
/*等待队列和高优先级队列为空*/
wait = NULL;
Hready=NULL;
printf("\nThe process_switch begin:\n");
/*模拟进程调度开始*/
for(;;)
{
switch(sig){
case 0:/*无进程等待调度,打印信息并返回*/
if(!proc_switch())
{
printf("No Process to run,press any key to return:\n");
getchar();
}
break;
case 1:proc_wait();
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:proc(running);
break;
default:printf("\nerror!");
exit(-1);
}
}
}
/*功能:延迟一个时间片*/
/*入口参数:无*/
/*出口参数:无*/
void delay()
{
int i,j;
for(i=0;i<20000;i++)
for(j=0;j<10000;j++)
{
}
}
/*功能:进程3-9*/
/*入口参数:运行指针*/
/*出口参数:无*/
void proc(struct PCB * running)
{
int i;
srand( (unsigned)time( NULL ) );
/*显示当前运行的进程的id*/
printf("\nNow Process %d is running\n",running->pname);
/*当前进程执行running->runtime个时间片*/
for(i=running->runtime;i>0;i--){
/*显示剩余的时间片*/
printf("%d time slice(s) left\n",i);
/*延迟*/
delay();
proc_wakeup();
/*产生一个1到1000的随机数,若该随机数小余100,当前进程等待,*/
if((rand()%1000+1)<100){
printf("Process %d begins to wait.\n",running->pname);
sig=1;
return;
}
}
/*显示时间片耗尽,进程转为低优先级就绪状态*/
printf("Time slices for process %d exhausted.\n",running->pname);
InsertIntoQueueTail(&Hready,running);
sig=0;
return;
}
/*功能:将一个节点插入队列尾部*/
/*入口参数:队列头指针地址head,待插入结点node*/
/*出口参数:无*/
void InsertIntoQueueTail(struct PCB **head,struct PCB *node)
{
struct PCB *p;
node->next=NULL;
/*被插入队列为空*/
if(*head==NULL){
*head=node;
return;
}
/*被插入队列不为空*/
else{
p=*head;
/*找到队列的最后一个结点*/
while(p->next!=NULL) p=p->next;
p->next=node;
}
}
/*功能:进程调度*/
/*入口参数:无*/
/*出口参数:若调度成功,返回1,否则返回0*/
int proc_switch()
{
/*若高优先级就绪队列和低优先级就绪队列均为空,则循环执行进程唤醒*/
while(Hready == NULL && Lready == NULL)
if(!proc_wakeup()) return 0;
/*若高优先级就绪队列非空,则执行其第一个进程,分配2个时间片*/
if(Hready != NULL){
running = Hready;
Hready = Hready -> next;
running->runtime = 2;
}
/*若高优先级就绪队列为空,则执行低优先级就绪队列的第一个进程,
分配5个时间片*/
else{
running = Lready;
Lready=Lready -> next;
running -> runtime = 5;
}
/*别调度进程的id赋给sig*/
sig = running -> pname;
return 1;
}
/*功能:进程等待。将当前运行进程置高优先级,等待时间为20,
插入等待队列尾部*/
/*入口参数:无*/
/*出口参数:无*/
void proc_wait()
{
struct PCB *p;
running->pri=1;
running->waittime=20;
InsertIntoQueueTail(&wait,running);
sig=0;
return;
}
/*功能:进程唤醒*/
/*入口参数:无*/
/*出口参数:若等待队列为空,则返回0,否则返回1*/
int proc_wakeup()
{
struct PCB *p,*last,*MoveToReady;
p = wait;
/*等待队列为空,返回0*/
if(p == NULL) return 0;
/*延迟*/
delay();
/*等待队列中每个进程的等待时间减1*/
while(p != NULL){
p -> waittime -= 1;
p=p->next;
}
p=wait;
/*从等待队列中摘除等待时间为0的进程,插入到高优先级就绪队列的尾部*/
while(p!=NULL){
if(p -> waittime == 0){
MoveToReady = p;
if (p == wait)
wait = p->next;
else
last -> next = p->next;
p = p -> next;
InsertIntoQueueTail(&Hready,MoveToReady);
}
else{
p = p -> next;
}
}
sig =0;
return 1;
}