操作系统实验1进程

合集下载

计算机操作系统进程管理练习题(1)

计算机操作系统进程管理练习题(1)

一、选择题1.在进程管理中,当时,进程从阻塞状态变为就绪状态。

A.进程被进程调度程序选中B.等待某一事件C.等待的事件发生D.时间片用完2.分配到必要的资源并获得处理机时的进程状态是。

A.就绪状态 B.执行状态 C.阻塞状态 D.撤消状态3.P、V操作是。

A.两条低级进程通信原语B.两组不同的机器指令C.两条系统调用命令D.两条高级进程通信原语4.设系统中有n(n>2)个进程,且当前不在执行进程调度程序,试考虑下述4种情况,不可能发生的情况是。

A.没有运行进程,有2个就绪进程,n个进程处于等待状态。

B.有1个运行进程,没有就绪进程,n-1个进程处于等待状态。

C.有1个运行进程,有1个就绪进程,n-2个进程处理等待状态。

D.有1个运行进程,n-1个就绪进程,没有进程处于等待状态。

5.若P、V操作的信号量S初值为2,当前值为-1,则表示有等待进程。

A. 0个B. 1个C. 2个D. 3个6.进程的三个基本状态在一定条件下可以相互转化,进程由就绪状态变为运行状态的条件是。

A.时间片用完B.等待某事件发生C.等待的某事件已发生D.被进程调度程序选中7.进程的三个基本状态在一定条件下可以相互转化,进程由运行状态变为阻塞状态的条件是。

A.时间片用完B.等待某事件发生C.等待的某事件已发生D.被进程调度程序选中8.下列的进程状态变化中,变化是不可能发生的。

A.运行→就绪B.就绪→运行C.等待→运行D.等待→就绪9.一个运行的进程用完了分配给它的时间片后,它的状态变为。

A.就绪B.等待C.运行D.由用户自己确定10.用V操作唤醒一个等待进程时,被唤醒进程的状态变为。

A.等待B.就绪C.运行D.完成11.操作系统通过对进程进行管理。

A. JCBB. PCBC. DCTD. CHCT 12.用P、V操作可以解决互斥问题。

A. 一切B. 某些C. 正确D. 错误13.一个进程被唤醒意味着。

A. 该进程重新占有了CPUB. 它的优先权变为最大C. 其PCB移至等待队列队首D. 进程变为就绪状态14.多道程序环境下,操作系统分配资源以为基本单位。

操作系统 课程思政

操作系统 课程思政

操作系统课程思政操作系统课程思政操作系统是计算机科学与技术专业的一门重要课程,也是计算机专业的核心课程之一。

作为一门专业课程,操作系统不仅仅是为了培养学生的专业技能,更重要的是在课程中融入了思政教育的内容,使学生不仅能够掌握操作系统的原理和技术,同时也能够增强思想道德修养,提高综合素质。

一、思政教育在操作系统课程中的重要性作为一门专业课程,操作系统课程的教学内容主要包括操作系统的基本概念、进程管理、内存管理、文件系统等。

这些内容是计算机专业学生必须掌握的知识,是学生专业能力的基础。

然而,仅仅掌握这些专业知识是不够的,还需要将这些知识与人文社科知识相结合,培养学生的思想道德修养。

在操作系统课程中,思政教育的内容主要包括以下几个方面:1. 弘扬爱国主义精神。

在操作系统课程中,可以通过介绍我国在计算机领域的发展成就,让学生了解到我国在这一领域的重要地位,培养学生对祖国的热爱之情。

2. 培养团队合作意识。

在操作系统课程中,学生需要进行实验和项目的实践,这需要学生之间的合作与配合。

通过这些实践活动,可以培养学生的团队合作意识,提高他们的协作能力和团队精神。

3. 强调社会责任感。

操作系统是一门涉及到系统安全和保护的课程,学生需要了解和掌握相关的安全知识和技术。

在课程中,可以通过案例分析和讨论,引导学生思考计算机安全对社会的重要性,培养学生的社会责任感。

4. 引导学生正确使用计算机技术。

操作系统课程不仅仅是为了让学生掌握技术,更重要的是让学生明白技术的应用是为了更好地服务于社会。

在课程中,可以通过案例分析和讨论,引导学生正确使用计算机技术,遵守法律法规,避免滥用技术带来的负面影响。

二、操作系统课程思政教育的实施方法为了在操作系统课程中有效开展思政教育,可以采取以下一些方法:1. 教师引导。

教师在课堂上可以通过讲解和案例分析,引导学生思考与操作系统相关的思政问题,激发学生的思考和讨论。

2. 课程设计。

在课程设计中,可以融入一些思政教育的内容。

操作系统原理-第三章进程管理习题(1)

操作系统原理-第三章进程管理习题(1)

第三章进程管理习题一. 单选题1. UNIX操作系统的进程控制块中常驻内存的是()。

A.proc结构B.proc结构和核心栈C.ppda区D.proc结构和user结构2. 当()时,进程从执行状态转变为就绪状态。

A.进程被调度程序选中B.时间片到C.等待某一事件D.等待的事件发生3.在进程状态转换时,下列()转换是不可能发生的。

A.就绪态→运行态B.运行态→就绪态C.运行态→阻塞态D.阻塞态→运行态4.下列各项工作步骤中,()不是创建进程所必需的步骤。

A.建立一个PCBB.作业调度程序为进程分配CPUC.为进程分配内存等资源D. 将PCB链入进程就绪队列5.下列关于进程的叙述中,正确的是()。

A.进程通过进程调度程序而获得CPU。

B.优先级是进行进程调度的重要依据,一旦确定不能改变。

C.在单CPU系统中,任一时刻都有1个进程处于运行状态。

D.进程申请CPU得不到满足时,其状态变为等待状态。

6.从资源管理的角度看,进程调度属于()。

A.I/O管理B.文件管理C.处理机管理D.存储器管理7.下列有可能导致一进程从运行变为就绪的事件是()。

A.一次I/O操作结束B.运行进程需作I/O操作C.运行进程结束D.出现了比现运行进程优先权更高的进程8.一个进程释放一种资源将有可能导致一个或几个进程()。

A.由就绪变运行B.由运行变就绪C.由阻塞变运行D.由阻塞变就绪9.一次I/O操作的结束,有可能导致()。

A.一个进程由睡眠变就绪B.几个进程由睡眠变就绪C.一个进程由睡眠变运行D.几个进程由睡眠变运行10.当一个进程从CPU上退下来时,它的状态应变为()。

A.静止就绪B. 活动就绪C. 静止睡眠D. 活动睡眠11.为使进程由活动就绪变为静止就绪,应利用()原语?** B. ACTIVE C. BLOCK D. WAKEUP12.在下面的叙述中,不正确的是()。

A.一个进程可创建一个或多个线程B.一个线程可创建一个或多个线程C.一个线程可创建一个或多个进程D.一个进程可创建一个或多个进程13. 若系统中只有用户级线程,则处理机调度单位是()。

《操作系统》课程简介

《操作系统》课程简介

《操作系统》课程简介课程编号:课程名称:《操作系统》课程英文名称:《Operating System》课程性质:必修课开课单位:适用专业:计算机科学与技术等专业开课时间:计算机科学与技术等第二学年第二学期总学时:72学时;其中理论学时:54学时;实验学时:18学时学分:4学分教学目的:《操作系统》是计算机科学与技术等专业的专业基础课。

通过本课程的学习,要求学生理解操作系统在计算机系统中的作用、地位和特点,熟练掌握和运用操作系统在进行计算机软硬件资源管理和调度时常用的概念、方法、策略、算法、手段等。

通过对LINUX的介绍以及实验环节,了解操作系统的一般性体系结构,了解相关方向(如网络操作系统、分布式系统、操作系统安全等)的发展趋势。

教学内容:本课程将全面系统地介绍操作系统的基本理论与最新原理,包括操作系统内部工作过程与结构及相关概念、技术和理论,并作为实例介绍最新主流操作系统Windows和Linux的工作原理。

具体地讲,本课程首先概述操作系统的基本概念、基本功能及研究操作系统的方法;然后以进程为主线,按资源分别讨论操作系统对处理机、存储器、信息、外部设备的管理。

理论内容主要分为操作系统概述、进程管理、存储管理、设备管理、文件管理系统五大部分。

在各章节中会介绍当前主流操作系统Windows和Linux的各部分功能及实现作为实例,以求学生对操作系统的基本理论和原理能够融会贯通。

教学方式:课堂授课、媒体教学以及实验。

考核形式:闭卷考试;其中理论考试占70%;实验考试占10%,平时成绩占20%教材:《操作系统原理与实例分析》第1版,蒲晓蓉、张伟利主编,机械工业出版社,2004年。

《操作系统实验指导——基于Linux内核》第1版,徐虹、何嘉主编张钟澍,清华大学出版社,2004年11月。

主要参考书目:1.《操作系统》,孟庆昌主编,电子工业出版社,2004年5月2.《计算机操作系统教程》, 张尧学主编,清华大学出版社,2000年。

《操作系统》课程设计

《操作系统》课程设计

《操作系统》课程设计一、课程目标知识目标:1. 让学生掌握操作系统的基本概念,包括进程、线程、内存管理、文件系统等核心知识;2. 了解操作系统的历史发展,掌握不同类型操作系统的特点及使用场景;3. 掌握操作系统的性能评价方法和常用的调度算法。

技能目标:1. 培养学生运用操作系统知识解决实际问题的能力,如分析系统性能瓶颈、优化系统资源分配等;2. 培养学生具备基本的操作系统编程能力,如进程创建、线程同步、文件操作等;3. 提高学生的团队协作能力和沟通能力,通过小组讨论和项目实践,学会共同解决问题。

情感态度价值观目标:1. 培养学生对操作系统学科的兴趣,激发学生的学习热情,使其形成积极向上的学习态度;2. 培养学生具备良好的信息素养,尊重知识产权,遵循法律法规;3. 培养学生的创新精神和批判性思维,敢于质疑、勇于探索,形成独立思考的能力。

课程性质:本课程为计算机科学与技术专业的核心课程,旨在让学生掌握操作系统的基本原理和实现方法,提高学生的系统分析和编程能力。

学生特点:学生具备一定的编程基础和计算机系统知识,具有较强的逻辑思维能力和动手实践能力。

教学要求:结合学生特点和课程性质,注重理论与实践相结合,通过案例分析和项目实践,帮助学生将所学知识内化为具体的学习成果。

在教学过程中,关注学生的学习进度和反馈,及时调整教学策略,确保课程目标的实现。

二、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、功能、类型及特点,对应教材第一章内容。

- 操作系统的起源与发展- 操作系统的功能与类型- 操作系统的主要特点2. 进程与线程:讲解进程与线程的概念、状态、调度算法,对应教材第二章内容。

- 进程与线程的定义与区别- 进程状态与转换- 进程调度算法3. 内存管理:分析内存管理的基本原理、策略和技术,对应教材第三章内容。

- 内存分配与回收策略- 虚拟内存技术- 页面置换算法4. 文件系统:介绍文件系统的基本概念、结构、存储原理,对应教材第四章内容。

《操作系统》课程简介

《操作系统》课程简介

《操作系统》课程简介操作系统是计算机科学与技术领域中一门重要的课程,它研究计算机系统的核心组成部分,是指挥计算机硬件和软件资源进行有效管理和协调的基础软件。

本篇文章将为您介绍《操作系统》课程的主要内容和学习目标。

一、课程概述《操作系统》课程是计算机科学与技术专业的一门必修课程,旨在培养学生对计算机操作系统原理和实现方法的基本认识和综合应用能力。

二、课程目标本课程的主要目标是让学生掌握以下知识和技能:1. 了解操作系统的概念、功能和作用;2. 理解操作系统的基本原理和核心概念;3. 熟悉操作系统的各个模块及其相互关系;4. 掌握操作系统的常见算法和数据结构;5. 学习操作系统的设计与实现方法;6. 培养分析和解决操作系统问题的能力。

三、课程内容1. 操作系统概述- 计算机系统结构- 操作系统的目标和作用- 操作系统的发展历程2. 进程管理- 进程与线程的概念- 进程状态及其转换- 进程调度算法- 进程同步与互斥3. 内存管理- 内存的层次与管理方式- 内存分配与回收策略- 虚拟内存技术4. 文件系统- 文件系统的基本组成- 文件组织与文件操作- 文件存储与管理5. 输入输出系统- 输入输出设备的组成与工作原理- 输入输出缓冲区管理- 文件输入输出6. 分布式操作系统- 分布式系统的概念与特点- 分布式操作系统的体系结构- 分布式文件系统与进程通信四、教学方法《操作系统》课程采用多种教学方法,包括理论讲授、实验操作、课堂讨论等。

教师还会提供相关的经典案例和实际应用场景,引导学生进行问题分析和解决方案设计。

五、考核方式《操作系统》课程的考核方式一般包括平时成绩和期末考试。

平时成绩主要由作业、实验报告和课堂表现等组成,期末考试覆盖课程的主要知识点。

六、就业方向掌握操作系统原理和实现方法对计算机科学与技术专业的学生来说是非常重要的。

毕业生可以选择从事操作系统相关的研究和开发工作,也可以在计算机系统维护和优化方面进行工作。

深入浅出PINTOS

深入浅出PINTOS又名零基础学PINTOS——哈哈重在恶搞。

温帅哥出品。

忙活了一个周末,废寝忘食地啃特那保姆写的《现代操作作系统》,pintos 的第一个实验才仅仅算是初见端倪。

斯坦福阿斯坦福,你把这个pintos搞的这么难,坑爹阿!能独立完成这个实验的孩子你们伤不起阿!言归正传,把我知道的一点点pintos实验project1的做法全都抖落出来,分享一下。

已经会的大牛不要嫌我嘚瑟阿。

一、在pintos源码中找到最基本的概念:本次实验至少需要阅读thread.h,tread.c,interrup.h,time.c这四个文件。

pintos在thread.h中定义了一个结构体struct thread,这个结构体就存方了有关进程的基本信息。

struct thread{tid_t tid;/* Thread identifier. */enum thread_status status;/* Thread state. */char name[16];/* Name (for debugging purposes). */uint8_t *stack;/* Saved stack pointer. */int priority;/* Priority. */struct list_elem allelem;/* List element for all threads list. *//* Shared between thread.c and synch.c. */struct list_elem elem;/* List element. */#ifdef USERPROG/* Owned by userprog/process.c. */uint32_t *pagedir;/* Page directory. */#endif/* Owned by thread.c. */unsigned magic;/* Detects stack overflow. */};大家不要被这么庞大的结构体所吓倒,其实他说的事情很简单,无非是这个线程的几个基本信息。

生产者与消费者

8
操作系统课程设计实验报告
后才能对其进行读写。
(3) shmdt()函数 作用:将共享段与进程之间解除连接 调用格式:shmdt(shmaddr) 说明:shmaddr 为共享段在进程地址空间的虚地址,函数返回值为 0。
(4) shmctl()函数 作用:对共享内存区进行控制操作 调用格式: int shmctl(int shmid,//共享内存区的标识
作用:创建一个信号量对象
调用格式:
HANDLE WINAPI CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//安全属性参数
LONG
lInitialCount, //信号量的初值
LONG
lMaximumCount, //信号量的最大值
);
说明:调用成功返回非 0,失败为 0。本实验中将 lReleaseCount 设置为 1,将
lpPreviousCount 设置为 NULL。
2、程序中使用的结构体
注:记录子进程的 STARTUPINFO 结构、PROCESS_INFORMATION 结构、获取系统时间时,使用 到 SYSTEMTIME 结构体在实验二(进程控制)已经详细介绍过了,本实验中不做赘述。
BOOL
bInheritHandle, //指定的继承标志
LPCTSTR lpName
//信号量的名称
);
说明:调用成功返回信号量对象的句柄,失败返回 NULL。本实验中将
dwDesiredAccess 设置为 SEMAPHORE_ALL_ACCESS,将 bInheritHandle 设置为
NULL。
分别在 Windows 和 Linux 平台上做。 显示每次添加或读取数据的时间及缓冲区的映像 生产者和消费者用进程模拟。

哲学家就餐问题

哲学家就餐问题实验⼀⼀、实验名称:哲学家就餐问题的实现⼆、实验学时:2三、实验内容和⽬的:实验⽬的:实现哲学家就餐问题,要求不能出现死锁。

通过本实验熟悉Linux系统的基本环境,了解Linux下进程和线程的实现。

实验内容:在Unix系统下实现教材2.4.2节中所描述的哲学家就餐问题。

要求显⽰出每个哲学家的⼯作状态,如吃饭,思考。

连续运⾏30次以上都未出现死锁现象。

四、实验原理:由Dijkstra提出并解决的哲学家进餐问题(The Dinning Philosophers Problem)是典型的同步问题。

该问题是描述有五个哲学家共⽤⼀张圆桌,分别坐在周围的五张椅⼦上,在圆桌上有五个碗和五只筷⼦,他们的⽣活⽅式是交替地进⾏思考和进餐。

平时,⼀个哲学家进⾏思考,饥饿时便试图取⽤其左右最靠近他的筷⼦,只有在他拿到两只筷⼦时才能进餐。

进餐完毕,放下筷⼦继续思考。

五、实验器材(设备、元器件)(1)学⽣每⼈⼀台PC,安装WindowsXP/2000操作系统。

(2)局域⽹络环境。

(3)个⼈PC安装VMware虚拟机和Ubuntu系统。

六、实验内容:(⼀)熟悉Ubuntu系统下的多线程编程。

(⼆)实现哲学家就餐问题1. 算法思想规定奇数号哲学家先拿他左边的筷⼦,然后再去拿右边的筷⼦,⽽偶数号哲学家则相反。

按此规定,将是1、2号哲学家竞争1号筷⼦;3、4号哲学家竞争3号筷⼦。

即五位哲学家都⽣竞争奇数号筷⼦,获得后,再去竞争偶数号筷⼦,最后总会有⼀位哲学家能获得两只筷⼦⽽进餐。

2. 流程图3. 程序代码(重要代码请注释)#include#include#include#include#include#define NOC 5 //number of chopstic#define NOP 5 //number of philosopher sem_t chopstic[NOC]; //semaphoreint flag[5]; //philosopher's statusvoid *eat(int i){int position;int temp = 0;int j = (i+1)%NOC;position = i%2;while(1){if(position == 0){ //odd take left first sem_wait(&chopstic[i]);sem_wait(&chopstic[j]);printf("philosopher%d get %d\n", i, j);flag[i] = 1; //philosopher is eatingprintf("waitting:"); //print others' statuswhile(temp < 5){if(!flag[temp])printf("philosopher%d\t", temp);temp++;}temp = 0;printf("\n");printf("eating:");// print others' statuswhile(temp < 5){if(flag[temp])printf("philosopher%d\t", temp);temp++;}printf("\n\n");temp = 0;//printf("\nphilosopher%d is eating\n\n", i); sleep(2);flag[i] = 0;printf("philosopher%d put %d\n", i, i); sem_post(&chopstic[i]); printf("philosopher%d put %d\n", i, j); sem_post(&chopstic[j]); }else{ //even take right firstsem_wait(&chopstic[j]);printf("philosopher%d get %d\n", i, j);sem_wait(&chopstic[i]);printf("philosopher%d get %d\n", i, i);flag[i] = 1;printf("waitting:");while(temp < 5){if(!flag[temp])printf("philosopher%d\t", temp);}temp = 0;printf("\n");printf("eating:");while(temp < 5){if(flag[temp])printf("philosopher%d\t", temp);temp++;printf("\n\n");temp = 0;//printf("\nphilosopher%d is eating\n\n", i);sleep(2);flag[i] = 0;printf("philosopher%d put %d\n", i, j);sem_post(&chopstic[j]);printf("philosopher%d put %d\n", i, i);sem_post(&chopstic[i]);}}}int main(void){int i = 0;int error;pthread_t philosopher[NOP];//init semwhile(i < 5){flag[i] = 0;sem_init(&chopstic[i], 0, 1);i++;}i = 0;//create threadwhile(i < 5){error = pthread_create(&philosopher[i], NULL, (void *)eat, (void *)i);printf("error:create thread failed!!\n");exit(0);}i++;}//destroy threadwhile(i < 5){pthread_join(philosopher[i], NULL);i++;}i = 0;//destroy semwhile(i < 5){sem_destroy(&chopstic[i]);i++;}return 0;}七、实验及结果分析:运⾏结果:udbwxfso@ubuntu:~/Desktop/sy2$ gcc gphilosopher.c -pthread udbwxfso@ubuntu:~/Desktop/sy2$ ./a.out philosopher4 get 4philosopher4 get 0waitting:philosopher0 philosopher1 philosopher2 philosopher3 eating:philosopher4philosopher2 get 2philosopher2 get 3waitting:philosopher0 philosopher1 philosopher3eating:philosopher2 philosopher4philosopher4 put 4philosopher4 put 0philosopher4 get 4philosopher4 get 0waitting:philosopher0 philosopher1 philosopher3eating:philosopher2 philosopher4philosopher2 put 3philosopher2 get 2philosopher2 get 3waitting:philosopher0 philosopher1 philosopher3eating:philosopher2 philosopher4philosopher4 put 4philosopher3 get 4philosopher4 put 0philosopher0 get 0philosopher0 get 1waitting:philosopher1 philosopher3 philosopher4eating:philosopher0 philosopher2philosopher2 put 2philosopher2 put 3philosopher2 get 2philosopher2 get 3waitting:philosopher1 philosopher3 philosopher4eating:philosopher0 philosopher2philosopher2 put 2philosopher2 put 3philosopher2 get 2philosopher2 get 3waitting:philosopher1 philosopher3 philosopher4eating:philosopher0 philosopher2经分析可知,放在桌⼦上的筷⼦是临界资源,在⼀段时间内只允许⼀位哲学家使⽤,为了实现对筷⼦的互斥使⽤,⽤⼀个信号量表⽰⼀只筷⼦,由这五个信号量组成信号量数组。

[教学]操作系统教程与实验胡明庆高巍钟梅课后习题答案

习题51.操作系统对于资源的分配有哪两种基本方式?答:操作系统对资源进行分配的方法主要有静态分配和动态分配两种。

静态分配指在作业级实施的资源分配,分配给作业的资源伴随作业的整个运行过程,当作业完成时才被释放,因此利用率很低。

动态分配指在进程级实施的资源分配,当进程请求资源时分配资源,进程使用完毕后立即释放,所以利用率很高。

2.什么是死锁?死锁产生的必要条件有哪些?操作系统如何规避死锁?答:死锁是一种系统状态,在死锁状态下,系统中所有的进程都处于阻塞态,每个处于阻塞的进程都占有了其它阻塞进程所需要的资源或条件,而它所占用的资源或条件在其阻塞时不能被剥夺。

因此,解除它们阻塞的事件或条件永远也不会发生。

死锁产生的必要条件有以下4个:1.互斥条件。

并发进程所请求的资源是互斥使用的独占资源,即一次只能被一个进程使用的资源,具有排它性。

2.不可剥夺条件。

进程所占有的资源在没有使用完之前不能被其它进程强行占用,只能由占有该资源的进程自己释放。

3.部分分配条件。

进程对于自己所需要的资源每次只请求一部分,操作系统允许部分资源的分配。

4.环路条件。

系统中各并发进程对于资源的占有和请求形成环路,即请求箭头方向和占有箭头方向形成环路。

操作系统规避死锁的方法有3种:预防、避免、检测与恢复。

死锁预防就是事先预防死锁的发生。

它要求操作系统采取某种策略,限制并发进程对资源的请求,从而使死锁的必要条件在任何时候都不会满足的一种静态解决方法。

死锁避免是指操作系统在动态分配过程中对每一次的分配都要采取某种策略去判断一下当前的分配有没有导致死锁的可能性,没有则实施分配,有则拒绝分配,从而动态地避免死锁的产生,是动态规避死锁的方法。

死锁的检测与恢复是指系统设置专门机构,在死锁发生时该机构能够及时检测出死锁发生的位置和原因,并能够通过外力破坏死锁产生的一个必要条件,从而使并发进程能够从死锁状态中恢复出来。

3.静态分配与有序分配分别破坏的是死锁必要条件中的哪个条件?答:静态分配破坏死锁必要条件中的部分分配条件;有序分配分别破坏的是死锁必要条件中的环路条件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验报告 实验一 进程状态转换及其PCB的变化 一、实验目的 自行编制模拟程序,通过形象化的状态显示,深入理解进程的概念、进程之间的状态转换及其所带来的PCB内容 、组织的变化,理解进程与其PCB间的一一对应关系。 二、实验内容及要求 (1) 设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 (2) 独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。 (3) 合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。 (4) 设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。 (5) 代码书写要规范,要适当地加入注释。 (6) 认真进行预习,完成预习报告。 (7) 实验完成后,要认真总结,完成实验报告。 三、实验使用的数据结构及说明 在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下: struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行时间 int P_Requiry; //PCB所需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; 其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。P_Runtime标示要完成一个进程所需要的时间。P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry置1,否则置0。Struct PCB * next 用来指向同一队列中的下一个PCB块。 四、程序代码,注释及说明 #include"stdlib.h" #include"stdio.h" #include"string.h" /********** globle structure and viable ******/

struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行时间 int P_Requiry; //PCB所需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; struct PCB * Create_state; //创建状态 struct PCB * Run_state; //运行状态 struct PCB * Ready_state; //就绪状态 struct PCB * Block_state; //阻塞状态 struct PCB * Exit_state; //退出状态

int signal4=0; //标示进程4的完成状态 int signal5=0; //标示进程5的完成状态

void InsertQueue(struct PCB **head,struct PCB *node) /* insert node function */ { struct PCB * p,*q; node->next=NULL; if(*head==NULL) //如果队列为空 { *head=node; } Else //队列不空 { p=*head; q=p->next; while(q!=NULL) //找到最后的元素位置 { p=q; q=q->next; } p->next=node; //将节点插入队列 } }

void DeleteQueue(struct PCB **head,struct PCB *node) //撤销进程,从队列中删除元素 { struct PCB *p,*q; q=*head; if(*head==NULL||node==NULL) //如果队列为空,返回 return ; if(*head==node) //如果要删除的元素是队首元素 { *head=(*head)->next; return; } Else //如果不是队列的首元素 { while(q->next!=p&&q->next!=NULL) q=q->next; q=p->next; p->next=NULL; } }

void Display_Process(struct PCB * node) //打印进程状态的元素函数 { printf("\n\nthis process Id is : %d \n",node->P_Id); printf("this process name is : %s \n",node->P_Name); printf("this process state is : on %s \n ",node->P_State); printf("this process Runtime is : %d \n",node->P_Runtime);

if(node->P_Requiry) printf("this process resource is ready \n"); else printf("this process resource is not ready ! \n"); }

void DispatchToBlock(struct PCB *node) // /* dispatch to block function*/ { //调度到阻塞状态的函数 //struct PCB *p=(struct PCB *)malloc(sizeof(struct PCB)); if(!node->P_Requiry) //如果所需要的资源没有满足则,调度到阻塞状态 { strcpy(node->P_State,"block"); InsertQueue(&Block_state,node); //插入到阻塞队列 Display_Process(node); } }

void DispatchToReady(struct PCB *node) // dispatch to ready state { //调度到就绪状态的函数 if(node->P_Requiry) //如果所需的资源满足,则调度 { strcpy(node->P_State,"Ready"); InsertQueue(&Ready_state,node); Display_Process(node); } } void DispatchBlockToReady() //dispatch the process to readyqueue { //从阻塞状态调度到就绪状态函数 struct PCB*p,*q; q=Block_state; while(q!=NULL) //如果阻塞状态队列不空 { p=q; q=q->next; if(signal4&&p->P_Id==4) //如果所需要的资源满足 { DeleteQueue(&Block_state,p); strcpy(p->P_State,"ready"); InsertQueue(&Ready_state,p); printf("process4 will be in the state of ready!\n"); Display_Process(p); } if(signal5&&p->P_Id==5) { DeleteQueue(&Block_state,p); strcpy(p->P_State,"ready"); InsertQueue(&Ready_state,p); printf("process5 will be in the state of ready!\n"); Display_Process(p); } } }

void Create_Process() //创建进程函数 { int i; struct PCB *p; char name[10]; strcpy(name,"process"); for(i=1;i<3;i++) //动态创建2个处于阻塞状态的进程 { p=(struct PCB *)malloc(sizeof(struct PCB)); p->P_Id=i; name[7]=i+'0'; name[8]='\0'; strcpy(p->P_Name,name); strcpy(p->P_State,"create"); p->P_Runtime=1; //所需要的时间片为1 p->P_Requiry=0;

Display_Process(p); sleep(4); printf(" \n process%d will be in the state of Block, waiting the resource ready \n\n",i); DispatchToBlock(p); //同时调度到阻塞队列 }

for(i=3;i<7;i++) //创建4个就绪状态的队列 {

相关文档
最新文档