操作系统进程控制
深圳大学实验报告课程名称:操作系统实验项目名称:进程控制学院:计算机与软件学院专业:软件工程指导教师:报告人:学号:班级:实验时间:实验报告提交时间:教务处制一、实验目的与要求:实验目的:通过进程的创建,撤销和运行加深对进程概念和进程并发执行的理解,明确进程与程序之间的区别.实验要求:1.掌握在Windows中编程,在CYGWIN中编译运行的方法2.阅读例程,理解fork(),execl(),exit(),getpid()和waitpid()的功能和用法3.运行例程,分析例程中关键代码的功能,给出运行结果并对运行结果进行分析说明.4.模仿例程,编写一段程序实现以下功能:a)父进程使用系统调用fork()创建两个子进程b)各个子进程显示和输出一些提示信息和自己的进程的标识符c)父进程显示进程的ID和一些提示信息,然后调用waitpid()等待多个子进程结束,并在子进程结束后显示输出提示信息表示程序结束5.父进程创建多个(3个以上)进程并发运行,控制好各个子进程输出自己的进程标识符和一些提示信息,对程序运行结果进行分析说明.观察各个子进程并发执行的顺序,输出的结果是否与设想中的顺序不同,并分析原因.附加:分析父子进程资源共享的关系,在父进程中定义的变量能否被子进程使用?在特定位置定义才能使用还是所有位置都可以?子进程定义的变量,父进程能否使用?父进程如何强行关闭子进程?二、方法、步骤:(说明程序相关的算法原理或知识内容,程序设计的思路和方法,可以用流程图表述,程序主要数据结构的设计、主要函数之间的调用关系等)实验通过fork()函数创建子进程,父进程再通过waitpid()函数调用已创建的子进程,通过父进程和子进程输入自身的标识码来区分正运行的进程是子进程还是父进程。
其中,当父进程通过fork()创建一个子进程后,会返回子进程的标识码(PID),而在新建立的子进程中返回0。
三.实验过程及内容:(对程序代码进行说明和分析,越详细越好,代码排版要整齐,可读性要高)例程2:#include <unistd.h>#include <stdarg.h>#include <time.h>#include <sys/types.h>#include <sys/wait.h>#include <stdio.h>#include <stdlib.h>int tprintf(const char*fmt,...);int main(){int i=0,j=0;pid_t pid;printf("Hello from Parent Process,PID is %d.\n",getpid());pid = fork();if(pid == 0){sleep(1);for(i=0;i<3;i++){printf("Hello from Child Process %d. %d times\n",getpid(),i+1);sleep(1);}}else if(pid !=-1){tprintf("Part forked one child process--%d.\n",pid);tprintf("Parent is waiting for child to exit.\n");waitpid(pid,NULL,0);tprintf("Child Process has exited.\n");tprintf("Parent had exited.\n");}else tprintf("Everything was done without error.\n");return 0;}int tprintf(const char*fmt,...){va_list args;struct tm *tstruct;time_t tsec;tsec = time(NULL);tstruct = localtime (&tsec);printf("%02d:%02d:%02d:%5d",tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec, getpid());va_start(args,fmt);return vprintf(fmt,args);}分析: 父进程中首先通过fork()创建了一个子进程,并且返回了子进程的PID,这是的PID 在父进程中不等于0,所以继续运行父进程,当运行到waitpid()时,进入子进程中,开始运行子进程的内容,子进程运行完毕后,返回父进程运行waitpid()后的部分。
例程3:#include <unistd.h>#include <stdarg.h>#include <time.h>#include <sys/types.h>#include <sys/wait.h>#include <stdio.h>#include <stdlib.h>int tprintf(const char*fmt,...);int main(){int i=0,j=0;pid_t pid;printf("Hello from Parent Process,PID is %d.\n",getpid());pid = fork();if(pid == 0){sleep(5);tprintf("Hello from Child Process!\n");tprintf("I am calling exec.\n");execl("1","a",NULL);// execl("1","b","c",NULL);tprintf("You should never see this because the child is already gone.\n");}else if(pid !=-1){tprintf("Hello from Parent , pid %d.\n",pid);sleep(1);tprintf("Parent forked process %d.\n",pid);sleep(1);tprintf("Parent is waiting for child to exit.\n");waitpid(pid,NULL,0);tprintf("Parent had exited.\n");}else tprintf("Everything was done without error.\n");return 0;}int tprintf(const char*fmt,...){va_list args;struct tm *tstruct;time_t tsec;tsec = time(NULL);tstruct = localtime (&tsec);printf("%02d:%02d:%02d:%5d",tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec, getpid());va_start(args,fmt);return vprintf(fmt,args);}分析: 由于在实验室做的例程3的截图丢失,所以我在自己电脑上重新运行且修改了一下execl()函数中的参数。
(调用的外部文件是输出“12345”+换行+“45678”)。
父进程创建子进程并且进入子进程的过程与例程2相同,子进程中调用execl()函数,执行第一个参数所代表路径的文件并传递第二个参数给该文件。
由于子进程中execl()函数成功执行,所以不返回子进程,子进程中在excel()函数后的内容不执行。
四、实验结论:(提供运行结果,对结果进行探讨、分析、评价,并提出结论性意见和改进想法)例程2:实验结果截图::分析: 父进程中首先通过fork()创建了一个子进程,并且返回了子进程的PID,这是的PID 在父进程中不等于0,所以继续运行父进程,当运行到waitpid()时,进入子进程中,开始运行子进程的内容,子进程运行完毕后,返回父进程运行waitpid()后的部分。
建议:先看一下代码,再将运行结果和代码结合起来看更容易理解代码。
例程3:实验结果截图::分析:由于在实验室做的例程3的截图丢失,所以我在自己电脑上重新运行且修改了一下execl()函数中的参数。
(调用的外部文件是输出“12345”+换行+“45678”)。
父进程创建子进程并且进入子进程的过程与例程2相同,子进程中调用execl()函数,执行第一个参数所代表路径的文件并传递第二个参数给该文件。
由于子进程中execl()函数成功执行,所以不返回子进程,子进程中在excel()函数后的内容不执行。
建议:创建一个简单的外部文件,子进程调用时容易分辨。
(调用的外部文件是输出“12345”+换行+“45678”)。
4.模仿例程,编写一段程序(创建两个子进程)代码:#include <unistd.h>#include <stdarg.h>#include <time.h>#include <sys/types.h>#include <sys/wait.h>#include <stdio.h>#include <stdlib.h>int tprintf(const char*fmt,...);int main(){int i=0,j=0;pid_t pid1;pid_t pid2;printf("Hello from Parent Process,PID is %d.\n",getpid());pid1 = fork();if(pid1 == 0){sleep(1);for(i=0;i<3;i++){printf("Hello from Child Process one %d. %d times\n",getpid(),i+1);sleep(1);}}else if(pid1 !=-1){tprintf("Part forked one child process--%d.\n",pid1);tprintf("Parent is waiting for child to exit.\n");waitpid(pid1,NULL,0);pid2 = fork();if(pid2 == 0){sleep(1);for(i=0;i<3;i++){printf("Hello from Child Process two %d. %d times\n",getpid(),i+1);sleep(1);}}else if(pid2 !=-1){tprintf("Part forked one child process--%d.\n",pid2);tprintf("Parent is waiting for child to exit.\n");waitpid(pid2,NULL,0);tprintf("Child Process has exited.\n");tprintf("Parent had exited.\n");}}else tprintf("Everything was done without error.\n");return 0;}int tprintf(const char*fmt,...){va_list args;struct tm *tstruct;time_t tsec;tsec = time(NULL);tstruct = localtime (&tsec);printf("%02d:%02d:%02d:%5d",tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec, getpid());va_start(args,fmt);return vprintf(fmt,args);}运行结果:分析: 通过父进程创建一个子进程,运行一个子进程,再创建一个子进程,再运行一个子进程的方式,输出各个进程的标识码,可以得到正确的结果。
操作系统进程控制实验报告
操作系统进程控制实验报告硬件环境:处理器:Intel(R) Core(TM) i5-3210M CPU @2.50GHz 2.50GHz安装内存:4.00GB系统类型:64位操作系统软件环境:Linux系统一、实验目的加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习Linux系统中进程创建与控制有关的系统调用的编程和调试技术。
二、实验步骤(1)分析实例实验(2)进行独立实验(3)思考并完成实验报告实验截图:思考:说明它们反映出操作系统教材中进程及处理机管理一节讲解的进程的哪些特征和功能?在真实的操作系统中它是怎样实现和反映出教材中讲解的进程的生命期、进程的实体和进程状态控制的。
你对于进程概念和并发概念有哪些新的理解和认识?子进程是如何创建和执行新程序的?信号的机理是什么?怎样利用信号实现进程控制?根据实验程序、调试过程和结果分析写出实验报告。
1.进程的概念:进程不仅是一段程序代码,还包括当前活动(通过程序计数器和寄存器中的内容来表示),另外,进程还包括进程堆栈段,和数据段等。
2.并发概念:是指进程之间交替并发执行3.进程通过系统调用fork()函数创建子进程,子进程由唯一的pid值标示,pid通常是一个整数值。
通过fork创建的子进程实际上是父进程的克隆体,通过复制原来进程的地址空间而成,父子进程同时执行fork之后的程序。
但是父子进程的pid值不同,可以通过对pid的判断,使父子进程执行不同的程序。
子进程如果想执行不同的程序,需要系统调用exec()函数装入新的程序执行。
4.信号的机理:信号是用来通知进程某个特定的事件已经发生。
信号是由特定的事件产生,信号必须要发送到进程,一旦发送,进程必须得到处理。
信号可以可以有系统默认处理也可以用户自定义处理。
操作系统实验3-进程控制
WORD wMajorReq=(WORD)(dwVerReq>16);
WORD wMinorReq=(WORD)(dwVerReq&0xffff);
::cout<<"Process ID:"<<dwIdThis<<",requires OS:"<<wMajorReq<<wMinorReq<<::endl;
{
//改变优先级
::SetPriorityClass(
::GetCurrentProcess(), //利用这一进程
HIGH_PRIORITY_CLASS); //改变为high
//报告给用户
::cout<<"Task Manager should indicate this "
"process is high priority."<<::endl;
//设置版本信息的数据结构,以便保存操作系统的版本信息
OSVERSIONINFOEX osvix;
::ZeroMemory(&osvix,sizeof(osvix));
osvix.dwOSVersionInfoSize=sizeof(osvix);
//提取版本信息和报告
::GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvix));
Parent();
}
return 0;
}
分析:程序4-3.cpp说明了一个进程从“生”到“死”的整个一生,第一次执行时,它创建一个子进程,其行为如同“父亲”。在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex()API发出“死亡”信号。然后用Sleep()API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。
操作系统进程控制实验报告
操作系统进程控制实验报告一、实验目的操作系统进程控制是操作系统中的重要概念和核心功能之一。
本次实验的目的在于深入理解操作系统中进程的概念、状态及其转换,掌握进程创建、终止、阻塞和唤醒等操作的实现原理和方法,通过实际编程和调试,观察进程的行为和特性,从而提高对操作系统原理的理解和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。
三、实验原理(一)进程的概念进程是操作系统中进行资源分配和调度的基本单位,它包含了程序代码、数据、堆栈等资源。
进程具有独立性、动态性和并发性等特点。
(二)进程的状态进程的状态通常包括就绪态、运行态和阻塞态。
就绪态表示进程已具备运行条件,等待被调度;运行态表示进程正在 CPU 上执行;阻塞态表示进程因等待某个事件而暂停执行。
(三)进程控制的基本操作1、进程创建:通过系统调用创建新的进程,为其分配资源并初始化。
2、进程终止:当进程完成任务或出现异常时,结束其执行并回收资源。
3、进程阻塞:进程在等待某个事件时,主动进入阻塞态。
4、进程唤醒:当等待的事件发生时,将阻塞的进程唤醒,使其进入就绪态。
四、实验内容与步骤(一)进程创建1、编写 C++程序,使用系统提供的函数创建新的进程。
2、在新进程中执行特定的任务,例如打印输出信息。
```cppinclude <windowsh>include <iostream>int main(){STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));sicb = sizeof(si);ZeroMemory(&pi, sizeof(pi));//创建新进程if (!CreateProcess(NULL, //应用程序名称"C:\\Path\\To\\Your\\ChildProcessexe",//命令行参数NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){std::cerr <<"CreateProcess failed Error code: "<<GetLastError()<< std::endl;return 1;}//等待子进程结束WaitForSingleObject(pihProcess, INFINITE);//关闭进程和线程句柄CloseHandle(pihProcess);CloseHandle(pihThread);return 0;}```(二)进程终止1、在创建的进程中设置条件,当满足条件时主动终止进程。
操作系统第二章进程的描述与控制题目
操作系统第⼆章进程的描述与控制题⽬1-1. 下⾯对进程的描述中,错误的是。
A.进程是动态的概念B. 进程执⾏需要处理机C.进程是有⽣命周期的D. 进程是指令的集合【答案】D动态的,有⽣命周期的。
【解析】【解析】程序是指令的集合。
⽽进程是程序的⼀次执⾏,是动态的,有⽣命周期的。
1-2. 分配到必要的资源并获得处理机时的进程状态是 ()A. 就绪状态B. 执⾏状态C. 阻塞状态D. 撤消状态【答案】B【解析】分配到必要地资源获得处理机时的进程状态是执⾏状态。
1-3.程序的顺序执⾏通常在①的⼯作环境中,具有以下特征②。
程序的并发执⾏在③的⼯作环境中,具有如下特征④。
A. 单道程序B.多道程序C. 程序的可再现性D. 资源共享【答案】①A ②C ③B ④D。
【解析】程序的顺序执⾏通常在单道程序的⼯作环境中,具有程序结果的可再现性特征;程序的并发执⾏在多道程序的⼯作环境中,具有共享资源的特征。
1-4. 下列进程状态变化中,变化是不可能发⽣的A. 运⾏——就绪B.运⾏—— 等待C. 等待——运⾏D. 等待——就绪【答案】C【解析】当调度程序为某就绪状态的进程分配了处理机时,该进程便由就绪状态变为执⾏状态;正在执⾏的进程因等待发⽣某事件⽽⽆法执⾏时,该进程由执⾏状态变为等待状态;当处于等待状态的进程所等待的事件发⽣时,该进程由等待状态变为就绪状态;正在执⾏的进程如因时间⽚⽤完⽽暂停执⾏,该进程由执⾏状态变为就绪状态。
等待——运⾏不可能发⽣,就绪—— 等待不可能发⽣。
运⾏不可能发⽣,就绪唯⼀的双向箭头是运⾏运⾏——就绪,就绪——运⾏唯⼀的双向箭头是1-5. 当时,进程从执⾏状态转变为就绪状态。
A. 进程被调度程序选中B. 时间⽚到C. 等待某⼀事件D.等待的事件发⽣【答案】B。
【解析】正在执⾏的进程,如因时间⽚⽤完⽽暂停执⾏,则该进程由执⾏状态转变为就绪状态。
就绪——运⾏ C. 等待某⼀事件运⾏—— 阻塞 D.等待的事件发⽣等待——就绪A. 进程被调度程序选中,进程被调度程序选中,就绪1-6. 如果系统中有n个进程,则就绪队列中进程的个数最多为。
【操作系统】《计算机操作系统》汤小丹第2章进程的描述和控制
【操作系统】《计算机操作系统》汤⼩丹第2章进程的描述和控制博主:海底淤泥1.什么是前趋图?为什么要引⼊前趋图? 前趋图:⼀个有向⽆循环图,它⽤于描述进程之间的先后顺序 作⽤:更好描述程序的顺序和并发执⾏情况2.试画出下⾯四条语句的前趋图S1:a=x+y S2:b=z+1 S3:c=a-b S4:w=c+1 S1->S3 S2->S3 S3->S43.为什么程序并发执⾏会产⽣间断特征? 程序在并发执⾏时,由于它们共享系统资源,以及为完成同⼀项任务相互合作,⾄使在这些并发程序之间形成了相互制约的关系4.程序并发执⾏时为什么会失去封闭性和可再现性? 失去封闭性:当系统存在着多个可以并发执⾏的程序时,系统中的各种资源将为它们所共享,⽽这些资源的状态也由这些程序来改变,导致其中任意程序运⾏时,其环境都必然会受到其他程序的影响。
失去可再现性:程序并发执⾏时,由于失去了封闭性,其计算结果必然将与并发程序的执⾏速度有关,从⽽使程序的执⾏失去了可再现性5.在操作系统中为什么要引⼊进程的概念?它会产⽣什么影响? 为了使程序并发执⾏,并且可以对并发执⾏的程序加以描述和控制,⼈们引⼊了“进程”的概念。
影响:使程序并发执⾏,进程实体和其他进程实体并发执⾏6.试从动态性、并发性、和独⽴性上⽐较进程和线程 动态性:进程实体有⼀定⽣命期,是动态的;⽽程序是⼀组有序指令集合,并存放在某种介质上,其本⾝不具有活动意义,是静态的 并发性:进程可以并发执⾏,没有PCB的程序是不能并发执⾏的 独⽴性:进程实体是⼀个能独⽴运⾏,独⽴获得资源和独⽴接受调度的基本单位。
未建⽴PCB的程序不能作为⼀个独⽴的单位参与运⾏7.试说明PCB的作⽤具体表现在什么⽅⾯,为什么说PCB是进程存在的唯⼀标志? PCB描述进程是基本情况和活动过程,进⽽控制和管理进程。
创建进程:创建进程实体的PCB 撤销进程:撤销进程实体的PCB8.PCB提供了进程管理和进程调度所需要的哪些信息?1.进程标识符2.处理机状态3.进程调度信息4.进程控制信息9.进程控制块的组织⽅式有哪⼏种?1.线性⽅式2.连接⽅式3.索引⽅式10.何谓操作系统内核?内核的主要功能是什么? 通常将⼀些硬件紧密相关的模块、各种常⽤设备的驱动程序以及运⾏频率较⾼的模块,都安排在紧靠硬件的软件层次中,将它们常驻内存,被称为操作系统内核 功能:1.对重要软件进⾏保护,防⽌遭到其他程序的破坏 2.提⾼OS的运⾏效率11.试说明进程在三个基本状态之间转换的经典原因 就绪->执⾏:进程调度 执⾏->就绪:时间⽚完 执⾏->阻塞:I/O请求 阻塞->就绪:I/O完成12.为什么要引⼊挂起状态?该状态有哪些性质? 原因:1.终端⽤户的需要 2.⽗进程的请求 3.负荷调节的需要 4.操作系统的需要 性质:1.若程序正在执⾏,将暂停执⾏ 2.若原本处于就绪状态,则该程序不接受调度13.在进⾏进程切换时,所要保存的处理机状态信息有哪些?1.通⽤寄存器2.指令计数器3.程序状态字PSW4.⽤户栈指针14.试说明引起进程创建的主要事件。
操作系统的进程管理
操作系统的进程管理操作系统是计算机系统的核心组成部分,负责管理计算机的资源并提供各种服务。
进程是操作系统中的基本单位,是程序的执行实例。
进程管理是操作系统的重要功能之一,它包括进程的创建、撤销、调度以及进程间的通信和同步等操作。
一、进程的创建进程的创建是指操作系统为一个程序创建一个执行实例的过程。
当用户执行一个程序时,操作系统会为该程序创建一个独立的进程。
进程创建的步骤如下:1. 分配内存空间:操作系统为进程分配一块内存空间,用于存储代码、数据和堆栈等信息。
2. 初始化进程控制块:操作系统创建进程控制块(PCB),用于存储进程的各种状态、资源和控制信息。
3. 设置程序计数器(PC):将程序计数器设置为程序的入口地址,以便开始执行程序。
4. 设置堆栈指针(SP):将堆栈指针设置为堆栈的起始地址,以便进行函数调用和返回。
二、进程的撤销进程的撤销是指操作系统终止一个正在执行的进程的过程。
进程撤销的原因包括进程执行完毕、出现错误、被用户强制终止等。
进程撤销的步骤如下:1. 保存进程状态:将进程的状态、寄存器和堆栈等信息保存到进程控制块中。
2. 释放资源:释放进程占用的内存空间、文件和设备等资源,以便其他进程使用。
3. 销毁进程控制块:操作系统销毁进程控制块,回收其内存空间。
三、进程的调度进程的调度是指操作系统根据一定的调度算法,按照优先级或其他规则决定将哪个进程分配给处理器执行的过程。
进程调度的目标是提高系统的资源利用率和响应速度。
常见的调度算法包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转等。
四、进程间的通信和同步进程间的通信是指不同进程之间传递信息和共享资源的过程。
进程间通信可以通过共享内存、消息传递、管道、信号量等方式实现。
通信的目的是实现进程间的协作和数据共享。
进程间的同步是指多个进程按照一定的顺序执行,以避免资源竞争和数据不一致的问题。
常见的同步机制包括互斥锁、信号量、条件变量等。
操作系统-进程管理
02
最短作业优先(SJF):优先调度预计运行时 间最短的进程。
03
最短剩余时间优先(SRTF):优先调度剩余 时间最短的进程。
04
优先级调度:根据进程的优先级进行调度。
死锁的产生与预防
死锁的产生
死锁是指两个或多个进程在无限期地等待对方释放资源的现象。产生死锁的原因包括资源分配不当、 请求和保持、环路等待等。
操作系统-进程管理
• 进程管理概述 • 进程的同步与通信 • 进程调度与死锁 • 进程的并发控制 • 进程管理的发ห้องสมุดไป่ตู้趋势与挑战
01
进程管理概述
进程的定义与特点
01
进程是程序的一次执行,具有动态性、并发性、独立性和制 约性。
02
进程拥有独立的内存空间,执行过程中不受其他进程干扰。
03
进程是系统资源分配和调度的基本单位,能够充分利用系统 资源进行高效计算。
进程同步的机制
进程同步的机制主要包括信号量机制、消息传递机制和共享内存机制等。这些 机制通过不同的方式协调进程的执行顺序,以实现进程间的有效协作。
信号量机制
信号量的概念
信号量是一个整数值,用于表示系统资源或临界资源的数量 。信号量可以用来控制对共享资源的访问,以避免多个进程 同时访问导致的数据不一致问题。
消息传递的机制
消息传递的机制包括发送和接收操作。发送操作将消息发送给目标进程,接收操 作从消息队列中获取消息并进行处理。通过这种方式,多个进程可以通过发送和 接收消息来协调执行顺序和交换数据。
共享内存机制
共享内存的概念
共享内存是一种实现进程间通信的有效方式,通过共享一段内存空间来实现不同进程之间的数据交换和共享。
预防死锁的方法
计算机操作系统原理 第二章 进程描述与控制
13
两个并发程序方案
设有一台标准输入设备(键盘),和一台标准 输出设备(显示器或打印机),输入程序负责 从标准设备中读取一个字符,送缓冲区中。输 出程序从缓冲区中取数据,送标准设备输出。
14
两个并发程序方案
f
标准输入 (键盘)
输入程序 缓冲区 输出程序
g
标准输出 (打印机)
15
两个并发程序方案
6
前趋图
前趋图(Precedence Graph)是一个有向无循环图,记 为DAG(Directed Acyclic Graph),用于描述进程之间执行 的前后关系。 结点:一个程序段或进程,乃至一条语句
有向边:偏序或前趋关系
把没有前趋的结点称为初始结点(Initial Node) 没有后继的结点称为终止结点(Final Node) 每个结点还具有一个重量(Weight),用于表示该结点 所含有的程序量或结点的执行时间。
38
进程状态模型
进程状态转换
原状态 创建 OS根据作业控制请求; 分时系统用户登录; 进程产生子进程而创 建进程 转换后状态 运行 × 就绪 × 阻塞 × 终止 ×
创建
×
×
OS准备运 行新的进 程
×
×
(转下表)
39
进程状态模型
原状态 创建 运行 × 运行 × 转换后状态 就绪 超时;OS服务 请求;OS响应 具有更高优先 级的进程;进 程释放控制 阻塞 OS服务 请求; 资源请 求;事 件请求 终止 进程完 成,进 程夭折
2.5 进程同步 2.6 经典进程的同步问题 2.7 管程机制 2.8 进程通信
3
2.1 进程描述
2.1.1 程序的顺序执行 2.1.2 程序的并发执行 2.1.3 进程的定义
操作系统实验-进程控制
实验一、进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习 Linux 系统中进程创建与控制有关的系统调用的编程和调试技术。
1.2 实验说明1)与进程创建、执行有关的系统调用说明 进程可以通过系统调用fork()创建子进程并和其子进程并发执行.子进程初始的执行映像是父进程的一个复本.子进程可以通过 exec()系统调用族装入一个新的执行程序。
父进程可以使用 wait()或 waitpid()系统调用等待子进程的结束并负责收集和清理子进程的退出状态。
fork()系统调用语法:pid_t#include <unistd.h>fork(void);fork 成功创建子进程后将返回子进程的进程号,不成功会返回-1.exec 系统调用有一组 6 个函数,其中示例实验中引用了 execve 系统调用语法:#include <unistd.h>const char * envp[]);path 要装const char *argv[],int execve(const char *path,入的新的执行文件的绝对路径名字符串.argv[] 要传递给新执行程序的完整的命令参数列表(可以为空).envp[] 要传递给新执行程序的完整的环境变量参数列表(可以为空).Exec 执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。
如果 exec 调用失败,它会返回-1。
wait() 系统调用语法:#include <sys/types.h>pid_t#include <sys/wait.h>wait(int *status);status 用pid_t waitpid(pid_t pid,int *status,int option);于保留子进程的退出状态pid 可以为以下可能值:-1 等待所有 PGID 等于 PID 的绝对值的子进程1 等待所有子进程0 等待所有 PGID 等于调用进程的子进程>0 等待 PID 等于 pid 的子进程 option 规定了调用 waitpid 进程的行为:WNOHANG 没有子进程时立即返回WUNTRACED 没有报告状态的进程时返回wait 和 waitpid 执行成功将返回终止的子进程的进程号,不成功返回-1。
操作系统的进程调度
操作系统的进程调度在计算机科学中,操作系统是一种控制和管理计算机硬件和软件资源的系统软件。
而进程调度是操作系统的一个重要组成部分,它负责协调和管理计算机中的进程,以提高计算机系统的性能和资源利用率。
进程调度的目标是通过合理地选择和安排进程的执行顺序,实现公平性、优先级、响应时间、吞吐量等需求,同时最大化地利用计算机资源。
为了达到这些目标,操作系统设计了多种进程调度算法,下面将介绍几种常见的调度算法。
一、先来先服务(FCFS)调度算法先来先服务调度算法是一种最简单的调度算法,即按照进程到达的顺序进行调度。
当一个进程到达系统时,它被分配到可用的处理器,并一直占用处理器,直到它完成或进入等待状态。
先来先服务调度算法的优点是简单且公平,每个进程都能等到自己的执行机会。
然而,它存在一个明显的缺点,即无法满足对响应时间的要求。
对于长时间的任务,它可能导致其他短任务的等待时间较长。
二、短作业优先(SJF)调度算法短作业优先调度算法是按照进程的执行时间长度进行排序,优先选择执行时间短的进程。
当一个进程到达系统时,操作系统会比较该进程的执行时间和当前正在执行的进程的执行时间,如果该进程的执行时间更短,那么它将被调度执行。
短作业优先调度算法的优点是能够最大程度地减少平均等待时间,提高了系统的响应速度和吞吐量。
然而,它可能导致长时间的任务一直被短任务抢占,从而造成长时间任务的不公平性。
三、轮转调度算法轮转调度算法是按照时间片的概念进行调度。
每个进程被分配一个固定的时间片,当时间片用完时,该进程会被暂停,并被放在就绪队列的末尾,让其他进程执行。
被暂停的进程会等待下一个时间片重新执行。
轮转调度算法的优点是公平且能够满足对响应时间的要求。
它保证了每个进程都有机会执行,并且可以使长时间任务和短时间任务都能得到合理的调度。
然而,对于长时间任务和I/O密集型任务,轮转调度算法可能会导致上下文切换的开销增加,降低系统的性能。
四、优先级调度算法优先级调度算法是根据进程的优先级进行调度,优先级高的进程将被优先执行。
