-
Notifications
You must be signed in to change notification settings - Fork 1
8月16日学习
16.3 Linux信号机制
Signal Model
Signal Handler Control Flow
Signal handlers
Ref:1、Understanding the Linux Kernel 2、Signals and Inter-Process Communication
信号的实现相当于进程中断
sigaltstack()系统调用可以改堆栈
16.4 消息队列和共享内存
消息队列是由OS维护的以字节序列为基本单位的间接通信机制
每个消息(Message)是一个字节序列,相同标识的消息组成按先进先出顺序组成一个消息队列(Message Queues)
msgget(key,flags) 获取消息队列标识
msgsnd(QID,buf,size,flags) 发送消息
msgrcv(QID,buf,size,type,flags) 接收消息
msgctl(...)消息队列的控制
共享内存:把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制
进程:每个进程都有私有内存地址空间;每个进程的内存地址空间需明确设置共享内存段
线程:同一进程中的线程总是共享相同的内存地址空间
优点:快速、方便地共享数据
不足:必须用额外的同步机制来协调数据访问,避免一个进程在写的过程当中,还没有写完之前,另一个进程从里面读
最快的方法,一个进程写另外一个进程立即可见,没有系统调用的干预,没有数据复制
麻烦:不提供同步,由程序员提供同步
shmget(key,size,flags) 创建共享段
shmat(shmid, *shmaddr, flags) 把共享段映射到进程地址空间
shmdt(*shmaddr) 取消共享段到进程地址空间的映射
shmctl(...) 共享段控制
共享关系的建立,共享内存的访问只需要读写指令即可
需要信号量等机制协调共享内存的访问冲突
16.4 D-Bus机制
D-Bus介绍:2002年创建的一种进程间通信机制,是freedesktop.org项目的一部分,由Redhat和FreeDesktop社区维护,主要Linux桌面环境中的通信服务
早期的IPC机制,socket相对使用广泛,某些机制已经很少使用
更高级的,使用socket机制,提供了软件总线抽象,比传统IPC机制简单
主要在用户态来执行,
基本特征:
1、高层次的IPC
2、Multicast & point-to-point
3、OS/architecture/language无关
4、GNOME,KDE,xfce
优势:
低延迟:无socket的循环的等待
低开销:使用一个二进制的协议
高可用性:基于消息机制而不是字节流机制
D-Bus结构
1、一个库libdbus,它允许两个应用程序相互连接并交换消息
2、一个消息总线守护程序(daemon),建立在libdbus,多个应用程序可以连接到
3、包装程序库或基于特定应用程序框架的绑定
4、System Bus & Session Bus
5、通过policy文件制定安全机制
D-Bus的总线bus
相当于D-BUS的通信链路,应用之间通过总线进行通信。应用在总线上寻找service
系统总线System Bus:用于kernel,系统应用/服务
任务总线Session Bus:用于gnome/kde等应用通信
服务service:
服务是提供IPC API的程序,每个服务都有一个reverse domain name结构的标识名称
org.freedesktop.NetworkManager对应系统总线上的NetworkManager
org.freedesktop.login1对应系统总线上的systemd-logind
D-Bus的对象(object)
相当于通信的地址,每个service的object都通过object path来标识
object path类似文件系统的路径
如/org/freedesktop/login1是服务 org.freedesktop.login1的manager对象的路径
D-Bus的接口
D-Bus接口定义了D-Bus对象支持的方法method和信号signal,每个object包含一个或者多个interfaces
D-Bus的方法(method)
D-Bus方法可以接受任意数量的参数,并且可以返回任意数量的值,包括任何值
D-Bus的信号(signal)
D-Bus信号提供了一对多的发布-订阅机制
与方法返回值类似,D-Bus信号可能包含任意数量的数据
与方法不同,信号是完全异步的,并且可以随时由D-Bus对象发出
D-Bus的方法(method)的执行流程
1、应用调用代理上的方法,代理将构造一个方法调用消息给远端的进程
2、方法调用消息发送到bus daemon中
3、bus daemon查找目标的bus name,如果找到,就把这个方法发送到该进程中
4、在dbus高层接口中,会先检测并转换成对应的对象的方法,然后再将应答结果转换成应答消息发给daemon
5、bus daemon接受到应答消息,将把应答消息直接发给发出调用消息的进程
16.6 Binder机制
Linux kernel vs Android
android需要做出高性能的GUI系统,需要频繁,高效的IPC调用和消息传递
binder - 新的IPC机制
ashmem - 新的shared memory机制
logger
......
每个进程带一个Dalvik VM
android中不同的进程之间,内部的一些方法或者函数可以被别的进程无缝的调用,就像本地调用的实现,所以提出了一个Task概念
开发的高效,运行的高效
interface 自动生成 auto generated from .aidl file
intent 最高层的IPC抽象
AIDL Android Interface Definition Language
Binder: kernel driver
ashmem:shared memory
一次拷贝
第十七讲 文件系统概念
17.1 文件系统和文件
文件系统是OS中负责持久数据保存的子系统,提供数据存储和访问功能
组织、检索、读写访问数据
大多数计算机系统都有文件系统
Google也是一个文件系统
文件是具有符号名,由字节序列构成的数据项集合,是文件系统的基本数据单位,文件名是文件的标识符号,
文件系统的功能:分配文件磁盘空间:管理文件夹(位置和顺序)、管理空闲空间(位置)、分配算法(策略)
管理文件集合:定位(文件及其内容)、命名(通过名字找到文件)、文件系统结构(文件组织方式)
数据可靠和安全 安全:多层次保护数据安全;可靠:持久保存文件;避免系统崩溃、媒体错误、攻击等
文件属性:名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间、....
文件头:文件系统元数据中的文件信息,文件属性、文件存储位置和顺序
17.2 文件描述符
文件描述符是指打开的文件在内存当中所维护的相关信息
文科访问模式:进程访问文件数据前必须先“打开”文件
f = open(name,flag);
...
read(f,...);
...
close(f);
内核跟踪进程打开的所有文件,OS为每个进程维护一个打开文件表,文件描述符是打开文件的标识
OS在打开文件表中维护的打开文件状态和信息
包括:
1、文件指针(最近一次读写位置,每个进程分别维护自己的打开文件指针)每个进程只是跟自己的指针相关联,另外一个进程读写相同的文件,进程的文件指针并不随着它的读写而发生改变
2、文件打开计数,当前这个被打开的文件打开的次数,最后一个进程关闭文件时,将其从打开文件表中移除
3、文件的磁盘位置,缓存数据访问信息,会将磁盘上的文件的内容缓存到内存当中,下次再读的时候,有缓存的数据就可以直接读取缓存数据
4、访问权限,每个进程的文件访问模式信息,每个进程访问文件的时候以什么样的方式来进行访问,比如,只读、可读可写
文件的用户视图和系统视图
文件的用户视图:用户进程看到的文件是什么样的,文件是持久的数据结构,
从系统的角度来讲,系统提供了一个系统访问接口,文件变成一个字节序列,字节序列的集合(UNIX),系统并不关心存储在磁盘上的数据结构
OS的文件视图:数据块的集合,数据块是逻辑存储单元,可能由多个扇区组成,而扇区是物理存储单元,数据块的大小可能和扇区的大小不一样,通常是几个扇区构成一个数据块,特别是对于容量比较大的磁盘来说
用户视图到系统视图的转换
进程读文件,首先读取对应内容的所在的数据块,即获取字节所在的数据块,整块读出来,也就是说磁盘的访问,最小访问单位只能是块,不能对块中单独的字节进行读或者写,将其中需要的内容返回给进程
进程写文件,先读取相应的数据块,然后修改相应块中对应的内容,修改完毕之后,把整块写回去
文件系统中的基本操作单位是数据块
例如,getc()和putc()即使每次只访问1字节的数据,也需要缓存目标数据4096字节
进程对文件的访问模式:
OS在实现文件系统的时候,操作系统需要了解进程如何访问文件,有三种方式:
1、顺序访问:按字节依次读取,大多数的文件访问都是顺序访问
2、随机访问:从中间读写,不常用,但仍然重要,例如,虚拟内存中把内存页存储在文件
3、索引访问:依据数据特征索引,依据数据特征来找文件当中相应位置的数据,通常情况下,OS并不完整提供索引访问机制,一种方法是在上面建数据库,数据库提供完善的索引访问方式,实际上某种角度来讲,我们可以认为OS里的文件系统是一个小型的数据库
文件内部结构:
1、无结构,单词、字节序列
2、简单的记录结构,将它分成若干列,每一列是其中的一个内容,这种列的大小或者记录的大小可以有固定长度的,也可以是可变长度的
3、复杂结构的,这种结构通常都是应用程序来识别,从OS层面来讲,并不是很关心,格式化的文档(如,MS Word,PDF),可执行文件...
文件的共享和访问控制
多用户系统中的文件共享是很必要的,通过共享可以节约磁盘的存储空间
共享之后就带来一个问题,访问如何来控制,每个用户能够获得哪些文件的哪些访问权限,访问模式:读、写、执行、删除、列表等
这些基本的权限对应到每一个用户就是文件访问控制列表(ACL)
<文件实体,权限>
Unix模式 <用户|组|所有人,读|写|可执行>
用户标识ID,识别用户,表明每个用户所允许的权限及保护模式
组标识ID,允许用户组成组,并指定了组访问权限
语义一致性
规定多进程如何同时访问共享文件,与同步算法相似,因磁盘IO和网络延迟而设计简单
UNIX文件系统(UFS)语义
对打开文件的写入内容立即对其他打开同一文件的其他用户可见
共享文件指针允许多用户同时读取和写入文件
会话语义:写入内容只有当文件关闭时其他用户才可见
读写锁:一些OS和文件系统提供该功能,OS提供功能,进程自己选择