线程和进程

  1. 线程是进程中的一部分,也是进程的的实际运作单位,它也是操作系统中的最小运算调度单位。
  2. 进程中的一个单一顺序的控制流就是一条线程,多个线程可以在一个进程中并发。可以使用多线程技术来提高运行效率
  3. 进程是资源分配的基本单位,线程是cpu调度的基本单位。线程本身基本上不拥有系统资源,只拥有一些运行时需要的系统资源,如程序计数器、栈、寄存器等
  4. 进程的资源是进程下面的线程所共享的,只要进程还在,线程就可以正常执行,也就是说线程是依赖于进程的,线程与线程之间并不存在依赖关系
  5. 进程一般由程序,数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(PCB)包含进程的描述信息和控制信息,是进程存在的唯一标志。

并行、并发、多线程、多进程、协程、高并发_多线程

线程的共享区域和独有区域
  1. 共享:堆(线程通信的地方)、方法区
  2. 独有:栈、程序计数器

并行、并发和串行

  1. 并行:单位时间内,多个CPU同时执行任务,真正意义上的“同时进行”。比如:多个人做不同的事
  2. 并发:多个任务在一个CPU上按细分的时间片轮流(交替)执行,从逻辑上看是同时执行多个任务,比如:秒杀,多个人做同一件事
  3. 串行:有n个任务,由一个线程按顺序执行。
  1. 并发 = 两个队列和一台咖啡机。
  2. 并行 = 两个队列和两台咖啡机。
  3. 串行 = 一个队列和一台咖啡机。

异步执行:Java多线程是异步执行的,而非顺序执行

协程

协程是另一种实现并发的手段,这里的并发,特指不是并行的并发。线程也是可以实现这种非并行的并发的,从这一点上看,协程和线程更像一点。

但协程却是用单进程,单线程的方式来实现的。

多线程适合IO密集型任务,但这里要提出的是,协程是更加适合IO密集型任务的一种机制,因为线程还需要线程切换的开销,协程却没有。

运用协程机制最典型的场景就是异步IO。

所谓异步,是指一段程序在执行完成前有能力“暂停”,让其他程序段执行。

什么是多线程?

多线程是指,将原本线性执行的任务分开成若干个子任务同步执行,这样做的优点是防止线程“堵塞”。

多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。

多线程是实现并发的一个手段。一个进程可以拥有多个线程。当有多个cpu时,多个线程是可以同时执行的,这时就是并行。如果只有一个cpu,那么多个线程可以交叉重叠执行,这时就是并发了。

实现多线程是采用一种并发执行机制 并发执行机制原理:简单地说就是把一个处理器划分为若干个短的时间片,每个时间片依次轮流地执行处理各个应用程序 

多进程和多线程比较起来,多线程一般适用于IO密集型的任务。多进程适用于计算密集型的任务。 可能你会有疑问,多线程既然可以并行执行,岂不是也适用于计算密集型的任务?理论上是这样的,只是这里说多进程更适合,是说当数据量比较大时,计算任务之间没有逻辑上的依赖时,多进程更合适一些。因为每个进程都会有自己的进程内存空间,各个进程之间天然隔离。而多线程共享同一个内存空间,线程之间的同步是必须考虑的问题。而这些问题都不是计算密集型任务必须的。所以我们说计算密集型任务更适合多进程。

多线程模型

  1. 一对一模型: 一般直接使用API或系统调用创建的线程均为一对一的线程。一个用户使用的线程就唯一对应一个内核使用的线程;并发能力强,多个线程可在多核处理机上并行运行
  2. 多对一模型: 多对一模型将多个用户线程映射到一个内核线程上,线程之间的切换由用户的代码来进行。并发度不高,多个线程不可在多核处理机上并行运行。
  3. 多对多模型:**结合了多对一模型和一对一模型的特点,将多个用户线程映射到少数但不止一个内核线程上;克服了多对一模型并发度不高的缺点等

采用不同的多线程模型,操作系统的并发能力和并行情况是不一样的

什么是高并发?

百度百科对高并发的定义;高并发(High Concurrency)通常是指通过设计保证系统能够同时并行处理很多请求。通俗来讲,高并发是指在同一个时间点,有很多用户同时的访问同一 API 接口或者 Url 地址。它经常会发生在有大活跃用户量,用户高聚集的业务场景中。

高并发相关常用的一些指标有响应时间(Response Time),吞吐量,每秒查询率QPS(Query Per Second),并发用户数等。

  1. 响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间
  2. 吞吐量:单位时间内处理的请求数量。
  3. QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。
  4. 并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

同步(Synchronous)与异步(Asynchronous)

同步和异步通常形容一次方法的调用。同步方法调用开始后调用者必须等到方法调用返回才能进行后续行为。异步方法则像一个消息的传递,调用方法后立即返回而方法体则在后台继续运行,调用者无需等待继续后续操作。

阻塞(Blocking)和非阻塞(Non-Blocking)

阻塞和非阻塞通常用来形容多线程的互相影响。当一个线程占用了临界区资源,那么其他需要这个资源的线程必须在这个临界区中进行等待。等待会导致线程挂起,这种情况就是阻塞。非阻塞与之相反,它强调没有一个线程可以妨碍其他线程执行,所有线程都会不断尝试向前执行。


1.市场上所谓的八核,四核处理器的核心数与真实的cpu个数有什么区别?

2.是四个cpu核心就能理论上支持四个并行运算吗?

3.通常说的多线程开发,多进程开发是真正意义上的并行还是并发?

4.异步和并发的区别在哪里?他们的实现原理分别是什么?

5.如果四核cpu可以执行并行运算,那么没有特别的开发是不是通常情况下剩下三个核都是闲置的?