windows线程,windows查看线程数

http://www.itjxue.com  2023-01-14 19:52  来源:未知  点击次数: 

解析windows线程调度策略

1.主动切换

一个线程可能因为进入等待状态而主动放弃处理器的使用,此时Windows 2000/XP将选杼一个新线程开始运行。许多WIN32等待函数调用(如WaitForSingkObject或WaitFor-MultipkObjects等)都使线程等待某个对象,等待的对象可能有事件、互斥信号量、资源信号M、I/O操作、进程、线程、窗口消息等。如果进入等待线程的时间配额有剩余,在等待事件出现时,线程的时间配额被减1,相当于1/3个时钟间隔;如果线程的优先级大于等于14,在等待事件出现时,线程的优先级被重置。

2.抢先

当一个高优先级线程的等待完成,即一个线程等待的事件出现,高优先级线程进入就绪状态,或者一个线程的优先级被增加或减少,出现正在处于运行状态的低优先级线程低于就绪队列中的某个线程时,系统都要确定是否让当前线程继续运行或当前线程是否要被一个高优先级线程抢先。在Windows 2000/XP中的用户态下运行的线程也可以抢先内核态下运行的线程。在判断一个线程是否被抢先时,并不考虑线程处于用户态还是内核态,调度器只是依据线程优先级进行判断。

当线程被抢先时,它被放回相应优先级的就绪队列的队首。处于实时优先级的线程在被抢先时,时间配额被重置为一个完整的时间片;而处于动态优先级的线程在被抢先时,时间配额不变,重新得到处理器使用权后将运行到剩余的时间配额用完。

3.时间配额用完

当一个处于运行状态的线程用完它的`时间配额时,Windows 2000/XP首先必须确定是否需要降低该线程的优先级,然后确定是否需要调度另一个线程进入运行状态。

如果刚用完时间配额的线程的优先级被降低了,Windows 2000/XP将寻找一个更适合的线程进入运行状态,所谓更适合的线程是指优先级高于刚用完时间配额的线程的新设S值的就绪线程。如果刚用完时间配额的线程的优先级没有降低,并且有其他优先级相同的就绪线程,Windows 2000/XP将选杼相同优先级的就绪队列中的下一个线程进入运行状态,刚用完时间配额的线程被排到就绪队列的队尾(即分配一个新的时间配额并把线程状态从运行状态改为就绪状态如果没有优先级相同的就绪线程可运行,刚用完时间配额的线程将得到一个新的时间配额并继续运行。

4.线程运行结束

当线程完成运行时,它的状态从运行状态转到终止状态。此时系统将处理器调度给另一个线程。线程完成运行的原因可能是通过调用ExhThread而从主函数中返回或被其他线程通过调用TerminateThread来终止。如果处于终止状态的线程对象上没有未关闭的句柄,则该线程将被从进程的线程列表中删除,相关数据结构将被释放。

WINDOWS操作系统中可以允许最大的线程数

这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。

32位线程默认栈空间大小是1M,在我的64位的电脑上,32位的程序的最大虚拟内存是4G,所以线程数最多是4096个(4G/1M)。

64位的程序虚拟内存可达8T,目前来说可以支持一个巨大的线程数。但是受限于实际的物理内存大小。如果内存限制忽略不计的话,下面的表格可以最大线程数:

附:Win32将低区的2GB留给进程使用, 高区的2GB则留给系统使用。

Linux将高位1GB留给内核,低位3GB留给进程。

Windows线程同步的四种方式

在多线程的程序中,很少有多个线程能在其生命期内进行完全独立的操作;通常情况是一些线程进行某些操作,而其他的线程必须对其操作后的结果进行了解。如果不采取同步机制,其他线程会在线程处理任务前访问处理结果,这样会产生错误的了解。例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题;若一个线程负责写操作,其他线程负责读取操作,则不能保证读取的就是修改过的值,这时就必须在变量写操作过程时加上访问限制,在写操作完成后解除访问限制。这种保证线程能正确获取其他线程处理结束后的结果的措施称为线程同步。

线程同步的四种方式:

临界区(Critical Section) :通过对多线程的串行化来访问公共资源或一段代码,本身不是内核对象,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开。临界区被释放后,其他线程才可以抢占。

【初始化临界区】

【删除临界区】

【获取临界区】

【释放临界区】

临界区在使用时,以 CRITICAL_SECTION 结构对象保护共享资源,并分别用 EnterCriticalSection() 和 LeaveCriticalSection() 函数占有和释放一个临界区。所用到的 CRITICAL_SECTION 结构对象必须经过 InitializeCriticalSection() 的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下。否则临界区将不会起到应有的作用,共享资源依然有被破坏的可能。

【示例】

互斥量(Mutex) :只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

【创建互斥量】

【销毁互斥量】

【获取互斥量】

【释放互斥量】

互斥量被某一线程获取时为 non-signaled 状态,释放时进入 signaled 状态。因此,可以利用 WaitForSingleObject 函数验证互斥量是否已分配。互斥量在 WaitForSingleObject 函数返回时自动进入 non-signaled 状态,因为它是“ auto-reset ”模式的内核对象。

【示例】

信号量( Semaphore ) 是维护0到指定最大值之间的同步对象。信号量状态在其计数大于0时是有信号,而其计数是0时是无信号的。信号量对象在控制上可以支持有限数量共享资源的访问。

信号量的特点和用途可用下列几句话定义:

【创建信号量】

【释放信号量】

【打开信号量】

【销毁信号量】

【示例】

事件(Event) :是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false)。根据状态变迁方式的不同,事件可分为两类:

【创建事件】

当第二个参数传入TRUE时将创建manual-reset模式的事件对象,此时即使WaitForSingleObject函数返回也不会回到non-signaled状态。因此,在这种情况下,需要通过如下2个函数明确更改对象状态。

【打开事件】

【复位事件】

【设置事件】

传递事件对象句柄并希望改为non-signed状态时,应调用ResetEvent函数。如果希望改为signaled状态,则可以调用SetEvent函数。

【示例】

windows线程与窗口之间的关系?

1,一个进程至少拥有一个线程,称为主线程,如果一个线程创建了窗口,拥有GUI资源,那么也称该线程为 GUI线程 ,否则就为 工作线程 。窗口是由线程创建的,创建窗口的线程就拥有该窗口。这种线程拥有关系的概念对窗口有重要的意义:建立窗口的线程必须是为窗口处理所有消息的线程。为了使这个概念更加明确具体,可以想像一个线程建立了一个窗口,然后就结束了。

??????在这种情况下,窗口不会收到一个WM_DESTROY或WM_NCDESTROY消息,因为线程已经结束,不可能被用来使窗口接收和处理这些消息。每个线程,如果它至少建立了一个窗口,都由系统对它分配一个消息队列。这个队列用于窗口消息的派送(dispatch)。为了使窗口接收这些消息,线程必须有它自己的消息循环,消息循环一般如下:

??????应用程序不断的从消息队列中获取消息,然后系统通过DispatchMessage函数分派消息到相应窗口的窗口过程,使得消息得到处理。当获取到WM_QUIT消息时,GetMessage返回0,循环结束。

windows 如何查看线程数量

一、利用设备管理器

1、右键单击Win10开始按钮,点击菜单中的“设备管理器”。

2、在Widows10设备管理器窗口,点开处理器项目,我们就能查看CPU线程数了。

二、利用任务管理器

1、Win10任务栏空白处单击鼠标右键,菜单中点击选择“任务管理器”。

2、在任务管理器窗口切换至“性能”,对着CPU利用率图形界面,单击鼠标右键,鼠标指向菜单中的“将图形更改为”,点击选择次级菜单中的“逻辑处理器”。

3、随后出现几个图形,就是几个线程。

windows系统中的进程和线程的区别

1、windows里的进程/线程是继承自OS/2的。在windows里,"进程"是指一个程序,而"线程"是一个"进程"里的一个执行"线索"。从核心上讲,windows的多进程与Linux并无多大的区别,在windows里的线程才相当于Linux的进程,是一个实际正在执行的代码

(责任编辑:IT教学网)

更多

推荐微软认证文章