4.2-进程控制
进程控制的概念
- 在进程生存全期间,对其全部行为的控制
- 四个典型的控制行为
- 创建进程
- 阻塞进程
- 撤销进程
- 唤醒进程
进程的创建过程
- 参数:(进程标识、优先级、进程起始地址、CPU初始状态、资源清单等。)
- 创建一个空白PCB
- 获取并服务进程标识符ID
- 为进程分配空间
- 初始化PCB
- 插入相应的进程队列
进程的撤销过程
- 参数:(进程ID)
- 在PCB队列中检索出改PCB
- 获取该进程的状态
- 若该进程处于运行态,则立刻结束该进程
- 递归检查是否有子进程,先“撤销”子进程
- 释放该进程所占有的资源
- 将进程从PCB队列中移除
进程阻塞过程
- 参数:(阻塞原因,阻塞队列)
- 停止进程运行
- 修改PCB状态 “运行态” -> “阻塞态”
- 插入相应原因的阻塞队列
- 转调度程序
进程唤醒
- 功能:唤醒阻塞队列中的某个进程
- 唤醒时机/时间:
- 系统服务由不满足变为满足
- IO完成
- 新数据到达
- 进程提出新情求(服务)
- 参数:(进程标识-> ID)
进程控制原语
原语
- 由若干指令构成特殊功能的函数
- 具有原子性,其操作不可分割
Windows进程控制
通过编程启动程序
// 启动 C:\DrawRect.exe程序
system("C:\\DrawRect.exe");
WinExec("C:\\DrawRect.exe", SW_SHOWMAXIMIZED);
ShellExecute(NULL,"open","C:\\DrawRect.exe",NULL,NULL,SW_SHOWNORMAL);
CreateProcess(NULL,"C:\\DrawRect.exe",NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi);
system、WinExec、ShellExecute这三个函数都是对CreateProcess的封装。接下来看下CreateProcess创建进程的入参。
CreateProcess()创建进程
- 创建进程内核对象,创建虚拟地址空间
- 装在EXE或DLL的代码和数据到地址空间中
- 创建主线程和线程内核对象
- 启动主线程,进入主函数(main)
启动记事本,并打开txt文件
结束进程
- ExitProcess
- VOID ExitProcess(UNIT uExitCode)
- TerminateProcess
- TerminateProcess(HANDLE hProcess ,UINT uExitCode)
Linux进程控制
创建进程fork()
- 新进程是当前进程的子进程
- 父进程和子进程
- 父进程:fork函数的调用者
- 子进程:新创建的进程
- 子进程是父进程的复制
- 父进程和子进程并发运行
// 创建进程函数声明 出错返回-1
// int fork(void);
// eg:
// int pid = fork();
int main(void){
int pid;
pid = fork();
if (pid == 0)
printf("Hello World!\n");
else if (pid > 0)
printf("How are you!\n");
}
/*
子进程是父进程的复制(包含数据 pid初始值0),子进程执行的代码
int main(void){
if (pid == 0)
printf("Hello World!\n");
else if (pid > 0)
printf("How are you!\n");
}
*/
执行代码
[root@host ~]# ./fork
Hello World!
How are you!
exec函数簇
- 功能
- 装入一个指定的可执行程序运行
- 使子进程具有和父进程【完全不同】的新功能
- 步骤
- 根据文件名找到相应的可执行程序
- 将可执行程序的内容填充到子进程的地址空间
- 进入新进程执行且不再返回