
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
进程与线程都是程序员在学习java编程开发语言的时候需要重点掌握的一个编程知识点,下面我们就通过案例分析来了解一下,java编程线程进程与协程之间的区别。
一、进程Process:(并行运算,分布式)
每一个进程,都可以看作是一个完整的Program,它有自己完全独立的内容。不与其他进程直接共享数据。(一个工作(job)可以由多个process完成,例如电脑上的qq/360就会有好几个进程,这种程序可能会有一个守护进程,当主进程挂掉,它会自动重启主进程。)
每个进程可以由多个线程组成。进程抽象由操作系统提供,Linux是使用fork函数,Windows是用CreateProccess。
二、线程Thread:(并发执行)
属于同一个进程的线程之间,是共享一套工作内容的。这使得线程的创建和移除开销很小,但同时也使编程变得复杂。
关于线程,分用户级线程和内核级线程。不同的语言中,这两种线程的对应关系也不尽相同。
多对一模型
将多个用户级线程映射到一个内核级线程,线程管理在用户空间完成,这种模型下操作系统并不知道多线程的存在。Python就是这种模型。
优点:线程管理是在用户空间进行的,切换上下文开销比较小,性能较高。
缺点:当一个线程在使用内核服务时被阻塞,那么整个进程都会被阻塞;多个线程不能并行地运行在多处理机上。
一对一模型
将每个用户级线程映射到一个内核级线程。Java的线程就属于这种模型。
优点:当一个线程被阻塞后,允许另一个线程继续执行,所以并发能力较强;能很好的利用到CPU的多核心。
缺点:每创建一个用户级线程都需要创建一个内核级线程与其对应,这样创建线程的开销比较大,会影响到应用程序的性能。并且切换线程要进出内核,代价比较大。
多对多模型
将n个用户级线程映射到m个内核级线程上,要求m<=n。GO(1.5之后)的协程就属于这种线程模型。
特点:既克服了多对一模型的并发度不高的缺点,又克服了一对一模型的一个用户进程占用太多内核级线程,开销太大的缺点。又拥有多对一模型和一对一模型各自的优点。
三、协程Coroutine(并发执行)
如果说线程是轻量级的进程,那么协程就是轻量级的线程。线程跑在进程里,协程就跑在线程里。
优点:
协程是跑在同一个线程里,并且是由程序本身来调度的。协程间的切换就是函数的调用,完全没有线程切换那么大的开销。
线程的数量越多,协程的优势越大
因为协程是程序调度的,它实际上是串行运行的,因此不需要复杂的锁机制来保证线程安全。
在协程中控制共享资源不加锁,只需要判断状态就好了。这免去了锁机制带来的开销。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。