加深理解进程基本状态转化
2017-09-25 15:12
274 查看
一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程称为进程。简言之,进程是程序的一次执行活动,即进程就是程序的一次执行,是一个动态的过程。
随着技术发展,为了最大化利用内存资源,又引入了进程优先级。一些低优先级进程可能等待较长时间,从而被对换至外存。目的是:
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); 99c0 // 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()中的值会导致输出结果的改变。
相关文章推荐
- 进程状态一步步理解Linux进程(1)--进程基础知识
- 简单理解Hibernate三种状态的概念及互相转化
- 函数调用入栈基本步骤(感觉和进程的栈帧结构一块看会比较容易理解)
- 进程的状态以及状态转化图、导致转化的事件
- 进程的三个基本状态,以及三个状态之间切换的条件
- 进程的五种基本状态 - 操作系统
- 辛星浅析Linux中的进程基本知识以及fork的简单理解
- 操作系统学习笔记--进程的三种基本状态
- 进程的三种基本状态
- 进程的三种基本状态及其转换
- 学习笔记--进程的三种基本状态及其转换
- 进程基本概念理解
- 多线程(2):进程的三种基本状态及其转换
- 第三章:Creating Applications and activities-(五)理解应用的优先级以及进程状态
- 进程的三种基本状态
- 理解应用程序优先级和进程状态
- 简单理解Hibernate三种状态的概念及互相转化
- 进程的基本状态及其转换
- 进程的三个基本状态,以及三个状态之间切换的条件
- 函数调用入栈基本步骤(感觉和进程的栈帧结构一块看会比较容易理解)