diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index 04ece479..42a2d317 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -10,8 +10,8 @@ * [进程状态的切换](#进程状态的切换) * [调度算法](#调度算法) * [进程同步](#进程同步) - * [进程通信](#进程通信) * [经典同步问题](#经典同步问题) + * [进程通信](#进程通信) * [三、死锁](#三死锁) * [死锁的必要条件](#死锁的必要条件) * [死锁的处理方法](#死锁的处理方法) @@ -160,14 +160,14 @@ Linux 系统的系统调用有以下这些:

-- 就绪状态(ready):等待 CPU 时间 +- 就绪状态(ready):等待被调度 - 运行状态(running) - 阻塞状态(waiting):等待资源 应该注意以下内容: - 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。 -- 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 事件会从运行态转换为就绪态。 +- 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。 ## 调度算法 @@ -385,44 +385,6 @@ begin end; ``` -## 进程通信 - -

- -### 1. 管道 - -写进程在管道的尾端写入数据,读进程在管道的首端读出数据。管道提供了简单的流控制机制,进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样地,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。 - -Linux 中管道通过空文件实现。 - -管道有三种: - -1. 普通管道:有两个限制,一是只能单向传输;二是只能在父子进程之间使用; -2. 流管道:去除第一个限制,支持双向传输; -3. 命名管道:去除第二个限制,可以在不相关进程之间进行通信。 - -### 2. 信号量 - -信号量是一个计数器,可以用来控制多个进程对共享资源的互斥访问,主要作为进程间以及同一进程内不同线程之间的同步手段。 - -### 3. 消息队列 - -消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 - -### 4. 信号 - -信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 - -### 5. 共享内存 - -共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。 - -共享内存是最快的 IPC 方式,它是针对其它 IPC 运行效率低而专门设计的。它往往与其它通信机制(如信号量)配合使用,来实现进程间的同步和通信。 - -### 6. 套接字 - -套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信。 - ## 经典同步问题 生产者和消费者问题前面已经讨论过了。 @@ -535,6 +497,59 @@ void test(i) { // 尝试拿起两把筷子 } ``` +## 进程通信 + +### 1. 进程同步与进程通信的区别 + +- 进程同步:控制多个进程按一定顺序执行; +- 进程通信:进程间传输信息。 + +进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。 + +在进程同步中介绍的信号量也属于进程通信的一种方式,但是属于低级别的进程通信,因为它传输的信息非常小。 + +### 2. 进程通信方式 + +#### 2.1 消息传递 + +操作系统提供了用于通信的通道(Channel),进程可以通过读写这个通道进行通信。 + +

+ + **(1)管道**
+ +写进程在管道的尾端写入数据,读进程在管道的首端读出数据。管道提供了简单的流控制机制,进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样地,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。 + +Linux 中管道通过空文件实现。 + +管道有三种: + +1. 普通管道:有两个限制,一是只能单向传输;二是只能在父子进程之间使用; +2. 流管道:去除第一个限制,支持双向传输; +3. 命名管道:去除第二个限制,可以在不相关进程之间进行通信。 + +

+ + **(2)消息队列**
+ +消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 + +

+ + **(3)套接字**
+ +套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信。 + +

+ +#### 2.2 共享内存 + +操作系统建立一块共享内存,并将其映射到每个进程的地址空间上,进程就可以直接对这块共享内存进行读写。 + +共享内存是最快的进程通信方式。 + +

+ # 三、死锁 ## 死锁的必要条件 diff --git a/pics/037c3a0b-332d-434d-a374-f343ef72c8e1.jpg b/pics/037c3a0b-332d-434d-a374-f343ef72c8e1.jpg new file mode 100644 index 00000000..68950556 Binary files /dev/null and b/pics/037c3a0b-332d-434d-a374-f343ef72c8e1.jpg differ diff --git a/pics/699b4f96-d63f-46ea-a581-2b3d95eceb6a.jpg b/pics/699b4f96-d63f-46ea-a581-2b3d95eceb6a.jpg new file mode 100644 index 00000000..313b0f92 Binary files /dev/null and b/pics/699b4f96-d63f-46ea-a581-2b3d95eceb6a.jpg differ diff --git a/pics/7be0abf9-687c-4451-becd-626b0be7ec22.jpg b/pics/7be0abf9-687c-4451-becd-626b0be7ec22.jpg new file mode 100644 index 00000000..002f50ac Binary files /dev/null and b/pics/7be0abf9-687c-4451-becd-626b0be7ec22.jpg differ diff --git a/pics/7f642a65-b167-4c8f-b382-8322c6322b2c.jpg b/pics/7f642a65-b167-4c8f-b382-8322c6322b2c.jpg new file mode 100644 index 00000000..27751a37 Binary files /dev/null and b/pics/7f642a65-b167-4c8f-b382-8322c6322b2c.jpg differ diff --git a/pics/d49466db-fdd3-4d36-8a86-47dc45c07a1e.jpg b/pics/d49466db-fdd3-4d36-8a86-47dc45c07a1e.jpg new file mode 100644 index 00000000..c4c7a915 Binary files /dev/null and b/pics/d49466db-fdd3-4d36-8a86-47dc45c07a1e.jpg differ