Skip to content

Commit 27bbb26

Browse files
author
wangtao
committed
新增多任务概念和详细
1 parent 1ab49a4 commit 27bbb26

3 files changed

Lines changed: 259 additions & 0 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# 进程、线程、协程对比
2+
3+
**请仔细理解如下的通俗描述**
4+
5+
- 有一个老板想要开个工厂进行生产某件商品(例如剪子)
6+
- 他需要花一些财力物力制作一条生产线,这个生产线上有很多的器件以及材料这些所有的 为了能够生产剪子而准备的资源称之为:进程
7+
- 只有生产线是不能够进行生产的,所以老板的找个工人来进行生产,这个工人能够利用这些材料最终一步步的将剪子做出来,这个来做事情的工人称之为:线程
8+
- 这个老板为了提高生产率,想到3种办法:
9+
1. 在这条生产线上多招些工人,一起来做剪子,这样效率是成倍増长,即单进程 多线程方式
10+
2. 老板发现这条生产线上的工人不是越多越好,因为一条生产线的资源以及材料毕竟有限,所以老板又花了些财力物力购置了另外一条生产线,然后再招些工人这样效率又再一步提高了,即多进程 多线程方式
11+
3. 老板发现,现在已经有了很多条生产线,并且每条生产线上已经有很多工人了(即程序是多进程的,每个进程中又有多个线程),为了再次提高效率,老板想了个损招,规定:如果某个员工在上班时临时没事或者再等待某些条件(比如等待另一个工人生产完谋道工序 之后他才能再次工作) ,那么这个员工就利用这个时间去做其它的事情,那么也就是说:如果一个线程等待某些条件,可以充分利用这个时间去做其它事情,其实这就是:协程方式
12+
13+
## 一.简单总结
14+
15+
1. 进程是资源分配的单位
16+
2. 线程是操作系统调度的单位
17+
3. 进程切换需要的资源很最大,效率很低
18+
4. 线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)
19+
5. 协程切换任务资源很小,效率高
20+
6. 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发
21+
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
# 进程、线程、协程详解
2+
3+
## 一.进程(Process)
4+
5+
进程是操作系统中的一个基本概念,他代表了一个独立运行的程序实例。每个进程都有自己的内存空间、寄存器状态、文件句柄和系统资源,因此他们彼此隔离,并不会直接共享内存。 **进程是计算机系统中实现多任务和并发执行的基本单元。**
6+
7+
在操作系统中,进程管理是一个重要的任务,它包括进程的创建、调度、通信、同步和终止等。操作系统负责分配系统资源,确保进程能够合理共享和利用这些资源。
8+
9+
### 1.进程的重要概念和特点
10+
11+
**独立性:** 每个进程是相对独立的,它们不会直接影响或访问其他进程的内存或资源。这种独立性提高了系统的稳定性,因为一个进程的崩溃通常不会影响其他进程。
12+
13+
**资源隔离:** 操作系统为每个进程分配了独立的内存空间和资源,这样可以避免不同进程之间的资源冲突和争用。每个进程都有自己的文件描述符、网络连接和其他系统资源。
14+
15+
**并发性:** 进程可以并发执行,这意味着多个进程可以在同一时间段内运行,从而提高了系统的吞吐量和响应性。操作系统通过进程调度来管理多个进程的执行。
16+
17+
**通信:** 尽管进程通常是相互隔离的,但它们可以通过进程间通信(Inter-Process Communication,IPC)机制来进行数据交换和协作。IPC可以使用管道、共享内存、消息队列等方式实现。
18+
19+
**创建和销毁:** 进程可以动态创建和销毁,这使得操作系统能够有效地管理系统资源。每个进程都有一个唯一的进程标识符(PID),用于识别和管理进程。
20+
21+
**多任务:** 进程是实现多任务的一种方式。一个计算机系统可以同时运行多个进程,每个进程可以执行不同的任务,如应用程序、服务或系统进程。
22+
23+
**安全性:** 进程隔离提高了系统的安全性,因为恶意代码或错误不太可能影响其他进程或操作系统本身。
24+
25+
> 注意:
26+
>
27+
> 进程之间的切换通常比线程之间的切换开销更大,因为进程拥有独立的内存空间,切换时需要切换内存映射和上下文。因此,在某些情况下,线程可能更适合实现并发性,而进程更适合实现隔离性和安全性。
28+
29+
## 二.线程(Thread)
30+
31+
**线程是操作系统中的一个基本执行单元,它是进程的一部分,用于执行进程中的任务。** 一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源,但拥有自己的独立执行流程、栈和寄存器状态。线程允许程序在多个执行路径上并发执行,从而提高了程序的性能和响应性。
32+
33+
### 1.线程的重要概念和特点
34+
35+
**并发性:** 线程允许多个任务在同一时间段内执行,从而提高了系统的并发性。不同线程之间的执行可以交错进行,使得多个任务同时进行。
36+
37+
**共享内存:** 线程属于同一个进程,因此它们可以共享相同的内存空间和资源。这使得线程之间的数据共享和通信相对容易。
38+
39+
**轻量级:** 线程通常比进程轻量级,因为它们共享相同的进程资源,不需要单独的内存空间和系统资源分配。线程的创建和销毁开销相对较小。
40+
41+
**同步和互斥:** 由于线程可以共享内存,因此需要特殊的同步机制来确保线程之间的正确协调和数据一致性。这包括使用锁(如互斥锁)、条件变量、信号量等来避免竞态条件和死锁。
42+
43+
**适用场景:** 线程适用于需要并发执行的应用程序,特别是对于CPU密集型任务。例如,图像处理、数据计算和算法执行等任务可以通过多线程并发来提高性能。
44+
45+
**线程调度:** 操作系统负责线程的调度,它根据线程的优先级和调度策略来确定哪个线程应该在CPU上执行。不同操作系统的线程调度策略可能有所不同。
46+
47+
> 注意:
48+
>
49+
> 线程编程可能会引入一些复杂性和难以调试的问题,如竞态条件和死锁。因此,在编写多线程代码时需要谨慎,并遵循最佳实践来确保程序的正确性和稳定性。
50+
51+
## 三.协程(Coroutine)
52+
53+
**协程是一种轻量级的并发编程技术,它允许函数在执行过程中暂停和恢复,以实现协作式多任务处理。** 协程是一种更高级别的并发抽象,允许程序员编写异步、非阻塞的代码,而无需显式地创建多个线程或进程。
54+
55+
### 1.协程的重要概念和特点
56+
57+
**协作式多任务:** 协程通过协作式的方式实现多任务处理。不同于操作系统的线程或进程,它们由操作系统调度,协程需要明确地协作以实现任务的切换和控制。
58+
59+
**暂停和恢复:** 协程可以在执行过程中自行暂停和恢复。这使得一个协程可以将控制权交还给另一个协程,从而实现任务之间的协作。协程通常在遇到I/O操作或需要等待某些事件发生时暂停。
60+
61+
**无需多线程:** 协程可以在单线程内实现异步和并发处理,而无需创建多个线程。这降低了多线程编程中可能出现的竞态条件和线程安全问题的复杂性。
62+
63+
**更少的资源消耗:** 相对于线程或进程,协程通常需要更少的内存和系统资源。这使得它们适用于资源受限的环境。
64+
65+
**异步编程:** 协程通常与异步编程一起使用,以实现非阻塞的I/O操作。通过在I/O操作期间切换到其他协程,程序可以继续执行其他任务,而不必等待I/O操作完成。
66+
67+
协程的主要优势之一是它们使得异步编程更加可读和可维护,因为它们允许将异步代码写成类似于同步代码的结构。
68+
69+
> 注意:
70+
>
71+
> 协程编程也具有一定的复杂性,因为程序员需要仔细管理协程之间的控制流和状态。此外,协程的性能可能受到协程调度器的影响,因此需要考虑调度策略以优化程序性能。
72+
73+
## 四.三者的区别
74+
75+
### 1.定义和隔离性
76+
77+
**进程(Process):** 进程是操作系统中的独立执行单元,每个进程有自己的独立内存空间和系统资源。进程之间相互隔离,通信通常需要使用进程间通信(IPC)机制,如管道、消息队列、共享内存等。
78+
79+
**线程(Thread):** 线程是进程内的执行单元,多个线程共享同一进程的内存空间和资源。线程之间更容易通信和共享数据。
80+
81+
**协程(Coroutine):** 协程是一种轻量级的执行单元,它可以在函数内部暂停和恢复执行。协程通常运行在线程或进程内,但它们具有更灵活的控制流和协作性。
82+
83+
### 2.资源开销
84+
85+
**进程:** 创建和销毁进程的开销相对较大,因为每个进程都需要独立的内存空间和系统资源。
86+
87+
**线程:** 创建和销毁线程的开销较小,因为线程共享同一进程的资源。
88+
89+
**协程:** 创建和销毁协程的开销很小,因为它们通常运行在线程内,共享线程的资源。
90+
91+
### 3.通信和同步
92+
93+
**进程:** 进程之间通信相对复杂,通常需要使用IPC机制来实现。进程之间的同步需要使用信号量、互斥锁等机制。
94+
95+
**线程:** 线程之间通信相对简单,可以直接共享内存或使用线程安全的数据结构。线程之间的同步也可以使用互斥锁等机制。
96+
97+
**协程:** 协程之间通信和同步通常更容易,因为它们运行在同一线程内,可以直接访问共享数据,使用协作性的方式进行同步。
98+
99+
### 4.并发模型
100+
101+
**进程:** 进程通常采用多进程模型,每个进程独立执行,互相不影响。
102+
103+
**线程:** 线程通常采用多线程模型,多个线程共享相同进程的资源。
104+
105+
**协程:** 协程通常使用协作式多任务处理模型,协程之间协作来实现并发。
106+
107+
### 5.稳定性
108+
109+
**进程:** 由于进程之间相互隔离,一个进程的崩溃通常不会影响其他进程。
110+
111+
**线程:** 线程之间共享相同的内存空间,一个线程的错误可能导致整个进程崩溃。
112+
113+
**协程:** 协程通常受到它们所运行的线程或进程的影响,一个协程的错误可能影响整个线程或进程。
114+
115+
### 6.适用场景
116+
117+
**进程:** 进程适用于需要高度隔离和稳定性的任务,如独立的应用程序、服务等。
118+
119+
**线程:** 线程适用于需要高并发性和共享数据的任务,如多线程编程、图形界面应用程序等。
120+
121+
**协程:** 协程适用于需要高度协作、非阻塞和异步处理的任务,如网络编程、异步I/O等。
122+

‎docs/16.多任务重要概念.md‎

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# 多任务的重要概念
2+
3+
## 一.并发|并行
4+
5+
### 1.并发(Concurrent)
6+
7+
并发是指多个任务看似同时执行,但它们不一定在同一时刻都在处理,它们可能会交替执行或通过时间片轮转进行切换。
8+
9+
并发通常用于在一个有限的资源(如单一CPU核心)上同时执行多个任务,以提高系统的效率和响应性。
10+
11+
在并发任务中,任务之间可能会相互干扰或竞争资源,因此需要使用同步机制来协调它们的执行。
12+
13+
### 2.并行(Parallel)
14+
15+
并行是指多个任务同时执行,它们在同一时刻都在进行处理,每个任务有自己的处理单元(如CPU核心)。
16+
17+
并行通常用于利用多核处理器或多个计算资源以提高任务的执行速度。
18+
19+
在并行任务中,每个任务是真正同时进行的,不需要等待其他任务完成。
20+
21+
### 3.并行与并发区别
22+
23+
并行是真正的同时执行多个任务,每个任务有自己的处理单元,没有时间上的交叉。
24+
25+
并发是多个任务看似同时执行,但它们可以在时间上交替执行,共享同一资源。
26+
27+
## 二.阻塞|非阻塞
28+
29+
### 1.阻塞(Blocking)
30+
31+
阻塞是指当一个任务执行时,它会等待某个事件或条件发生,而不会继续执行下一个任务。
32+
33+
在阻塞模式下,任务会一直等待,直到条件满足或事件发生,然后才继续执行。
34+
35+
阻塞通常用于同步编程模型,任务按照顺序执行,等待前一个任务完成后才执行下一个任务。
36+
37+
阻塞可以确保任务在特定条件下执行,但可能导致程序在等待时浪费时间。
38+
39+
### 2.非阻塞(Non-blocking)
40+
41+
非阻塞是指当一个任务执行时,如果不能立即完成,它会立即返回,并允许程序继续执行其他任务,而不是等待。
42+
43+
在非阻塞模式下,任务不会停滞等待,而是会通过轮询或回调等机制来检查条件或事件是否满足,然后继续执行。
44+
45+
非阻塞通常用于异步编程模型,允许程序同时执行多个任务,处理并发操作。
46+
47+
非阻塞可以提高程序的响应性和性能,但需要额外的逻辑来处理任务之间的协调和同步。
48+
49+
### 3.阻塞与非阻塞的区别
50+
51+
阻塞会导致任务等待,直到条件满足或事件发生。
52+
53+
非阻塞允许任务在等待时继续执行其他任务,并通过轮询或回调等方式来检查条件或事件
54+
55+
## 三.同步|异步
56+
57+
### 1.同步(Sync)
58+
59+
在同步编程中,任务按照严格的顺序执行,一个任务必须等待前一个任务完成后才能开始执行。
60+
61+
同步操作是阻塞的,即在执行某个任务时,程序会等待该任务完成后再继续执行下一个任务。
62+
63+
同步通常用于处理简单的顺序任务,易于理解和调试,但在处理多任务或I/O密集型操作时,可能会导致性能问题,因为任务的执行会受到等待的限制。
64+
65+
### 2.异步(Async)
66+
67+
在异步编程中,任务可以并发执行,一个任务不必等待另一个任务的完成,而是可以继续执行其他任务。
68+
69+
异步操作是非阻塞的,即在执行某个任务时,程序不会等待该任务完成,而会继续执行后续任务。
70+
71+
异步通常用于处理并发操作、I/O密集型任务、网络通信等需要非阻塞和高响应性的情况。异步编程可以提高程序的性能和资源利用率。
72+
73+
### 3.同步与异步区别
74+
75+
同步是按照严格的顺序执行任务,一个接一个地执行,等待前一个任务完成。
76+
77+
异步是任务可以并发执行,不需要等待其他任务完成,可以在等待时继续执行其他任务。
78+
79+
## 四.四种术语
80+
81+
举个简单的例子来描述这四种情况,老张要做两件事,用水壶烧开水,看电视,两件事情即两个任务,两个函数。
82+
83+
### 1.同步阻塞(Synchronous Blocking)
84+
85+
老张把水壶放到火上,就坐在那里等水开,开了之后我再去看电视。
86+
87+
### 2.同步非阻塞(Synchronous Non-blocking)
88+
89+
老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。
90+
91+
### 3.异步阻塞(Asynchronous Blocking)
92+
93+
老张把响水壶放到火上,然后就坐在旁边等着听那个烧开的提示音。
94+
95+
### 4.异步非阻塞(Asynchronous Non-blocking)
96+
97+
老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。
98+
99+
> 同步|异步,指的是消息通知的机制。区别在哪里呢?
100+
>
101+
> 在这个例子中同步异步只是对于水壶而言。在使用普通水壶的时候,我要自己主动去观察水是不是烧开了,自己主动去获取烧开的这个结果,即所谓的同步;但是在响水壶的时候,我不需要再管水烧到什么程度了,因为只要水烧开了,那个滴滴的噪声就会通知我的,即所谓的异步。他们的相同点是,在烧水的过程中,老王啥也没干,即“阻塞”。
102+
103+
## 五.总结
104+
105+
**同步阻塞形式:** 效率是最低的。拿上面的例子来说,在烧水的过程中,什么别的事都不做。
106+
107+
**同步非阻塞形式:** 实际上是效率低下的。因为老王需要不断的在看电视与烧水之间来回跑动,看一下电视,又要去看一下水烧开没有,这样来回跑很多次,在程序中,程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。
108+
109+
**异步阻塞形式:** 异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。 这个效率其实跟同步阻塞差不多的。
110+
111+
**异步非阻塞形式:** 效率更高。因为老王把水烧好之后就不用管了,可以安安心心去看电视,不用来回奔波看水烧开了没,因为水烧开了会有提示告诉他水烧好了,这样效率岂不是更高。
112+
113+
那有没有更好的办法?当然有,如果老王还有一个帮手老张,让老王自己看电视、同时老张去烧开水,这样岂不是更好?这就是所谓的并行
114+
115+
116+

0 commit comments

Comments
 (0)