使用线程时,如何降低CPU利用率?除了sleep方法之外。 如题。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 多线程的优劣/性能/系统开销线程创建之前1.系统为线程分配并初始化一个线程内核对象;2.系统为每个线程保留1MB的地址空间(按需提交)用于线程用户模式堆栈;3.系统为线程分配12KB(左右)的地址空间用于线程的内核模式堆栈。线程创建之后4.Windows调用当前进程中的每个DLL都有的一个函数,用来通知进程中的所有DLL,操作系统创建了一个新的线程。销毁一个线程时5.当前进程中的所有DLL都要接收一个关于该线程即将"死亡"的通知;6.线程的内核对象及创建时系统分配的堆栈需要释放。如果某台计算机只有一个CPU的话,则在某一时刻只有一个线程可以运行。Windows必须跟踪记录线程对象,而且不停地跟踪记录每个线程对象。Windows必须决定CPU下一个次(每隔约20毫秒)调度那一个线程使其运行。上下文切换(Context switch):Windows使CPU停止执行一个线程的代码,而开始执行另一个线程的代码的现象,我们称之为上下文切换。上下文切换的开销:1.进入内核模式;2.将CPU的寄存器保存到当前正在执行的线程的内核对象中。注明:X86架构下CPU寄存器占了大约700字节(Byte)的空间,X64架构下CPU寄存器大约占了1024(Byte)的空间,IA64架构下CPU寄存器占了大约2500Byte的空间。3.需要一个自旋锁(spin lock),确定下一次调度那一个线程,然后再释放该自旋锁。如果下一次调度的线程属于同一个进程,哪么此处开销更大,因为OS必须先切换虚拟地址空间。4.把即将要运行的线程的内核对象的地址加载到CPU寄存器中。5.退出内核模式。以上都是纯粹的开销,导致Windows和应用程序的执行速度比在单线程系统上的执行速度慢。综上所述:应尽量限制线程的使用。多线程的带来的好处:1.健壮性。此线程的错误不会影响彼线程。2.可扩展性。多个CPU情况下,可充分发挥多个CPU的优势。 CPU 的使用率是你的代码造成, 线程是无辜的 CPU 的使用率是你的代码造成, 线程是无辜的 使用线程时,如何降低CPU利用率?除了sleep方法之外。不开线程不就完事了吗呵呵 如何来做?给个思路吧?如果我在一个线程里面要循环读取大量数据,然后显示在控件上,如果我加了sleep的话,会有停顿的感觉。如果把sleep去了,则没有停顿的感觉,但是CPU利用率太高,影响了我数据的采集。如何能取消停顿,并且降低CPU利用率呢? 让线程进入阻塞状态.方法太多了.sleep.suspend.等待IO.等待内核对象.给个永远Enter不了的临界区.... 使用.net中的线程同步类,waithandle 及他的子类 实现所有线程(sleep)阻塞,设定延时后,在收到信号量时候再启动,这样,自己想怎么控制就这么控制了 根本上就是没有使用多线程, 读取的函数是运行在主线程上的, 所以 Thread.Sleep() 就把主线程给阻塞了, 所以才有停顿的感觉 征求系统权限设计方案 求助!窗口问题 怎么将查询类写成公共的? 急!急!急!哪位好心人帮帮小弟啊!!!!!万分感谢!!!!!!!!!! [ASP模式讨论] 比如在线ERP这些应用,有企业敢用吗? 如何在webform中在指定的背景上画图? 毕业设计求助关于图片显示 vs2005在编码时我不知道按了什么,前面空格出都变成....了,如何消除啊 这是一个自定义的webcontrol中事件处理部分的代码,可以解释一下吗?谢谢 如何解决修改项目文件夹名称后引用名跟随改变? 求助,局域网内远程控制,求思路。 ComboBox问题
多线程的优劣/性能/系统开销
线程创建之前
1.系统为线程分配并初始化一个线程内核对象;
2.系统为每个线程保留1MB的地址空间(按需提交)用于线程用户模式堆栈;
3.系统为线程分配12KB(左右)的地址空间用于线程的内核模式堆栈。
线程创建之后
4.Windows调用当前进程中的每个DLL都有的一个函数,用来通知进程中的所有DLL,操作系统创建了一个新的线程。
销毁一个线程时
5.当前进程中的所有DLL都要接收一个关于该线程即将"死亡"的通知;
6.线程的内核对象及创建时系统分配的堆栈需要释放。
如果某台计算机只有一个CPU的话,则在某一时刻只有一个线程可以运行。
Windows必须跟踪记录线程对象,而且不停地跟踪记录每个线程对象。
Windows必须决定CPU下一个次(每隔约20毫秒)调度那一个线程使其运行。
上下文切换(Context switch):Windows使CPU停止执行一个线程的代码,而开始执行另一个线程的代码的现象,我们称之为上下文切换。上下文切换的开销:1.进入内核模式;
2.将CPU的寄存器保存到当前正在执行的线程的内核对象中。
注明:X86架构下CPU寄存器占了大约700字节(Byte)的空间,X64架构下CPU寄存器大约占了1024(Byte)的空间,IA64架构下CPU寄存器占了大约2500Byte的空间。
3.需要一个自旋锁(spin lock),确定下一次调度那一个线程,然后再释放该自旋锁。
如果下一次调度的线程属于同一个进程,哪么此处开销更大,因为OS必须先切换虚拟地址空间。
4.把即将要运行的线程的内核对象的地址加载到CPU寄存器中。
5.退出内核模式。
以上都是纯粹的开销,导致Windows和应用程序的执行速度比在单线程系统上的执行速度慢。
综上所述:应尽量限制线程的使用。
多线程的带来的好处:
1.健壮性。
此线程的错误不会影响彼线程。
2.可扩展性。
多个CPU情况下,可充分发挥多个CPU的优势。
如何来做?给个思路吧?如果我在一个线程里面要循环读取大量数据,然后显示在控件上,如果我加了sleep的话,会有停顿的感觉。
如果把sleep去了,则没有停顿的感觉,但是CPU利用率太高,影响了我数据的采集。
如何能取消停顿,并且降低CPU利用率呢?
方法太多了.
sleep.
suspend.
等待IO.
等待内核对象.
给个永远Enter不了的临界区....
实现所有线程(sleep)阻塞,设定延时后,在收到信号量时候再启动,这样,自己想怎么控制就这么控制了
根本上就是没有使用多线程, 读取的函数是运行在主线程上的, 所以 Thread.Sleep() 就把主线程给阻塞了, 所以才有停顿的感觉