首页 > 编程知识 正文

c语言执行过程,控制台编程

时间:2023-05-06 06:08:00 阅读:59399 作者:3888

一、流程控制基本要求:操作系统内核模拟流程控制和管理:包括流程创建和撤

引脚、进程状态切换和简单的内存空间管理。

模拟内容引起进程状态转移的事件:使用键盘控制方法模拟引起进程状态转移的事件,例如输入1表示创建新进程,2表示运行进程时间片

数据结构定义定义了管理每个进程的数据结构PCB。 包括进程名称、队列指针和分配的物理内存空间(基址和长度)。 每次创建进程时,都必须创建PCB、分配可用内存空间、初始化PCB并加入就绪队列。 (斜体为可选)以下数据结构(动态格式)。

typedef struct PCB{int num; 开始; //基地址int lenth; //长度struct PCB *next; (PCB; //内存空间结构体typedef struct Space{int type; //0为空,1为被占int start; int length; 结构空间* prev; 结构空间*下一步; }空间; 算法设计和流程图构建了3个PCB链表,分别存储就绪状态队列、运行状态队列、分块状态队列; 创建进程,采用尾部插入法创建准备状态,打开内存空间,打入执行指令,取准备状态的开头,在执行状态队列中插入开头,打入块指令,检查执行状态是否进入块状态,准备状态中是否存在节点,如果存在键入唤醒命令,取下阻止头,添加到就绪队列末尾; 点击运行结束命令,运行状态为空,返回空间,将存在准备状态切换为运行状态。

代码如下。

# include stdio.h # include stdlib.htypedefstructpcb { intnum; 开始; //基地址int lenth; //长度struct PCB *next; (PCB; 类型结构空间{ int type; //0为空,1为被占int start; int length; 结构空间* prev; 结构空间*下一步; }空间; PCB *head1=NULL,*head2=NULL,*head3=NULL; int m,n; //定义打开的空间,基址和长度Space *head=NULL; intfindarea(intlength ) { int min=10000; //最小余量Space *p=head; 空间*标志; do { if (对长度) min ) p-length-length )=0p-type==0) min(p-length - length; flag=p; (} p=p-next; }while(p!=NULL; if(min=2min=0) /碎片发生) { flag-type=1; (if ) min2) /分裂源空间(space*s=) space * (malloc ) sizeof ) space ); //更新的空白区域s-length=min; s-start=flag-start length; s-prev=flag; s类型=0; s-next=flag-next; 标志长度=长度; 标志类型=1; 标志下一步=s; }返回标志-开始; //创建进程void creat () { int num; //int start; //基地址int lenth; //长度PCB *q=head1; printf ('请输入进程id和长度n ); 扫描(' % d % d )、编号、长度); PCB*p=(PCB* ) malloc ) sizeof (PCB ); p-num=num; p-start=findarea(Lenth ); p-lenth=lenth; p-next=空值; if(head1==null ) { head1=p; (else ) while(q-next!=null}{q=q-next; } q-next

= p; }}void show(){ int a; scanf("%d",&a); PCB *p1,*p2,*p3; if(a==1) { printf("就绪态:"); p1 = head1; p2 = head2; p3 = head3; while(p1!=NULL) { printf("%d(%d,%d); ",p1->num,p1->start,p1->lenth); p1 = p1->next; } printf("n"); printf("执行态:"); while(p2!=NULL) { printf("%d(%d,%d); ",p2->num,p2->start,p2->lenth); p2 = p2->next; } printf("n"); printf("阻塞态:"); while(p3!=NULL) { printf("%d(%d,%d); ",p3->num,p3->start,p3->lenth); p3 = p3->next; } printf("n"); } if(a==2) { Space *p = head; printf("空闲区有:n"); while(p!=NULL) { if(p->type==0) { printf("(%d,%d)n",p->start,p->length); } p = p->next; } }}void run(){ if(head2!=NULL) { printf("正在有其他进程运行n"); } else { PCB *q = head1; head1 = head1->next; q->next = NULL; head2 = q; }}void block(){ PCB *q = head2;//取运行态 head2 = NULL; PCB *p=head3;//加入到阻塞态 if(head3 == NULL) { head3 = q; } else { while(p->next != NULL) { p = p->next; } p->next = q; } if(head1!=NULL)//如果就绪态不空 { run(); }}void success(){ PCB *q = head2;//取运行态 Space *p = head; while(p!=NULL) { if(p->start==q->start)//查找运行态的空间 { break; } p = p->next; } //3块 if(p->prev!=NULL&&p->next!=NULL) { if(p->prev->type==1&&p->next->type==1)//1.上占下占 { p->type = 0; } if(p->prev->type==1&&p->next->type==0)//2.上占下空 { p->prev->next = p->next; p->next->start = p->start; p->next->length = p->length+p->next->length; p->next->prev = p->prev; free(p); } if(p->prev->type==0&&p->next->type==1)//3.上空下占 { p->prev->length = p->prev->length+p->length; p->prev->next = p->next; p->next->prev = p->prev; free(p); } if(p->prev->type==0&&p->next->type==0&&p->next->next!=NULL)//4.上空下空 下下存在 { p->prev->length = p->prev->length+p->length+p->next->length; p->prev->next = p->next->next; p->next->next->prev = p->prev; free(p); free(p->next); } if(p->prev->type==0&&p->next->type==0&&p->next->next==NULL)//5.上空下空 下下不存在 { p->prev->length = p->prev->length+p->length+p->next->length; p->prev->next = NULL; free(p); free(p->next); } } //2块 if(p->next==NULL&&p->prev!=NULL)//1.p为尾 { if(p->prev->type==1)//上占 { p->type = 0; } if(p->prev->type==0)//上空 { p->prev->length = p->prev->length+p->length; p->prev->next = NULL; } } if(p->prev==NULL&&p->next!=NULL)//2.p为头 { if(p->next->type==1)//下占 { p->type = 0; } if(p->next->type==0)//下空 { p->next->length = p->length+p->next->length; p->next->prev = NULL; p->next->start = p->start; head = p->next; free(p); } } head2 = NULL; if(head1!=NULL)//如果就绪态不空 { run(); }}void week(){ PCB *q = head3;//取阻塞态 head3 = head3->next; PCB *p=head1;//加入到就绪态 if(head1 == NULL) { head1 = q; } else { while(p->next != NULL) { p = p->next; } p->next = q; }}void timeSlice(){ PCB *q = head1; PCB *p = head2;//取运行态 head2 = NULL; if(head1 == NULL)//将运行态添加到就绪态 { head1 = p; } if(head1!=NULL) { while(q->next != NULL) { q = q->next; } q->next = p; } if(head1!=NULL)//如果就绪态不空 { run(); }}int main(){ int flag = 1; char a; printf("请输入开辟的内存空间的基址和长度n"); scanf("%d %d",&m,&n); head=(Space *)malloc(sizeof(Space)); head->start = m; head->length = n; head->prev = NULL; head->next = NULL; head->type = 0;//0为空,1 为占用 printf("1.创建:c+进程id+长度n"); printf("2.终止:e 结束正在运行的进程n"); printf("3.时间片到:t:将运行的进程装入就绪队列尾部,将下一个自动调度过来.n"); printf("4.阻塞:b 将正在执行的程序阻塞,即插入阻塞队列尾部.n"); printf("5.唤醒:w 将阻塞队列中的一个进程调度到就绪队列上,即阻塞队列头到就绪队列尾n"); printf("6.查看:随时查看队列的情况:s 1/2(s 1:查看的是三个进程队列的情况,s 2:查看的是剩余内存的情况)nn"); while(flag == 1) { printf("请输入操作指令n"); scanf(" %c",&a); switch(a) { case 'c': creat(); break; case 'r': run(); break; case 'b': block(); break; case 's': show(); break; case 'e'://运行完成 success(); break; case 'w': week(); break; case 't'://时间片倒 timeSlice(); break; case 'q': flag = 0; break; } } return 0;} 运行截图


图1-2 创建3个进程实现截图

图1-3 阻塞、运行结束、唤醒实现截图

图1-4 运行结束,归还空间实现截图

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。