进程与线程、同步与异步、阻塞与非阻塞、并发与并行

进程(Process) 与 线程(Thread)

  • 进程(Process):

进程是Windows系统中的一个基本概念,它包含着一个运行程序所须要的资源。一个正在运行的应用程序在操做系统中被视为一个进程, 进程能够包括一个或多个线程。 线程是操做系统分配处理器时间的基本单元,在进程中能够有多个线程同时执行代码。进程之间是相对独立的,一个进程没法访问另外一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其余进程的运行,Windows系统就是利用进程把工做划分为多个独立的区域的。进程能够理解为一个程序的基本边界。是应用程序的一个运行例程,是应用程序的一次动态执行过程多线程


  • 线程(Thread):

线程是进程中的基本执行单元,是操做系统分配CPU时间的基本单位, 一个进程能够包含若干个线程, 在进程入口执行的第一个线程被视为这个进程的主线程。在.NET应用程序中,都是以Main()方法做为入口的,当调用此方法时系统就会自动建立一个主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。并发


  • 进程(Process)与线程(Thread)的区别:异步

    • 进程和线程的主要差异在于它们是不一样的操做系统资源管理方式。
    • 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不一样执行路径。
    • 线程有本身的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
    • 对于一些要求同时进行而且又要共享某些变量的并发操做,只能用线程,不能用进程。
    • 一个程序至少有一个进程,一个进程至少有一个线程.
    • 线程的划分尺度小于进程,使得多线程程序的并发性高。
    • 进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大地提升了程序的运行效率。
    • 线程在执行过程当中与进程仍是有区别的。每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。可是线程不可以独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
    • 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分能够同时执行。但操做系统并无将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。


同步(Sync) 和 异步(Async)

  • 同步(Sync):

同步,就是发出一个功能调用时,在没有获得结果以前,该调用就不返回或继续执行后续操做。简单来讲,同步就是必须一件一件事作,等前一件作完了才能作下一件事。分布式


  • 异步(Async):

异步与同步相对,当一个异步过程调用发出后,调用者在没有获得结果以前,就能够继续执行后续操做。当这个调用完成后,通常经过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
通知调用者的三种方式:函数

  1. 状态:
      即监听被调用者的状态(轮询),调用者须要每隔必定时间检查一次,效率会很低。
  2. 通知:
      当被调用者执行完成后,发出通知告知调用者,无需消耗太多性能。
  3. 回调:
      与通知相似,当被调用者执行完成后,会调用调用者提供的回调函数。

  • 同步(Sync)与异步(Async)的区别:  

简单的说,就是请求发出后,是否须要等待结果,才能继续执行其余操做。性能



阻塞与非阻塞

  • 阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来讲的。
  • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
  • 阻塞调用是指调用结果返回以前,当前线程会被挂起。调用线程只有在获得结果以后才会返回。
  • 非阻塞调用指在不能马上获得结果以前,该调用不会阻塞当前线程。


并发 与 并行

  • 并发: 在操做系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。当有多个线程在操做时,若是系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分红若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式咱们称之为并发(Concurrent)。

  • 并行: 当系统有一个以上CPU时,则线程的操做有可能非并发。当一个CPU执行一个线程时,另外一个CPU能够执行另外一个线程,两个线程互不抢占CPU资源,能够同时进行,这种方式咱们称之为并行(Parallel)。

  • 并发 与 并行的区别:操作系统

    • 并发的关键是你有处理多个任务的能力, 不必定要同时进行。
    • 并行的关键是你有 同时 处理多个任务的能力。


理解 同步阻塞、同步非阻塞、异步阻塞、异步非阻塞线程

  • 同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态。

以小倩下载文件打个比方,从这两个关注点来讲明这两组概念,但愿可以更好的促进你们的理解。进程

同步阻塞: 小倩一直盯着下载进度条,到 100% 的时候就完成。
同步体如今: 等待下载完成通知;
阻塞体如今: 等待下载完成通知过程当中,不能作其余任务处理;内存

同步非阻塞: 小倩提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。
同步体如今: 等待下载完成通知,可是要必须在;
非阻塞体如今: 等待下载完成通知过程当中,去干别的任务了,只是时不时会瞄一眼进度条;【小倩必需要在两个任务间切换,关注下载进度】

异步阻塞: 小倩换了个有下载完成通知功能的软件,下载完成就“叮”一声。不太小倩仍然一直等待“叮”的声音(看起来很傻,不是吗?)。
异步体如今: 下载完成“叮”一声通知;
阻塞体如今: 等待下载完成“叮”一声通知过程当中,不能作其余任务处理;

异步非阻塞: 仍然是那个会“叮”一声的下载软件,小倩提交下载任务后就去干别的,听到“叮”的一声就知道完成了。
异步体如今: 下载完成“叮”一声通知;
非阻塞体如今: 等待下载完成“叮”一声通知过程当中,去干别的任务了,只须要接收“叮”声通知便可;【软件处理下载任务,小倩处理其余任务,不需关注进度,只需接收软件“叮”声通知,便可】

也就是说,同步/异步是“下载完成消息”通知的方式(机制),而阻塞/非阻塞则是在等待“下载完成消息”通知过程当中的状态(能不能干其余任务),在不一样的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。


因此,综上所述,同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的状况下,是由处理消息者本身去等待消息是否被触发,而异步的状况下是由触发机制来通知处理消息者,因此在异步机制中,处理消息者和触发机制之间就须要一个链接的桥梁:在小倩的例子中,这个桥梁就是软件“叮”的声音。

同步/异步 与 阻塞/非阻塞

  1. 同步阻塞形式
      效率是最低的

  2. 异步阻塞形式
      异步操做是能够被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。

  3. 同步阻塞形式
     其实是效率低下的,(想象一下你一边干别的事情一边还须要抬头看下载完成没有)

  4. 异步非阻塞形式
      效率更高


^_<

相关文章
相关标签/搜索