操作系统学习9进程间通信和文件系统

进程间通信

进程间通信,简称IPC,Inter Process Communication。

传统上我们认为,进程间要保持相对独立,地址空间是独立的。然而,进程之间需要协作完成一些大型任务。所以进程间要在保持相对独立的同时,有相互的沟通。进程间通信提及的信号,和之前的信号量是不一样的。

1、通信模型

操作系统学习9进程间通信和文件系统

2、直接与间接通信

操作系统学习9进程间通信和文件系统

左边是间接通信,右边是直接通信。左边进程A先把消息发送到内核,内核再把消息发给B。

操作系统学习9进程间通信和文件系统

对于直接通信来说,链路的建立一定要通过操作系统。因为打破了进程之间的隔离,而操作系统拥有最高的权限。

操作系统学习9进程间通信和文件系统

操作系统学习9进程间通信和文件系统

3、阻塞与非阻塞

对于进程间的通信,有两个很重要的概念:进程间消息的传递,可以是阻塞的或者是非阻塞的。阻塞被认为是同步的,非阻塞被认为是异步的。 

操作系统学习9进程间通信和文件系统

4、通信链路缓冲

有以下几种缓存的容量情况。缓存的意义在于,发送方和接收方的动作也许并不是同步的,也许处理的速度一快一慢等情况,这个时候借助缓存就很有必要。一般情况都是第二种情况。

操作系统学习9进程间通信和文件系统

5、四种进程间通信的手段(https://www.cnblogs.com/LUO77/p/5816326.html讲得很好)

第一到第三种都是间接通信。第四种是直接通信。

(1)信号。信号主要是Linux的机制

信号是Linux系统中用于进程之间通信或操作的一种机制,信号可以在任何时候发送给某一进程,而无须知道该进程的状态。如果该进程并未处于执行状态,则该信号就由内核保存起来,知道该进程恢复执行并传递给他为止。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

 

Linux提供了几十种信号,分别代表着不同的意义。信号之间依靠他们的值来区分,但是通常在程序中使用信号的名字来表示一个信号。在Linux系统中,这些信号和以他们的名称命名的常量被定义在/usr/includebitssignum.h文件中。通常程序中直接包含<signal.h>就好。

 

信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式,信号可以在用户空间进程和内核之间直接交互。内核也可以利用信号来通知用户空间的进程来通知用户空间发生了哪些系统事件。信号事件有两个来源:

1)硬件来源,例如按下了cltr+C,通常产生中断信号sigint

2)软件来源,例如使用系统调用或者命令发出信号。最常用的发送信号的系统函数是kill,raise,setitimer,sigation,sigqueue函数。软件来源还包括一些非法运算等操作。

 

一旦有信号产生,用户进程对信号产生的相应有三种方式:

1)执行默认操作,linux对每种信号都规定了默认操作。

2)捕捉信号,定义信号处理函数,当信号发生时,执行相应的处理函数。

3)忽略信号,当不希望接收到的信号对进程的执行产生影响,而让进程继续执行时,可以忽略该信号,即不对信号进程作任何处理。

  有两个信号是应用进程无法捕捉和忽略的,即SIGKILL和SEGSTOP,这是为了使系统管理员能在任何时候中断或结束某一特定的进程。


操作系统学习9进程间通信和文件系统

实现过程:

操作系统学习9进程间通信和文件系统

(2)管道

管道允许在进程之间按先进先出的方式传送数据,是进程间通信的一种常见方式。

管道是Linux 支持的最初Unix IPC形式之一,具有以下特点:

1) 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道

2) 匿名管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);

3) 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。

 

管道分为pipe(无名管道)和fifo(命名管道)两种,除了建立、打开、删除的方式不同外,这两种管道几乎是一样的。他们都是通过内核缓冲区实现数据传输。

  • pipe用于相关进程之间的通信,例如父进程和子进程,它通过pipe()系统调用来创建并打开,当最后一个使用它的进程关闭对他的引用时,pipe将自动撤销。
  • FIFO即命名管道,在磁盘上有对应的节点,但没有数据块——换言之,只是拥有一个名字和相应的访问权限,通过mknode()系统调用或者mkfifo()函数来建立的。一旦建立,任何进程都可以通过文件名将其打开和进行读写,而不局限于父子进程,当然前提是进程对FIFO有适当的访问权。当不再被进程使用时,FIFO在内存中释放,但磁盘节点仍然存在。

管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据:管道一端的进程顺序地将进程数据写入缓冲区,另一端的进程则顺序地读取数据,该缓冲区可以看做一个循环队列,读和写的位置都是自动增加的,一个数据只能被读一次,读出以后再缓冲区都不复存在了。当缓冲区读空或者写满时,有一定的规则控制相应的读进程或写进程是否进入等待队列,当空的缓冲区有新数据写入或慢的缓冲区有数据读出时,就唤醒等待队列中的进程继续读写。

(3)消息队列

消息队列,就是一个消息的链表,是一系列保存在内核中消息的列表。用户进程可以向消息队列添加消息,也可以向消息队列读取消息。

消息队列与管道通信相比,其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序,而是可以根据自定义条件接收特定类型的消息。

可以把消息看做一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程可以从消息队列中读取消息。

(4)共享内存

共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信。

 

采用共享内存进行通信的一个主要好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝,对于像管道和消息队里等通信方式,则需要再内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次:一次从输入文件到共享内存区,另一次从共享内存到输出文件。

操作系统学习9进程间通信和文件系统

一般而言,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时在重新建立共享内存区域;而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件,因此,采用共享内存的通信方式效率非常高。

共享内存优点:最快、传递信息量最大的方法、一个进程写,另一个进程立刻可见、没有系统调用干预、没有数据复制、系统不提供同步(同步方式由程序员提供)

不足之处是必须同步数据的访问,否则可能会出错。


文件系统

操作系统学习9进程间通信和文件系统

文件系统的功能:

操作系统学习9进程间通信和文件系统

1、文件描述符

 操作系统学习9进程间通信和文件系统

 

文件是一种共享资源,允许多个进程打开同一个文件

 

2、管理文件需要什么

 操作系统学习9进程间通信和文件系统

3、从用户和系统的视角看文件

 操作系统学习9进程间通信和文件系统

怎么把磁盘块和文件的数据对应起来,建立映射关系?在我们读写的时候更多是以字节来读写,而对磁盘来说是扇区,如何统一?

 

块(block),或者说磁盘块,是个虚构的概念,逻辑上的概念,是对文件系统而言的。由于用扇区存储文件太慢了,所以使用了块,它是文件存取的最小单位。块的大小是由操作系统自己定义的,一般一个块的大小是4kb。硬盘本身是没有块这个概念的。

 

扇区(sector)是在物理上真实存在的。磁盘驱动器操作磁盘数据,每次都以扇作为最小单位。

 

操作系统操作需要与内存、硬盘这两种硬件设备打交道。 都需要虚拟一种单位来操作。与内存操作,是虚拟一个页的概念来作为最小单位。 与硬盘打交道,就是以块为最小单位。

 操作系统学习9进程间通信和文件系统

4、用户访问文件的方式

 

 操作系统学习9进程间通信和文件系统

 

5、文件内部的结构

 操作系统学习9进程间通信和文件系统

6、目录

 操作系统学习9进程间通信和文件系统


操作系统学习9进程间通信和文件系统 

 

7、目录文件要如何组织,或者说如何实现

 操作系统学习9进程间通信和文件系统

等等

 操作系统学习9进程间通信和文件系统

 操作系统学习9进程间通信和文件系统

这个机制是为了形成一个分层次的跨文件系统的访问。挂载点指的是一个目录,这个目录代表了这个文件系统的根的位置。

 

8、文件别名,指的是两个或者多个文件名关联同一个文件。

unix中,主要是硬链接和软链接两个形式。

 操作系统学习9进程间通信和文件系统

软链接和硬链接不一样的。软链接指的是,这个文件里的内容里面存的是一个路径名,读了这个内容然后根据这个路径来访问这个文件。硬链接里多个文件名指向同一个文件,这几个不同文件名的文件内容只有一个。

 

 操作系统学习9进程间通信和文件系统

9、文件系统种类

 操作系统学习9进程间通信和文件系统

9、虚拟文件系统

 操作系统学习9进程间通信和文件系统

 操作系统学习9进程间通信和文件系统

通过一层虚拟层,屏蔽了顶层具体文件系统的差异性,从而可以令应用程序可以访问不同类型的文件系统,但是应用程序可以不知道底层文件系统的实现。虚拟文件系统不存在在硬盘上,存在在内存中。操作系统一创建,虚拟文件系统就创建好。

 

虚拟文件系统的构成:

 操作系统学习9进程间通信和文件系统

 

 操作系统学习9进程间通信和文件系统

操作系统学习9进程间通信和文件系统

10、数据块缓存

 操作系统学习9进程间通信和文件系统

在磁盘中的数据块和页大小不一定是一样的,这就需要有一种机制,把页和数据块的缓存结合在一起。这就是分页的机制。

 操作系统学习9进程间通信和文件系统

11、打开文件的数据结构

 操作系统学习9进程间通信和文件系统

12、文件分配

文件分配的意思是对文件的数据空间的管理。例如,打开一个文件,要往文件里面添加或者删除数据,那怎么对文件的数据空间进行管理?

 操作系统学习9进程间通信和文件系统

 

(1)连续分配

 操作系统学习9进程间通信和文件系统

(2)链式分配

 操作系统学习9进程间通信和文件系统

(3)索引分配

 

要访问文件时,索引块调入到内存中,从索引块中找到文件的索引数据块,用来修改文件。但是面对大文件,有可能索引数据块放不下文件里所有的数据块的地址。

 操作系统学习9进程间通信和文件系统

面对大文件的解决方法:用多个索引块

 操作系统学习9进程间通信和文件系统

13、空闲空间管理

 操作系统学习9进程间通信和文件系统

(1)用位图来表示

 操作系统学习9进程间通信和文件系统

(2)链式链表

(3)分组列表

 操作系统学习9进程间通信和文件系统

 

磁盘的优化技术:多次盘管理RAID和磁盘调度。

14、多磁盘管理-RAID

磁盘阵列(Redundant Arrays of Independent DisksRAID),有独立磁盘构成的具有冗余能力的阵列之意。

磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。

磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。

磁盘的结构如下:

 操作系统学习9进程间通信和文件系统

磁盘(Disk)由一个个盘片构成,盘片在不断旋转,磁头在不断前后移动来寻道,寻到一个道后在一个道内有不同的扇区,通过磁头把数据读到内存中。这里面最慢的动作就是磁头的前后移动。对于磁盘来说,可以分区(Partition),在这幅图是PartitionAPartitionB。对于操作系统来说,一个卷通常对应一个分区。但是,一个分区也可以对应多个磁盘,也就是把多个Disk当成一个卷来管理,也就是文件系统可以位于多个磁盘上。这就是RAID的基本想法,就是通过一个文件系统同时管理多个Disk,一些Disk可以存储一些相同的信息提高可靠性,一些Disk可以通过并行提高吞吐量。

 

 操作系统学习9进程间通信和文件系统

 操作系统学习9进程间通信和文件系统

RAID是分等级的,具体的分级都有其自己的标准,这里不做详细分析。

 

(1)提高吞吐量

 操作系统学习9进程间通信和文件系统

如图,要读的三组数据,分别存储在三个硬盘中,操作系统可以并行地读写数据,提高吞吐量。

(2)可靠性

 操作系统学习9进程间通信和文件系统

每次写操作都是向两个硬盘里写同样的数据,作为备份和容错。但是本来的一次操作要做两次,这也带来了额外的开销。

(3)把提高吞吐量和可靠性的好处结合起来

这里有四个盘,1,2,3,4是用来分布地存储了数据的,这就有提高吞吐量的好处。而Parity盘存储的是前面四个盘的奇偶校验位。所以如果某个盘数据出错,可以通过这个奇偶校验位来恢复原来正确的数据。但是四个都坏了,那就恢复不了。只能恢复一个数据。这里的缺点是,Parity的读写非常频繁,因为只要对其中一个盘进行写操作,都要对他进行更新。

 操作系统学习9进程间通信和文件系统

这里是一个改进:

 操作系统学习9进程间通信和文件系统

把奇偶校验块均匀分布在四个盘中,这样的话校验的开销是均匀的,访问也是并行的。

 

15、磁盘调度

多磁盘管理是提高磁盘访问的效率。磁盘调度是在操作系统层面,通过有效重新组织IO操作的顺序,减少磁盘访问的开销。先再回顾一下,磁盘是怎么读写的。

 操作系统学习9进程间通信和文件系统

在这里寻道时间是最耗时的。如果请求是随机的,那不断的磁盘前后寻道,会导致性能很差,开销很大。

 操作系统学习9进程间通信和文件系统

(1)FIFO

 操作系统学习9进程间通信和文件系统

这样做性能很差,接近随机的性能。

(2)SSTF,最短服务优先

 操作系统学习9进程间通信和文件系统

这个方法的问题是,如果有请求频繁地在当前探头所在磁道附近,那远离磁道的请求可能迟迟无法得到响应,导致饥饿现象。

(3)SCAN,扫描方法

 操作系统学习9进程间通信和文件系统

这个方法的更优化:C-SCAN

 操作系统学习9进程间通信和文件系统

更改进的版本:到达最后一个请求点就立刻返回,而不是到达最低点

 操作系统学习9进程间通信和文件系统