扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本文由以下文章参考整理:
http://www.cnblogs.com/Eva-J
https://www.jb51.net/article/102004.htm
创新互联-专业网站定制、快速模板网站建设、高性价比伊美网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式伊美网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖伊美地区。费用合理售后完善,十余年实体公司更值得信赖。
进程:拥有自己独立的堆和栈,既不共享堆,也不共享栈,进程由操作系统调度;
线程:拥有自己独立的栈和共享的堆,共享堆,不共享栈,标准线程由操作系统调度;
协程:拥有自己独立的栈和共享的堆,共享堆,不共享栈,协程由程序员在协程的代码里显示调度
# 例,进一步讲述“线程和协程”之间的区别:
假设有一个单核的操作系统,系统上没有其它的程序需要运行,现有两个线程 A 和 B,A 和 B 在单独
运行时都需要10 秒来完成自己的任务,而且任务都是运算操作,线程 A 和 B 之间没有竞争和共享数据
的问题。现在让 A 和 B 两个线程并行,则操作系统会不停的在 A 和 B 两个线程之间切换,达到一种
伪并行的效果。
如果操作系统切换的频率是每秒一次,切换的成本是 0.1 秒(主要是栈切换),则总共需
20 + 19 * 0.1 = 21.9 秒;如果使用协程的方式,可以先运行协程 A,A 结束的时候让位给协程 B,
只发生一次切换,则总共需要 20 + 1 * 0.1 = 20.1 秒。如果操作系统是双核的,而且线程是标准线程,
那么线程 A 和 B 可以达到真的并行,则总时间为 10 秒;而协程的方式仍然需要 20.1 秒的时间
1. 线程栈: windows 默认1M ,Linux 默认8M ,根据线程实际需要动态扩展栈大小
------在windows中------
$ 若线程需要的线程栈小于默认的1M,则按照页面文件大小的倍数开辟, 例需要10k 则开辟 4k * 3 = 12k
$ 若大于1M,例 需要1025k, 则按照1M的整数倍开辟栈空间 2M
进程切换分两步:
1.切换页目录以使用新的地址空间
2.切换内核栈和硬件上下文
对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程
切换都要做的。
切换的性能消耗:
1、线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换
是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能
损耗是将寄存器中的内容切换出。
2、另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有
已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲
(processor's Translation Lookaside Buffer (TLB))或者相当的神马东西会被全部刷新,这将导致内存的
访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题
未完,待续~~
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流