技术开发 频道

WinCE陷进程死锁 马儿光吃草不快跑

  【it168 专稿】进程、线程是Windows CE内核最基本的服务,也是内核最主要的组成部分。这两方面的知识是一个嵌入式软件开发人员必须掌握的基础知识,只有掌握了这些知识,才能够充分利用Windows CE系统内核提供的服务,使所开发的嵌入式应用软件更稳定、更健壮。

  一般来说,每一种使用线程的操作系统中都存在线程死锁问题,我在Windows CE.NET程序开发中就曾碰到死锁的问题,并为此一度束手无策。本文分享我在Windows CE.NET系统开发中对线程死锁的一些认识。

  一.什么是Windows CE.NET线程死锁?

 (1)什么是线程

  在谈到线程死锁的时候,我们首先必须了解什么是线程。Windows CE.NET是一个抢占多任务操作系统,抢占多任务又称为调度。在调度过程中,内核的调度系统包含一个当前所有进程中线程的优先级列表,并对所有的线程按优先级排列顺序。当中断发生时,调度系统重新安排所有线程的排列顺序。一个线程是一个执行单元,它控制CPU执行进程中某一段代码段。Windows CE.NET最多可支持32个进程同时运行,这是由整个系统分配给所有进程的总地址空间决定的。

  Windows CE.NET操作系统具有实时性,所以调度系统必须保证高优先级线程先运行,低优先级线程在高优先级线程终止后或者阻塞时才能得到CPU时间片。而且一旦发生中断,内核会暂停低优先级线程的运行,让高优先级线程继续运行,直到终止或者阻塞。简单的说是:具有相同优先级的线程平均占有CPU时间片,当一个线程使用完了 CPU时间片或在时间片内阻塞、睡眠,那么其他相同优先级的线程才会占有时间片。

  线程有五种状态,分别为运行、挂起、睡眠、阻塞、终止。Windows CE.NET不像其他Windows操作系统将进程分为不同的优先级类,Windows CE.NET只将线程分为256个优先级。0优先级最高,255最低,0到248优先级属于实时性优先级,一般分配给实时性应用程序、驱动程序、系统程序。248到 255优先级一般分配给普通应用程序线程使用,其中251优先级(THREAD_PRIORITY_NORMAL)是正常优先级,255优先级(THREAD_PRIORITY_IDLE)为空闲优先级,249优先级(THREAD_PRIORITY_HIGHEST)是高优先级。

  (2)什么是线程死锁
  嵌入式系统中,因系统的资源分配策略不当,最常见的是进程因资源竞争不当而产生死锁的现象。所谓死锁(Dead Lock)是指两个或两个以上的并发进程在执行过程中,如果每个进程持有某种资源而又都在等待别的进程释放它们现在保持着的资源,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法进行下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。
 

0
相关文章