RT

解决方案 »

  1.   

    系统中执行的程序被称为进程。为了提高运行效率,进程可以被拆分成多个线程执行(需要程序本身支持,采用多线程编写方式编写),每个CPU在同一时刻,只能执行一个线程,一个线程执行完毕退出(或者自己主动进入睡眠状态)、线程等待其他外设(IO操作)、有更高优先级的中断发生(在vmstat命令输出中表现为一次in,即一次中断Interrupt)、或者达到了此线程最大允许运行时间,操作系统就会强制进行线程切换(在vmstat命令输出中表现为一次cs,即一次Content Switch),让CPU去执行另一个线程。在AIX操作系统中,所有等待执行的线程都放在运行队列里面,每隔10 ms,操作系统重新计算线程的优先级(也就是每隔10ms,线程的执行顺序会重新排列),CPU优先执行队列前面的几个线程(每个CPU执行一个线程,n个CPU的系统则可以同时执行队列前n个线程)。如果CPU正在执行一个线程,此线程的优先级在下次计算时就会被降低(当使用默认的调度模式时),因此如果一个线程长时间占据CPU,它的优先级会越来越低。如果下一次优先级计算的时候,另一个线程的优先级高于此线程,则CPU就会将此线程"踢"到等待队列里面(执行队列中靠后的位置),而去执行另一个更高优先级(执行队列中靠前的位置)的线程。线程本身也会由于IO、任务执行结束休眠等原因,自己降低执行优先级,而进入等待队列。
      

  2.   

    http://blog.csdn.net/qiqi5521/article/details/3496232
      

  3.   

    当一个线程刚刚创建时,它的相对线程优先级总是设置为正常优先级。
    CreateThread没有为调用者提供一个设置新线程的相对优先级的方法。若要设置和获得线程的
    相对优先级,必须调用下面的这些函数:BOOL SetThreadPriority(
       HANDLE hThread,
       int Npriority);hThread参数用于标识想要改变优先级的单个线程, nPriority参数是表中列出的7个
    标识符之一。关键时间    THREAD_PRIORITY_TIME_CRITICAL
    最高        THREAD_PRIORITY_HIGHEST
    高于正常    THREAD_PRIORITY_ABOVE_NORMAL
    正常        THREAD_PRIORITY_NORMAL
    低于正常    THREAD_PRIORITY_BELOW_NORMAL
    最低        THREAD_PRIORITY_LOWEST
    空闲        THREAD_PRIORITY_IDLE下面是检索线程的相对优先级的补充函数:int GetThreadPriority(HANDLE hThread);返回表中的标识符之一。
    若要创建一个带有相对优先级为空闲的线程,可以执行类似下面的代码:DWORD dwThreadID;
    HANDLE hThread = CreateThread(NULL,0,ThreadFunc,NULL,CREATE_SUSPENDED,&dwThreadID):
    SetThreadPriority(hThread,THREAD_PRIORITY_IDLE);
    ResumeThread(hThread);
    CloseHandle(hThread);
    注意,CreateThread函数创建的新函数带有的相对优先级总是正常优先级。若要使线程以
    空闲优先级来运行,应该将CREATE_SUSPENDED标志传递给CreateThread函数,这可以防止
    线程执行任何代码。然后可以调用SetThreadPriority,将线程的优先级改为相对空闲优先级。
    这时可以调用ResumeThread,使得线程成为可调度的线程。你不知道线程何时能够获得CPU时
    间,但是调度程序会考虑这样一个情况,即该线程拥有一个空闲优先级。最后,可以关闭新线
    程的句柄,一旦线程终止运行,内核对象就能被撤消。
    注意Windows没有提供返回线程的优先级的函数。这是故意进行的。记住,
    Microsoft保留了随时修改调度算法的权利。你不会设计需要调度算法专门知识的应用
    程序。如果坚持使用进程优先级类和相对线程优先级,你的应用程序不仅现在能够顺
    利地运行,而且在系统的将来版本上也能很好地运行。