一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程称为进程。简言之,进程是程序的一次执行活动,即进程就是程序的一次执行,是一个动态的过程。
随着技术发展,为了最大化利用内存资源,又引入了进程优先级。一些低优先级进程可能等待较长时间,从而被对换至外存。目的是:
1.提高处理机效率:就绪进程表为空时,OS将阻塞进程从内存中“挂起”到磁盘的“挂起队列”,再从该队列选另一进程进入内存,或接受一个新进程的请求。
2.为运行进程提供足够内存:资源紧张时,暂停某些进程,如:CPU繁忙(或实时任务执行),内存紧张
3.用于调试:在调试时,挂起被调试进程(从而对其地址空间进行读写)
之后便得到了双挂起的进程状态转化模型
下面有一个简单程序解释了进程的状态转化
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <WinBase.h>
using namespace std;
void SubThread(){
int i;
for(i=0;i<5;i++){
cout<<"SubThread "<<i<<endl;
Sleep(2000);
}
}
void main(){
cout<<"CreatThread"<<endl;
//创建新进程
DWORD IDThread;
HANDLE hThread;
hThread=CreateThread(NULL, // no security attributes
0, // use default stack size
(LPTHREAD_START_ROUTINE)SubThread, // thread function
NULL, // no thread function argument
0, // use default creation flags
&IDThread); // returns thread identifier
if(hThread==NULL)
cout<<"Creat Thread error"<<endl;
int i;
for(i=0;i<5;i++){
cout<<"Main Thread "<<i<<endl;
if(i==1){
if(SuspendThread(hThread)==0xFFFFFFFF)
cout<<"Suspend thread error"<<endl;
else
cout<<"Suspend thread is ok"<<endl;
}
if(i==3){
if(ResumeThread(hThread)==0xFFFFFFFF)
cout<<"Resume thread error"<<endl;
else
cout<<"Resume thread id ok"<<endl;
}
Sleep(4000);
}
}
输出的结果应该是:
CreateThread
MainThread 0
SubThread 0
SubThread 1
MainThread 1
Suspend thread is ok
MainThread 2
MainThread 3
Resume thread is ok
SubThread 2
SubThread 3
MainThread 4
SubThread 4
这个程序分析的要点就在于:父进程运行到Sleep()时被挂机起到外存,处于就绪队列中的子进程开始运行。即时刻关注处于内存的Ready队列和处于外存的Ready队列(被挂起)。(此处不考虑双cpu等特殊情况)改变Sleep()中的值会导致输出结果的改变。