⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 系统调度.txt

📁 wince下的相关试验 介绍的很详细 有关于PLATFORM BUILDER详细的介绍 希望对大家有帮助
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  windows ce内核是Windows ce操作系统的核心,内核为基于Windows ce的设备提供了基本的操作系统功能,其中包括进程、线程、内存管理及一些文件管理功能等。内核服务使应用程序能够使用这些核心功能。
  内核是核心操作系统其他部分的管道,它将核心操作系统的各个部分串联成一个有机整体。
  Win32文件包含称为模块的可执行代码,Windows e支持两种类型的模块:应用程序和动态链接库。当windows ce加载一个应用程序时,它就产生了一个进程,一个进程就是一个应用程序的实例。在一个windows ce系统中,假如有两个microsoft wordpat在运行,那么就意味着这个系统有两个独立的进程在运行,每个进程都有它自己受保护的、32M的地址空间。每个进程至少有一个线程,但也可能有多个线程,一程是执行在一个进程之内的代码。多个进程使用户可以同时工作于多个应用程序,而多个线程可以使一个应用程序同时完成多个任务。
  Windows ce是一个抢占式实时多个任务的操作系统,抢占多任务又称为调度。在调度过程中,内核维护一个当前操作系统所有线程的优先级列表。每个进程可能包含多个线程,而每个线程都是一个可执行单元。调度系统控制这些执行单元的执行顺序,并允许它们相互之间以可预测的方式交换数据。当中断发生时,调度系统重新排列所有线程的优先级。 Windows ce的每一个运行的应用程序都是一个进程,每个进程又可能包含多个线程,线程优先级、优先级的倒置处理、中断支持、定时与调度等使windows ce为时间关键性任务提供实时支持。
2.4.1模块
  Windows ce下的模块由exe文件和dll文件组成,从本质上讲,它们都是可执行文件,都遵守PE文件格式,微小的并别就在于定义它们的文件头不同。但在实际应用中,它们却有着明显的差导。
  exe是可以独立回载的模块,当一个exe模块被加载时,系统首先会为它创建一个单独的32MB的地址空间并导入相应的外部函数,初始化静态数据区,产生本地堆并产生一个线程,然后再跳转到模块的入口点。
  另一方面,DLL是不能独立加载的模块,它必须由一个正在运行的exe模块或另一个DLL模块加载。D男排加载有两种方式:隐式加载方式 和显示加载方式。隐式加载方式 是当一个exe模块的导入表中包含一个或多个DLL时,那么当这个exe开始加载时,导入表中所有的DLL也会随之被自然回开车到这个进程的地址空间。同样,DLL模块也包含一个导入表,如果这个由exe加载的DLL模块的导入表中又包含别的模块,那么这个别的DLL模块也会被接着加载到这个exe模块的进程空间。显式加载方式是操作系统不会自动去加载DLL模块,而必须通过编程由应用程序调用相应的函数来加载。
  DLL的显示加载可以使用两个函数,使用LoadLibrary(或LoadLibraryEx),或者使用LoadDriver。LoadLibrary与LoadDriver的差别在于它们使用内存的方式不同,LoadLibrary不是一次性将整个DLL模块都加载到内存,而是以页面的方式使用内存;而LoadDriver是将整个DLL模块都加载到内存,而直到不使用时再释放,这对于实时系统非常重要,一次性将整个模块都锁定到内存,可以节省浪费在频繁的内存加载和卸载上的时间。DLL的模块的卸载都可以通过调用FreeLibrary来完成。
2.4.2进程
  Windows ce是一个多进程操作系统,并支持最多32个进程。每个进程拥有它自己32MB大小的私有地址空间,而Windows xp进程拥有2GB的地址空间。
  Windows ce将进程的数量限制为最多可以同时运行32个进程,这正好为一个DWORD的位。虚拟内存系统和内核管理处理逻辑使用一个32位的位掩码作为访问键,每个进程句柄都有一个指出允许哪些应用程序访问它的位掩码,这是处理资源保护的一种快速而有效的方式。32个同时运行的进程对于绝大多数嵌入式设备是一个合理的限制。
  当Windows ce启动时,系统一般会加载4个进程:Ne.exe、filesys.exe、GWES和Device.exe。所以用记可加载的实际进程数约24个左右。
  当启动一个应用程序时,应用程序进程会与主线程一起启动,主线程为运行应用程序提供必要的资源。如果需要,一个进程可以创建另外的线程,一个进程所能创建的线程数是没有上限的,在实际的设备中,它受到设备实际可用RAM及线程栈的可用进程地址空间的约束。
  有多种方式 可以启动一个进程,a.是系统启动时由系统自动加载,这可以通过相应的注册表设置来实现;b.系统启动后,可以通过操作键盘和鼠标进行加载;c.隐式加载方式,通过一个正在运行的进程加载启动另一个进程。
  一个进程的退出也有多种方式,最常见的方式是当应用程序退出,即从WinMain调节器用返回时,这个应用程序进程退出;另一种方式是当在一个进程的主线程中调用了ExitThread函数时,这个应用程序进程退出;还有一种方式是在当要从一个进程中终止另外一个进程时,使用TerminateProcess函数,一般用于无条件地结束一个进程及其所有的线程,并通知要终止的进程所加载的的有DLL指定的进程将要终止。
2.4.3线程
  一个线程是可执行单元,当操作系统创建一个进程时,同时也会至少创建一个线程,使用线程是为了尽可能有效地利用CPU时间。一个进程可能包含多个线程,每个线程都共享包括进程地址空间在内的所有资源。每个线程都有自己的栈包含CPU寄存器的状态。当一个线程被挂起时,寄存器里的值被推进栈,活动找被切换到下一个将要运行的线程。一个线程的主进程的栈大小是由编译时链接器设置的,默认大小为64KB,其他线程的栈大小默认为主线程相同,但这个默认的栈大小在线程创建时可以被重新设置。
  一个进程内的所有线程共享这个进程的地址空间,由一个线程分配的内存对于进程内的所有线程都是可访问的,这些线程具有相同的访问权限。但对于不同进程的线程之间的访问,其权限受到限制,需要通过进程间通信来进行处理协调。
  一个进程内的每个线程都是独立操作的,除非使它们互相可见,否则,它们各自执行并互相意识不到其他线程的存在。
  线程有5种状态,分别为:运行、挂起、休眠、阻塞和终止。当系统内的所有线程都处于阻塞状态时,windows ce系统进入空闲状态,这时,CPU停止执行指令并降低功耗。当没有进一步的操作时,OEM或应用程序可以控制系统从空闲状态进入挂起状态。
  哪个进先运行哪个进程后运行,以及一个线程什么时候运行都是由内核调度系统来控制的。线程运行的顺序由线程的优先级来决定,而每个线程运行一次的时间由线程量来控制。
2.4.3.2线程的优先级
  从3.0版本开始,Windows ce就支持0-255共256个优先级,其中0优先级最高,255优先级最低。在同一进程中可以使用所有256个优先级,每个线程都有自己的优先级。在256个优级中,0-248属地实时性优先级。
  windows ce系统是根据线程的优先级和线程量来高度每个线程的。线程量是分配给线程运行一次占用的CPU时间片。windows ce操作系统的实时性就是依靠对优先级和时间片的控制来达到的。其中高优先级、低线程量是保证实时性的关键。优先级高的线程先运行,优先级低的线程后运行。高优先级的线程可以中断低优先级的线程,而低优先级的线程不能中断高优先级的线程。
2.4.3.3线程优先级的倒置
  Windows ce支持优先级的倒置,它是指在使互斥体、关键区或信号量的情况下,当低优先级线程与高优级线程竞争同一个资源时,低优先级的线程延迟了高优先级线程的执行。为了修正这种情况并释放更高优先级的线程,低优先级的线程延迟了高优先级线程的执行。为了修正这程情况并释放更高优先级的线程,windows ce允许低优先级的线程继承更多关键线程的优先级并在高优先级运行,直到它所使用的共享资源被释放。由于释放倒置的线程所需要的时间是不确定的,并且OEM失去对调度进程的控制,为了保证实时性能,OEM应该保证不会出现优先级倒置。
  如有三个线程,基中线程3先被创建,接着线程2和线程1也被创建,但由于线程1的优先级高于线程2的优先级,线程2的优先级高于线程3的优先级,所以线程1先运行,但当线程式运行到某一点时发现它所需要的资源被线程3占用,为此,高度系统会有意将线程3的优先级升高到线程1的优先级,让线程3先运行,当线程3运行到某一点将线程1所需要的共享资源释放出来时,线程1接着运行,而线程3阻塞,调度系统将线程3优先级恢复到原来的值。为了保证系统的实时性,Windows ce操作系统只允许出现一级的优先级倒置。如果系统出现了共享资源的多级嵌套,那么windows ce操作系统将无法进行处理,其结果将最终导致系统出现死锁。因此,OEM和系统开发者应该仔细测试自己的每一个线程,保证不会出现资源共享嵌套。
2.4.3.4线程量控制
   线程量是线程在一个CPU时间片的持续时间。
  每个windows ce系统都有一个默认的线程量,通常是100ms,但是OEM可以改变这个默认值,通过在OALr OemInit函数中设置dwDefaultThreadQuantum全局变量的值来达到,默认线程量必须大于0。在实时性要较强的系统中,100ms的线程量显然有些大,所以,将它设置为更小的值显得尤为重要。
2.4.4纤程
  纤程是另一个可在应用程序中使用的多线程对象。事实上,纤程是手工安排的执行线程,纤程不由调度系统来决定何时运行,而是由开发人员来决定。纤程运行在调度它的线程上下文中,每个线程可以调度多个纤程。
  一般来讲,纤程没有提供良好设计的、多线程应用程序的优点,可是,使用纤程能够处理那些设计用来调度它们自己线程的应用程序更容易。
  从系统的观点,一个纤程呈现产生它的线程的特性,例如,如果一个纤程访问线程本地存储,那么它也就是在访问产生它的那个线程的线程式本地存储。另外,如果一个exitThread函数,产生它的线程也将退出。可是,一个纤程不具有与产生它的线程相关的所有相同的状态信息,一个纤程表现出来的唯一状态信息是它的栈(它的寄存器的一个子集)和在纤程产生过程中提供的纤程数据。
  纤程不会被抢先调度的,您可以通过从一个纤程切换到另一个纤程来调度一个纤程,系统还在调度要运行的线程,当一个运行纤程的线程被抢先时,它当前正在运行的纤程也被抢先,当线程运行时这个纤程也在运行。
2.4.5同步对象
  当处理多线程操作系统时,会存在多个线程试图访问同一资源的情况,为了保证获得稳定的结果,必须使同步来协调各个线程的活动。在windows ce中,采用同步对象来解决。同步对象包括:关键区、互斥体、信号量、事件、互锁函数及点对点的消息队列。
2.4.5.1关键区
   关键区是一个进程特定的对象,可以使它来协调同一进程当中两个线程之间的活动。可以将它定义为一个全局变量,可以通过调用InitializeCriticalSection来初始化一个关键区。
  在任何时刻只能有一个线程拥有关键区.
2.4.5.2互斥体
  互斥体也能用协调对共享资源的访问。互斥体有点像接力赛跑中的接力捧,要想“跑”的线程应该等待当前正在“跑”的线程将接力棒传递过来。拥有单一访问资源的线程创建互斥体,所有想要访问该资源的线程应该在实际操作之前获得互斥体,而在访问结束时立即释放互斥体,这就允许下一个等待线程获得互斥体,然后接着运行下去。
  为了获得对一斥体保护资源的访问,一个线程需要调用WaitForSiingleObject,这空虚函数在当访问的资源可用时返回,或在超时时终止,超时被指定为毫秒为单位的一个函数参数。
  
关键区与互斥体的差别:关键区只能用于单个的进程中两个线程之间的同步,而互斥体能够跨越进程的边界,可用于两个进程间线程的同步。关键区和互斥体相比这的一个优点是关键区比互斥体运行速度快。驱动程序常常使用关键区,因为一个驱动程序常常是在一个进程中。
2.4.5.3信号量
  信号量对象是有一个计数器的互斥体,windows ce从3.0版本开始支持信号量。如果希望限制访问一个资源的线程的数量,信号量是很有用的。例如,为了避免性能瓶颈,一个web服务器可能限制一组特定页面的访问线程数。
  每当另一个线程申请访问互斥体保护的资源时,当前线程就调用内核的等待函数,这使得信号量对象检查其当前计数器值,如果计数器值大于0,内核就发出申请线程可以进入的信号;如果计数器值等于0,那么申请线程就还是处挂起状态。
2.4.5.4互锁函数
  互锁函数用于同步多个线程间共享变量的访问,它可以防止当一个线程正在增加、减少或检查一个共享变量的值时被另一个线程抢先。
  互锁函数是个轻量级内核API,不能用来保护线程与另一进程共享的数据。
2.4.5.5事件
  事件对象是一种人造的信号,用于通知同一进程或不同进程的某个线程完成某个任务或出现了某个事件,以使线程下一步完成这个任务或响应这个事件。局部定义的事件对象只能用于进程之内,而全局定义的事体对象允许进程间的同步。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -