进程控制
概念:
- 在进程生存全期间,对其全部行为的控制
- 控制行为:创建进程、撤销进程、阻塞进程、唤醒进程
进程创建
功能
- 创建一个具有指定标识(ID)的进程
参数
- 进程标识、优先级、进程起始地址、CPU初始状态、资源清单等
过程
- 创建一个空白PCB
- 获得并赋予进程标识符ID
- 为进程分配空间
- 初始化PCB
- 插入相应的进程队列(就绪队列)
伪代码:
Create (Si,Mi,Pi) //CPU的状态、内存、优先级
{
p=Get_New_PCB(); //分配新的PCB
pid=Get_New_PID(); //分配进程的PID
p->ID=pid; //设置进程的PID
p->CPU_State=Si; //CPU的状态
p->Memory=Mi; //内存
p->Priority=Pi; //优先级
p->Status.Type="Ready"; //进程状态
p->Status.List=RL; //进程队列RL:Ready List
………………
Insert (RL,p); //将进程p插入就绪队列
Scheduler(); //调度程序
}
进程撤销
功能:
- 撤销一个指定的进程
- 收回进程所占有的资源,撤销该进程PCB
进程撤销的时机/事件
- 正常结束
- 异常结束
- 外界干预
参数
- 被撤销的进程名(ID)
进程撤销的实现(过程)
- 在PCB队列中检索出该PCB
- 获取该PCB状态
- 若该进程处在运行态,立即终止该进程(递归:检查是否有子进程,先撤销子进程)
- 释放进程所占资源
- 将进程从PCB队列中移除
进程阻塞
功能:停止进程的执行,变为阻塞
阻塞的时机/事件
- 请求系统服务
- 启动某种操作
- 新数据尚未到达
- 无新工作可作
参数:
- 阻塞原因
- 不同原因构建有不同的阻塞队列
进程阻塞的实现
- 停止运行
- 将PCB“运行态”改“阻塞态”
- 插入相应原因的阻塞队列
- 转调度程序
进程唤醒
功能:唤醒处于阻塞队列当中的某个进程
时机/事件
- 系统服务由不满足到满足
- I/O完成
- 新数据到达
- 进程提出新请求(服务)
参数:被唤醒进程的标识
进程控制原语
- 由若干指令构成的具有特定功能的函数
- 具有原则性,操作不可分割
进程控制原语
- 创建原语
- 撤销原语
- 阻塞原语
- 唤醒原语
windows进程控制
windows中如何通过编程启动exe程序创建进程
例子:通过编程启动“C:DrawRect.exe”程序
system ("C:\\DrawRec.exe");
WinExec("C:\\DrawRec.exe",SW_SHOWMAXIMIZED);
shellExecute(NULL,"open","C:\\DrawRec.exe",NULL,NULL,SW_SHOWMAXIMIZED);
CreateProcess(NULL,"C:\\DrawRec.exe",NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi);
创建新进程
- 创建进程内核对象,创建虚拟地址空间
- 装载EXE和/或DLL的代码和数据到地址空间中
- 创建主线程和线程内核对象
- 启动主线程,进入主函数main
结束进程
- ExitProcess:void ExitProcess(uint uExitCode)
- TerminateProcess(强制):TerminateProcess (handle hProcess,uint uExitCode)
Linux进程控制
创建进程——fork()
pid_t fork (void) pid_t是整型
- 新进程是当前进程的子进程
- 父进程和子进程
父进程:fork()的调用者
子进程:新建的进程
- 子进程是父进程的复制
fork返回值pid
- 在子进程中,pid=0
- 在父进程中,pid>0(子进程ID)
- 出错:pid=-1
进程执行与父进程不同的功能
exec函数簇(包含若干函数)
功能:
- 装入一个指定的可执行程序运行
- 使子进程具有和父进程完全不同的新功能
步骤:
- 根据文件名找到相应的可执行程序
- 将可执行程序的内容填入子进程的地址空间
- 进入新进程执行且不再返回