虚拟文件系统(VFS),属于软件层次,VFS明确了内核和具体文件系统之间的接口,能够用来访问一个本地或者网络存储设备且同时不会让用户应用知道区别。
这里要补充的是通信机制:
① 消息传递:
进程间的数据交换以格式化的消息为单位。通过操作系统提供的发送消息和接收消息两个原语进行数据交换。消息传递需要在内核和用户空间中进行数据的拷贝,需要对消息进行格式化和排队。
消息传递的实现方式有多种,其中一种就是Socket:
Socket(套接字):Socket通常用于不同机器之间的进程通信,需要经过传输层以下的协议栈,而且可能涉及数据的加密和压缩。
① 消息传递在"微内核"部分出现了,微内核操作系统客户和服务器,服务器和服务器之间通信采用消息传递机制,所以微内核系统能够支持分布式系统和网络系统。
② 在多计算机系统也有出现:
多计算机系统也称为消息传递系统,其与多处理系统的区别在于,各计算机之间的主存是相互独立的,不能通过LOAD/STORE指令直接访问对方的主存储器,只能通过“消息传递”相互传送数据。因此计算机之间的地址空间是相互独立的。
多个计算机组合后,可以协同工作。例如,将某一工作拆分为独立的子任务,分别交给计算机执行,那么这些子任务就可以并行地被处理,也就是指令流可以并行执行。在执行各自指令时,各个计算机处理的数据也各不相同,所以数据流也是并行的。
所以多计算机系统也可以实现MIMD(多指令流多数据流)技术。
与之对应的是多处理器系统:
多处理系统的全称是共享内存多处理器(Share Memory multiProcessor,SMP)。各处理器之间,可以通过LOAD/STORE指令,访问同一个主存储器,可通过主存相互传送数据。
如下图所示,所有核心共享同一个物理地址,同时也共享最低一级的Cache(更高级别的Cache专属于某个特定的核)。所以核之间想相互传递数据,就可以通过最低一级的Cache进行,也可以通过主存储器进行。
补充:对于多处理器系统,多个处理器通过一个共享的存储器区域来进行通信,使用的通信机制就是"共享存储区"。查了一下,多处理器系统还可以采用其他通信机制,如消息传递机制。在消息传递机制中,每个处理器都有一个私有的局部存储器,处理器之间的通信通过显式地传递消息来完成。
② 管程 ③ 信号量:
条件变量是管程中出现的概念(王道p110)。
当一个进程进入管程后被阻塞,直到阻塞的原因解除时,在此期间,如果该进程不释放管程,那么其他进程无法进入管程。为此,将阻塞原因定义为条件变量condition。通常,一个进程被阻塞的原因可以有多个,因此在管程中设置了多个条件变量。每个条件变量保存了一个等待队列,用于记录因该条件变量而阻塞的所有进程,对条件变量只能进行两种操作,即wait和signal。
条件变量和信号量的比较:
相似点:条件变量的 wait/signal 操作类似于信号量的 P/V 操作,可以实现进程的阻塞,唤醒。
不同点:条件变量是“没有值”的,仅实现了“排队等待”功能;而信号量是“有值”的,信号量的值反映了剩余资源数,而在管程中,剩余资源数用共享数据结构记录。信号量机制中的V操作一定会改变信号量的值S=S+1。而管程中的signal操作是针对某个条件变量的,若不存在因该条件而阻塞的进程,则 signal不会产生任何影响。
④ 管道:
1.管道
管道实际上是一种固定大小的缓冲区,管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统。① 类似于通信中半双工信道的进程通信机制,一个管道可以实现双向的数据传输,而同一个时刻只能最多有一个方向的传输,不能两个方向同时进行。要实现双向数据传输,就需要定义两个方向相反的管道。
② 管道是一种只存储在内存中的、固定大小的缓冲区,管道的大小通常为内存的一页,其大小并不是受磁盘容量大小的限制。
③ 由于管道的读/写操作都可能遇到缓冲区满或空的情况,当管道满时,写操作会被阻塞,直到有数据读出;而当管道空时,读操作会被阻塞,直到有数据写入。
④ 一个管道可以有多个读进程或多个写进程对其进行操作,但是这会增加数据竞争和混乱的风险,为了避免这种情况,应使用互斥锁或信号量等同步机制来保证每次只有一个进程对管道进行读或写操作。所以,"一个管道只能有一个读进程或一个写进程对其操作"是错误的。
⑤ 管道只能由创建进程所访问,当父进程创建一个管道后,由于管道是一种特殊文件,子进程会集成父进程的打开文件,因此子进程也继承父进程的管道,并可用它来与父进程进行通信。
⑤ 共享存储:
在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行读/写操作实现进程之间的信息交换。共享存储不需要任何数据拷贝和中介,是最快的进程通信方式。
文件映射是共享存储区的一种实现方式,它允许多个进程共享同一个文件或者内存区域的内容。
⑥共享文件:
共享文件是通过文件系统提供的方式,允许多个进程同时访问同一个文件的数据。进程可以通过打开文件来读取或写入其中的数据。
管道和共享文件的区别:
① 共享文件存在于文件系统中,可以持久存储和重复使用;而管道存在于内存中,只能用于一次性的或者短期的数据传输。
② 数据流方向: 管道是单向的数据流,而文件可以支持随机访问和双向数据交换。
⑦ 信号(新增考点)
【408新大纲】新增知识点精讲——信号_哔哩哔哩_bilibili
若有遗漏或错误,评论区补充哈