Chinaunix首页 | 论坛 | 博客
  • 博客访问: 372396
  • 博文数量: 50
  • 博客积分: 1495
  • 博客等级: 上尉
  • 技术积分: 805
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-21 14:19
文章分类

全部博文(50)

文章存档

2011年(47)

2010年(3)

分类: LINUX

2011-04-13 15:45:13

进程的一些重要概念

       最近开始学习进程和线程,一些重要的概念老是会迷惑,比如挂起、阻塞等一些重要的概念。在网上找了些资料,也参考了一些书籍,顺便做下笔迹。

 

进程的组成

 

程序: 描述了进程所要完成的功能。 是进程存在的物质基础。  
数据: 是程序加工的对象。  
进程控制块PCB:用来描述进程的一切静态和动态的特征,操作系统只能通过它来感知和管理进程。每个进程都有且仅有一个进程控制块。 

 进程控制块的内容:PCB的具体内容随不同系统而异,一般包括以下信息: 
 进程标识: 唯一地标识进程的名称或代码 
 进程状态: 标识进程是运行态、就绪态或阻塞态  
进程实体: 指示进程的程序部分和数据部分在存储器中的位置和大小  
调度信息(优先数): 确定就绪进程转为运行进程的优先级  
资源信息: 描述内存占用、外设占用等信息  
现场信息: 包括程序计数器、程序状态字、累加器、变址寄存器的当前值  
进程通信信息:用于进程间的通信

 

就绪状态

       进程以获得了CPU之外的所有资源,处于就绪态的进程有多,它们存放在就绪队列中。

 

执行状态

       处于就绪状态的进程,只要获得CPU,就可以执行。

 

阻塞(pend)

       进程因发生某个事件(请求IO、申请缓冲空间)而暂停执行的状态。即进程的执行受到阻塞(等待、睡眠)此时即使CPU空闲,进程也无法使用。

阻塞是一种能够被动行为,是在等待事件OR资源时任务的表现,你不知道它什么时候被pend,也就不能确切的它什么时候恢复。

阻塞会使任务释放CPU,让其他任务可以运行。

挂起(suspend)

       挂起是主动的行为,因此恢复也应该要主动完成。比如使用pause函数时,使进程挂起直到捕捉到一个信号。挂起是不释放CPU,如果任务优先级高就永远轮不到其他任务运行(但是这是不可能的,因为每发生一次时钟Tick也就是时钟中断,进程的优先级就会降低一次。)

 

       一些关于阻塞和挂起的理解

理解一:挂起是一种主动行为,因此恢复也应该要主动完成,而阻塞则是一种被动行为,是在等待事件或资源时任务的表现,你不知道他什么时候被阻塞(pend),也就不能确切的知道他什么时候恢复阻塞。而且挂起队列在操作系统里可以看成一个,而阻塞队列则是不同的事件或资源(如信号量)就有自己的队列。 

理解二:阻塞(pend)就是任务释放CPU,其他任务可以运行,一般在等待某种资源或信号量的时候出现。挂起(suspend)不释放CPU,如果任务优先级高就永远轮不到其他任务运行,一般挂起用于程序调试中的条件中断,当出现某个条件的情况下挂起,然后进行单步调试。 

理解三:pendtask主动去等一个事件,或消息.suspend是直接悬挂task,以后这个task和你没任何关系,任何task间的通信或者同步都和这个suspended task没任何关系了,除非你resume task; 

理解四:任务调度是操作系统来实现的,任务调度时,直接忽略挂起状态的任务,但是会顾及处于pend下的任务,当pend下的任务等待的资源就绪后,就可以转为ready了。ready只需要等待CPU时间,当然,任务调度也占用开销,但是不大,可以忽略。可以这样理解,只要是挂起状态,操作系统就不在管理这个任务了。 

理解五:挂起是主动的,一般需要用挂起函数进行操作,若没有resume的动作,则此任务一直不会ready。而阻塞是因为资源被其他任务抢占而处于休眠态。两者的表现方式都是从就绪态里清掉,即对应标志位清零,只不过实现方式不一样。

 

 

参考网址

http://www.cublog.cn/u3/102267/showart_2239495.html


水平有限,如果有错误的地方,请指正,thanks

cjok.liao@gmail.com

阅读(2064) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~