并发编程(进程与线程)

1、前言

进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。html

进程的概念起源于操做系统,是操做系统最核心的概念,也是操做系统提供的最古老也是最重要的抽象概念之一。操做系统的其余全部内容都是围绕进程的概念展开的。   算法

PS:即便能够利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在。编程

 操做系统的做用:
    1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口
    2:管理、调度进程,而且将多个进程对硬件的竞争变得有序

2、并发编程之多进程       

多进程详细连接多线程

 1. 什么是进程并发

    进程就是一个正在进行/运行的程序,换言之,进程指的是一个程序的运行过程

    程序vs进程:
        程序:只是一堆代码文件
        进程:程序运行的过程才是进程

    串行:一个任务完完整整地运行完毕,再执行下一个任务,按次序依次进行
        串行看起来就是一个一个运行的:对
        一个一个的运行就是串行:错误

    并发(切换+保存状态):多个任务看起来是同时运行,单核就能够实行并发
    并行:多个任务是真正意义上的同时运行,只有多核才能实现并行

    多道技术的产生背景:就是想要在单核下实现并发
   ps:
      如今的主机通常是多核,那么每一个核都会利用多道技术
      有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再从新调度,会被调度到4个
      cpu中的任意一个,具体由操做系统调度算法决定
        如何实现:
              1. 空间上的复用:将内存分为几部分,每一个部分放入一个程序的数据,
         这样,同一时间内存中就有了多道程序的数据,为cpu在多个任务间切换作准备

       2. 时间上的复用:多个进程共享cpu的时间 关键点就是cpu在多个任务之间进行切换 有两种状况下会发生切换: 1. 一个任务占用cpu时间过长(没有遇到IO操做):会下降效率 1. 一个任务在运行的过程当中遇到IO操做: 能够提高效率 2. 为什么要用进程 要实现并发效果

     

同步\异步 and 阻塞\非阻塞(重点)

同步app

同步,就是在发出一个功能调用时,在没有获得结果以前,该调用就不会返回。按照这个定义,其实绝大多数函数都是同步调用。可是通常而言,咱们在说同步、异步的时候,特指那些须要其余部件协做或者须要必定时间完成的任务。 举例:
  1. concurrent.futures.ProcessPoolExecutor().submit(func,).result()
2. concurrent.futures.ThreadPoolExecutor().submit(func,).result() 一提交便获得结果

异步异步

异步的概念和同步相对。当一个异步功能调用发出后,调用者不能马上获得结果。当该异步功能完成后,经过状态、通知或回调来通知调用者。若是异步功能用状态来通知,那么调用者就须要每隔必定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这实际上是一 种很严重的错误)。若是是使用通知的方式,效率则很高,由于异步功能几乎不须要作额外的操做。至于回调函数,其实和通知没太多区别。
举例:
  1. concurrent.futures.ProcessPoolExecutor(3).submit(func,)
2. concurrent.futures.ThreadPoolExecutor(3).submit(func,)

 阻塞socket

#阻塞调用是指调用结果返回以前,当前线程会被挂起(如遇到io操做)。函数只有在获得结果以后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不一样的。对于同步调用来讲,不少时候当前线程仍是激活的,只是从逻辑上当前函数没有返回而已。
#举例:
#1. 同步调用:apply一个累计1亿次的任务,该调用会一直等待,直到任务返回结果为止,但并未阻塞住(即使是被抢走cpu的执行权限,那也是处于就绪态);
#2. 阻塞调用:当socket工做在阻塞模式的时候,若是没有数据的状况下调用recv函数,则当前线程就会被挂起,直到有数据为止。

 

非阻塞ide

#非阻塞和阻塞的概念相对应,指在不能马上获得结果以前也会马上返回,同时该函数不会阻塞当前线程。

总结

1. 同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。而异步状况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候经过状态、通知、事件等方式通知进程任务完成。 2. 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能知足的时候就将进程挂起,而非阻塞则不会阻塞当前进程

 

3、并发编程之多线程

多线程详细连接函数

一、什么是线程

线程顾名思义,就是一条流水线工做的过程,一条流水线必须属于一个车间,一个车间的工做过程是一个进程

关系:

程序------>进程(至少一个主进程)------>线程(至少一个主线程,依赖于进程)

进程只是用来把资源集中到一块儿(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。

 

#能够想象成北京地铁与上海地铁是不一样的进程,而北京地铁里的13号线是一个线程,北京地铁全部的线路共享北京地铁全部的资源,好比全部的乘客能够被全部线路拉。
生活中进程、线程

 

二、建立线程的开销小

若是咱们的软件是一个工厂,该工厂有多条流水线,流水线工做须要电源,电源只有一个即cpu(单核cpu)

一个车间就是一个进程,一个车间至少一条流水线(一个进程至少一个线程)

建立一个进程,就是建立一个车间(申请空间,在该空间内建至少一条流水线)

而建线程,就只是在一个车间内造一条流水线,无需申请空间,因此建立开销小

 

三、线程与进程的区别

线程共享建立它的进程的地址空间                      程有本身的地址空间。

线程能够直接访问进程的数据段                         程拥有父进程的数据段的本身的副本。

线程能够直接与进程的其余线程通讯                  程必须使用进程间通讯来与兄弟进程通讯。

线程很容易建立                                               新程须要复制父进程。

线程能够对同一进程的线程进行至关大的控制    程只能对子进程进行控制。

对主线程的更改(取消、优先级更改等)可能会影响进程中其余线程的行为                对父程的更改不会影响子进程。

 

四、为什么多线程

多线程指的是,在一个进程中开启多个线程

      1. 多线程共享一个进程的地址空间

      2. 线程比进程更轻量级,线程比进程更容易建立可撤销,在许多操做系统中,建立一个线程比建立一个进程要快10-100倍,在有大量线程须要动态和快速修改时,这一特性颇有用

      3. 若多个线程都是cpu密集型的,那么并不能得到性能上的加强,可是若是存在大量的计算和大量的I/O处理,拥有多个线程容许这些活动彼此重叠运行,从而会加快程序执行的速度。

  很形象的线程小故事

相关文章
相关标签/搜索