当前位置:首页 > 运维 > 正文内容

进程、线程和协程三者之间的区别和联系

phpmianshi9年前 (2013-04-16)运维489

一、进程、线程、协程

1,进程

    进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位

2,线程(thread)(内核级线程

    线程,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位

3,协程(用户级线程)

    协程是一种用户态的轻量级线程,又称微线程。协程调度完全由用户控制,相当于子程序。


4,区别

  1、资源方面:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其他进程不可见

  2、通信:进程间通信IPC,进程间可以直接读写进程数据段进行通信——需要进程同步和互斥手段辅助,以保证数据的一致性,线程通信主要通过共享内存

  3、调度和切换:线程上下文切换比进程上下文切换要快的多

  4、对于 进程线程,都是有内核进行调度,有 CPU 时间片的概念,进行 抢占式调度(有多种调度算法),对于 协程(用户级线程),这是对内核透明的,是由用户程序自己控制,通常只能进行 协作式调度,需要协程自己主动把控制权转让出去之后,其他协程才能被执行到。


进程优点:

    1. 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响

进程缺点:

  1. 在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。多进程的程序要比多线程的程序健壮,但在进程创建、切换、撤销时,耗费资源较大,效率要差一些。

  2. 进程间通信(IPC)较为复杂和耗时


线程优点:

1.线程的出现是为了减少任务切换的消耗,提高系统的并发性,实现让一个进程也能执行多个任务

线程缺点:

1.线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉

2.线程没有自己的系统资源,只有运行时不可缺少的资源,但是同一进程的各线程可以共享进程所拥有的系统资源。对于某些独占资源存在锁机制,处理不当会出现死锁。


协程优点:

1.协程执行效率高。因为子程序切换不是线程切换,由程序自身控制,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。

2.协程不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好,所以执行效率比多线程高很多。


5.场景

多进程:

密集CPU任务,需要重复利用CPU多核资源(大量的并行计算)


多线程:

密集IO任务(网络IO,磁盘IO,数据库IO)


协程:

当程序中存在大量不需要CPU的操作时


最高效的组合:利用多核CPU最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能


6.进程/线程之间的亲缘性
  

亲缘性的意思是进程/线程只在某个cpu上运行(多核系统),比如:

使用CPU亲缘性的好处:设置CPU亲缘性是为了防止进程/线程在CPU的核上频繁切换,从而避免因切换带来的CPU的L1/L2 cache失效,cache失效会降低程序的性能。


二、小结


核心只有一个,线程是操作系统调度,协程是用户态调度。协程不必须是语言集成,例如C语言可以用setjmp/longjmp实现,也可以自己通过改变esp指针换栈实现协程。 协程本身跟高吞吐没任何关系,基于io多路复用+回调就可以实现高并发和高吞吐。引入协程是为了将回调逻辑变成线性同步逻辑。


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

负载均衡工作模式以及工作原理

负载均衡的多种解决方案:HTTP重定向当用户发来请求的时候,Web服务器通过修改HTTP响应头中的Location标记来返回一个新的url,然后浏览器再继续请求这个新url,实际上就是页面重定向。通过...

nginx中request_time和upstream_response_time详解

背景最近监控报警有短暂的502,赶紧分析问题原因,查看nginx的access_log 发现短暂报警的request_time比较大,但是upstream_response_time有2个值,一个比较...

Linux中ss命令Recv-Q和Send-Q详解

ss用来显示处于活动状态的套接字信息。ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netst...

linux中后台进程管理利器supervisord

背景Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。s...

jsonp安全攻防技术(JSON劫持、XSS漏洞)

关于 JSONPJSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。他实现的基本原理是利用了 HTML 里 <script&...

openresty中使用淘宝的concat进行css和js合并

背景我们在访问淘宝的时候,会看到代码中的js和css文件是通过一次请求获得的,我们知道浏览器一次请求只能并发访问数个资源,这样的处理错输在网络传输层面可以大大节省时间,这里使用的技术就是把css、js...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。