多线程 单线程 异步 -编程优缺异同-——针对面试

鸣谢(参考):
https://www.cnblogs.com/yanan-boke/p/9395638.html
https://bbs.csdn.net/topics/391872922?page=1
https://blog.csdn.net/gtLBTNq9mr3/article/details/90481254
https://blog.csdn.net/qq_27825451/article/details/78853119

概述:

  1. 单线程串行依次执行。
    多线程并行完成。
  2. 多线程是对于软件的概念,屏蔽硬件:多核和单核没有影响。

目录

      • 线程
  • 多线程:
  • 单线程:
  • 多线程和单线程的比较:
  • 异步
    • 概念
      • 优:
    • 比较
  • 总结 [(引用):](https://blog.csdn.net/qq_27825451/article/details/78853119)

线程

线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。

多线程:

代价:在于创建线程和执行期线程上下文切换的开销较大。线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现
!!!:编程死锁、状态同步问题
优势: 线程中的处理程序依然是顺序执行,符合普通人的思维习惯,所以编程简单。

单线程:

单线程顺序执行任务的方式
符合编程人员按顺序思考的思维方式。它依然是最主流的编程方式,因为它易于表达
缺点: 但是串行执行的缺点在于性能,任意一个略慢的任务都会导致后续执行代码被阻塞。在计算机资源中,通常I/O与CPU计算之间是可以并行进行的。但是同步的编程模型导致的问题是,I/O的进行会让后续任务等待,这造成资源不能被更好地利用。

!!! 阻塞I/O导致硬件得不到高效使用。

多线程和单线程的比较:

单线程同步编程模型会因阻塞I/O导致硬件资源得不到更优的使用。多线程编程模型也因为编程中的死锁、状态同步等问题让开发人员头疼。

Node在两者之间给出了它的方案:利用单线程,远离多线程死锁、状态同步等问题;利用异步I/O,让单线程远离阻塞,以更好地使用CPU。

异步

概念

异步I/O可以算作Node的特色,因为它是首个大规模将异步I/O应用在应用层上的平台,它力求在单线程上将资源分配得更高效。

为了弥补单线程无法利用多核CPU的缺点,Node提供了类似前端浏览器中Web Workers的子进程,该子进程可以通过工作进程高效地利用CPU和I/O。

异步I/O的提出是期望I/O的调用不再阻塞后续运算,将原有等待I/O完成的这段时间分配给其余需要的业务去执行。

优:

异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少 共享变量的数量),减少了死锁的可能。

当然异步操作也并非完美无暇。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些 出入,而且难以调试。

比较

共同点:异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性

总结 (引用):

总结:

   (1)“多线程”,第一、最大的问题在于线程本身的调度和运行需要很多时间,因此不建议自己创建太大量的线程;第二、共享资源的调度比较难,涉及到死锁,上锁等相关的概念。

   (2)“异步” ,异步最大的问题在于“回调”,这增加了软件设计上的难度。

在实际设计时,我们可以将两者结合起来:

   (1)当需要执行I/O操作时,使用异步操作比使用线程+同步 I/O操作更合适。I/O操作不仅包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.net Remoting等跨进程的调用。异步特别适用于大多数IO密集型的应用程序。
   (2)而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。但是往 往由于使用线程编程的简单和符合习惯,所以很多朋友往往会使用线程来执行耗时较长的I/O操作。这样在只有少数几个并发操作的时候还无伤大雅,如果需要处 理大量的并发操作时就不合适了。

2、在多线程编程和异步编程上的进步(以.NET和python语言为例进行说明)

   多线程最大的问题在于“线程的调度”,而在.NET中引入了线程池的概念,避免人为创建多余线程,让系统进行分配;而Python语言中的多线程编程效率一直饱受诟病,因此python很少使用多线程,一般使用“协程”,后面会讲到。

  异步最大的问题在于“回调”,.NET随着版本的升级,从多任务编程,到后面使用await-async关键字的提升,让人更加方便,不用注意到复杂的回调问题,用同步的思维方式进行异步编程。python从3.4版本开始也开始使用协程和时间循环机制,从yield和yield from 语句中受到启发,解决了“回调问题”,而在python3.5版本中,也是使用了await-async关键字,进一步简化了编程。在这一方面,python和.NET有很多相似之处。

你可能感兴趣的:(课程知识,多线程,面试)