多线程中的几个概念

多线程中的几个概念

1、 线程的进程的区别

1
2
3
4
5
每个正在运行系统上运行的程序都是一个进程。每个进程中包含一到多个线程。

线程是一组指令的集合,或者是程序的特殊段,它可以在程序中独立执行。也可以把它理解为代码运行的上下文。因此线程基本上是轻量级的进程,它负责在单个程序中执行多任务。

进程是所有线程的集合,每一个线程是进程中的一条执行路径。

2、 并发(Concurrency)和并行(Parallelism)

1
2
3
4
5
6
无论是单CPU还是多CPU,操作系统都营造出了同时运行多个程序的假象。实际的过程是CPU的快速切换。

并发和并行都是多个进程同时运行。

并发说的是在一个时间段内,多件事情在这个时间段内交替执行。
并行说的是多件事情在同一个时刻同事发生。

3、 同步(Synchronous)和异步(Asynchronous)

1
2
3
4
5
线程同步是多个线程访问同一资源,等待资源访问结束,浪费时间和CPU,效率低。
- 同步方法调用开始后,调用者必须等到方法调用返回后,才能继续执行之后的方法。

线程异步是访问资源是在空闲等待是同时访问其他资源
- 异步方法调用更像是一次消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续执行之后的方法

4、 阻塞和非阻塞

1
2
3
阻塞和非阻塞通常用来形容很多线程间的相互影响。
一个线程占用了临界区资源,其他需要该资源的线程必须等待,等待会导致线程挂起,这种情况就是阻塞。
非阻塞就是没有一个线程可以妨碍其他线程执行,所有的线程都会尝试不断向前执行

5、 死锁(Deadlock)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 死锁的概念
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。
若无外力作用,它们都将无法推进下去。
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。


# 产生的条件
1、 互斥条件
2、 请求和保持条件
3、 不剥削条件
4、 环路等待条件

如何避免死锁

6、 饥饿(Starvation)

1
2
饥饿是指某一个或者多个线程因为种种原因无法获得所要的资源。
比如:线程优先级太低

7、 活锁(Livelock)

1
活锁是主动将资源释放给他人使用,那么久会导致资源不断地在两个线程间跳动,而没有一个线程可以同时拿到所有资源正常执行

8、 临界区

1
表示一种公共资源或者说共享数据,比如打印机

9、 用户线程和守护线程

1
2
用户线程是指一个普通的线程,比如main程序
守护线程是指用来服务于用户线程,不需要上层逻辑介入,比如GC

10、上下文切换

1
CPU通过时间片分配算法来循环任务,当前任务执行一个时间片会切换到下一个任务,但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。

多线程中的几个概念
https://johnjoyjzw.github.io/2020/12/20/多线程基本概念/
Author
John Joy
Posted on
December 20, 2020
Licensed under