File tree 2 files changed +26
-2
lines changed
2 files changed +26
-2
lines changed Original file line number Diff line number Diff line change 7
7
8
8
经典的使用多进程的程序有 nginx、PostgreSQL 等,其中 nginx 使用多进程的主要目的是负载均衡,不同的客户端连接将会分配到不同工作进程进行处理,一个工作进程会处理多个连接,而 PostgreSQL 则是为每一个客户端连接都开启新的进程,一个进程只处理一个连接。
9
9
10
- ## 共享内存
10
+ 在多线程编程中,由于线程之间共享资源,所以我们将注意力放到了如何避免共享资源出错,也就是避免竞态条件上。而在多进程编程里,我们首先需要解决如何让多个进程进行通信的问题。
11
11
12
- ## IPC
12
+ ## System V IPC
13
+
14
+ 大多数操作系统,例如 Linux、Solaris 等都实现了 System V 中引入的 IPC API。
15
+
16
+ 这套经典的 API 包含以下组成部分。其中前三种是支持最广泛的。
17
+
18
+ * 信号量(Semaphore)
19
+ * 消息队列(Message queue)
20
+ * 共享内存(Shared memory)
21
+ * 管道(Pipe)
22
+
23
+ ### 信号量
24
+
25
+ 和我们在多线程编程中介绍的 POSIX 信号量不同,System V 信号量更加复杂。
26
+
27
+ ### 消息队列
28
+
29
+ ### 共享内存
30
+
31
+ ### 管道
Original file line number Diff line number Diff line change @@ -354,6 +354,11 @@ terminate called without an active exception
354
354
???+info
355
355
容易发现,如果我们创建一个初始值为 1 的信号量,那么它在功能上就等同于一个互斥量了。进行 P 操作相当于上锁,进行 V 操作相当于解锁。
356
356
357
+ ???-info "P 操作和 V 操作名字的由来"
358
+ 信号量的概念其实是由荷兰计算机家 Dijkstra 提出的,他在论文里用荷兰语 Passering 和 Vrijgave 两个单词来分别形容上述的两个操作。
359
+
360
+ Dijkstra 为计算机并行编程做出了卓越贡献,我们很快就会在后文看到他提出的关于并发的一个经典的问题。
361
+
357
362
在 Linux 中,信号量主要有两种实现:System V Semaphore 和 POSIX Semaphore。其中后者较为常用,因此接下来简单介绍后者。
358
363
359
364
POSIX Semaphore 相关的 API 位于头文件 ` semaphore.h ` 中,P 操作对应 ` sem_wait ` 函数,V 操作对应 ` sem_post ` 函数。
You can’t perform that action at this time.
0 commit comments