单核多线程与多核多线程的区别---总结
2015-09-20 10:29
405 查看
在单核时代,多线程就有很广泛的应用,这时候多线程大多用于降低阻塞(意思是类似于
while(1)
{
if(flag==1)
break;
sleep(1);
}
这样的代码)带来的CPU资源闲置,注意这里没有浪费CPU资源,去掉sleep(1)就是纯浪费了。
阻塞在什么时候发生呢?一般是等待IO操作(磁盘,数据库,网络等等)。此时如果单线程,CPU会干转不干实事(与本程序无关的事情都算不干实事,因为执行其他程序对我来说没意义),效率低下(针对这个程序而言),例如一个IO操作要耗时10毫秒,CPU就会被阻塞接近10毫秒,这是何等的浪费啊!要知道CPU是数着纳秒过日子的。
所以这种耗时的IO操作就用一个线程Thread去代为执行,创建这个线程的函数(代码)部分不会被IO操作阻塞,继续干这个程序中其他的事情,而不是干等待(或者去执行其他程序)。
同样在这个单核时代,多线程的这个消除阻塞的作用还可以叫做“并发”,这和并行是有着本质的不同的。并发是“伪并行”,看似并行,而实际上还是一个CPU在执行一切事物,只是切换的太快,我们没法察觉罢了。例如基于UI的程序(俗话说就是图形界面),如果你点一个按钮触发的事件需要执行10秒钟,那么这个程序就会假死,因为程序在忙着执行,没空搭理用户的其他操作;而如果你把这个按钮触发的函数赋给一个线程,然后启动线程去执行,那么程序就不会假死,继续相应用户的其他操作。但是,随之而来的就是线程的互斥和同步、死锁等问题,详细见有关文献。 http://blog.csdn.net/delacroix_xu/article/details/5928121
while(1)
{
if(flag==1)
break;
sleep(1);
}
这样的代码)带来的CPU资源闲置,注意这里没有浪费CPU资源,去掉sleep(1)就是纯浪费了。
阻塞在什么时候发生呢?一般是等待IO操作(磁盘,数据库,网络等等)。此时如果单线程,CPU会干转不干实事(与本程序无关的事情都算不干实事,因为执行其他程序对我来说没意义),效率低下(针对这个程序而言),例如一个IO操作要耗时10毫秒,CPU就会被阻塞接近10毫秒,这是何等的浪费啊!要知道CPU是数着纳秒过日子的。
所以这种耗时的IO操作就用一个线程Thread去代为执行,创建这个线程的函数(代码)部分不会被IO操作阻塞,继续干这个程序中其他的事情,而不是干等待(或者去执行其他程序)。
同样在这个单核时代,多线程的这个消除阻塞的作用还可以叫做“并发”,这和并行是有着本质的不同的。并发是“伪并行”,看似并行,而实际上还是一个CPU在执行一切事物,只是切换的太快,我们没法察觉罢了。例如基于UI的程序(俗话说就是图形界面),如果你点一个按钮触发的事件需要执行10秒钟,那么这个程序就会假死,因为程序在忙着执行,没空搭理用户的其他操作;而如果你把这个按钮触发的函数赋给一个线程,然后启动线程去执行,那么程序就不会假死,继续相应用户的其他操作。但是,随之而来的就是线程的互斥和同步、死锁等问题,详细见有关文献。 http://blog.csdn.net/delacroix_xu/article/details/5928121
相关文章推荐
- JVM的内存分配原理
- Java运算符
- WPF中的依赖项属性
- iOS开发性能优化的25个tips
- iOS runtime 根据类名获取属性的类型和名称
- 替换从数据库中读取的一段文字中的某些标签及标签之间的内容
- linux常用命令(36):free 命令
- 关于图片或者文件在数据库的存储方式归纳
- VC6.0注释快捷键
- 如何学习分布式
- MVC5 学习笔记1
- 精讲母函数
- 2015/9/20开始
- selenium 浏览器操作
- rpc框架之 thrift 学习 1 - 安装 及 hello world
- python学习:HTML转换成doc
- 中间缓存变量机制
- Java的基础语法
- Netbeans做的计算器界面
- UVa1709——Amalgamated Artichokes