Linux系统——机制策略(一)

 机制策略(一)

形而上谓之道;
形而下谓之器; ————易经


LinuxUnix设计理念提供的一种机制不是策略:
1、如果说机制是一种框架,那么,策略就是填充框架的一个个具体实施。机制提供的就是一种开放而宽松的环境,
而策略就是在这个环境下赖以生存的生命个体。


2、一个系统调用的执行机制:
(1)库函数以及应用程序怎样使用系统调用,内核不关心,内核只和系统调用打交道,而且是实现系统调用的大场景;
(2)系统调用抽象出来用于完成某种特点目的的函数,至于这些函数怎样用,不是内核所关心的;所以Linux内核只提
供机制框架,而不提供具体的解决策略。这就跟C语言类似,使其在编程时可以更加的灵活,但这明显提高了编程要求,
不但要求程序员自己考虑需要使用哪种系统调用,还有当使用某个API函数实现功能时需要考虑细节上的东西,因为由
系统提供的API接口函数是抽象出来用于完成某种特点目的的函数只实现了粗框架,针对各种的应用场景需要调用者自
己考虑;


3、为了隐藏差异性,使用了VFS虚拟系统机制:总体上说 Linux 下的文件系统主要可分为三大块:
一是上层的文件系统的系统调用,二是虚拟文件系统 VFS(Virtual Filesystem Switch),三是挂载到 VFS 中的各
实际文件系统,例如 ext2,jffs 等。
VFS是一种软件机制,也许称它为 Linux 的文件系统管理者更确切点,与它相关的数据结构只存在于物理内存当中;
每次系统初始化期间,Linux都首先要在内存当中构造一棵 VFS的目录树(在 Linux的源代码里称之为 namespace),实际
上便是在内存中建立相应的数据结构。VFS 中的各目录其主要用途是用来提供实际文件系统的挂载点,当然在 VFS 中也
会涉及到文件级的操作。VFS主要目的是实现各种系统之间的差异,使接口统一;


4、操作系统执行机制:
OS本质————首先是管理者(管理硬件资源,提高效率);还是服务者(提供各种服务,方便用户);但归根结底是执行者;

执行用户程序————进程机制;为用户服务;
程序的执行机制-进程;

响应中断————中断机制;为外设服务;Linux把系统调用、异常、和外部中断纳入统一的框架处理;
中断服务程序的执行机制-中断信号触发;
中断下半部的执行机制-softirq,tasklet,工作队列;

执行系统调用————软中断机制;
系统调用的执行-软中断(int $0x80触发);

执行内核线程————线程机制;为操作系统自身服务;
内核函数的执行机制-线程;

5、android框架:
android
dalvik VM
Linux
android进程间通信机制:
从Linux的概念空间中,Android的设计Activity托管在不同的的进程,Service也都是托管在不同的进程,不同进程
间的Activity,Service之间要交换数据属于IPC。Binder就是为了Activity通讯而设计的一个轻量级的IPC框架。
从一般的概念来讲,Android设计者在Linux内核中设计了一个叫做Binder的设备文件,专门用来进行Android的数据
交换。所有从数据流来看Java对象从Java的VM空间进入到C++空间进行了一次转换,并利用C++空间的函数将转换过的对
象通过driver/binder设备传递到服务进程,从而完成进程间的IPC。这个过程可以用下图来表示。
这里数据流有几层转换过程:
(1) 从JVM空间传到c++空间,这个是靠JNI使用ENV来完成对象的映射过程。
(2) 从c++空间传入内核Binder设备,使用ProcessState类完成工作。
(3) Service从内核中Binder设备读取数据。
android设计者需要利用面向对象的技术设计一个框架来屏蔽掉这个过程。


android核心机制binder:
Android构建在Linux上面,但在IPC(进程间)机制上,没有利用Linux提供IPC机制,而是自己实现了一套轻量级的
IPC机制——binder机制。并且Android Binder机制之上,Android框架提供了一套封装,可以实现对象代理(在本地进程
中代理远程进程的对象)。
Android系统Binder机制的总管是Service Manager,所有的Server(System Server)都需要向他注册,应用程序需
要向其查询相应的服务。可见其作用是多么的重要,所以本文首先介绍Service Manager。

Android为了是Binder机制容易使用,对Binder机制进行了抽象,定义了IBinder接口,该接口在C/C++和Java层都有
定义。IBinder定义了一套使用Binder机制使用和实现客户程序和服务器的通讯协议。可以理解如下定义:
1、向Android注册的Service也必须是IBinder(继承扩展IBinder接口)对象。后续文章中我们讨论Service的时候
我们会介绍到这方面的内容。
2、客户端得到Service代理对象也必须定义成IBinder(继承扩展IBinder接口)对象。这也是为什么BpBinder就是
继承自IBinder。
3、客户端发送请求给服务器端,将Service代理对象IBinder接口的transact方法。
4、Android系统Binder机制将负责把用户的请求,调用Service对象IBinder接口的onTransact方法。具体实现我们
将在以后介绍Service的时候讨论。


典型的Binder应用模式:
1、客户端通过某种方式(后文会详细介绍)得到服务器端的代理对象。从客户端角度看来代理对象和他的本地对象没有什么差别。它可以像其他本地对象一样调用其方法,访问其变量。
2、客户端通过调用服务器代理对象的方法向服务器端发送请求。
3、代理对象把用户请求通过Android内核(Linux内核)的Binder驱动发送到服务器进程。
4、服务器进程处理用户请求,并通过Android内核(Linux内核)的Binder驱动返回处理结果给客户端的服务器代理对象。
5、客户端收到服务器端的返回结果。

Binder机制的组成:
1、Binder驱动
binder是内核中的一个字符驱动设备位于:/dev/binder。这个设备是Android系统IPC的核心部分,客户端的服
务代理用来通过它向服务器(server)发送请求,服务器也是通过它把处理结果返回给客户端的服务代理对象。我们
只需要知道它的功能就可以了,本文我们的重点不在这里,所以后面不会专门介绍这部分。如果想深入了解的话,请
研究内核源码中的binder.c。
2、Service Manager
负责管理服务。对应于第一步中,客户端需要向Service Manager来查询和获得所需要服务。服务器也需要向
Service Manager注册自己提供的服务。可以看出Service Manager是服务的大管家。
3、服务(Server)
需要强调的是这里服务是指的是System Server,而不是SDK server,请参考《(转)高焕堂——Android框架底层
结构知多少?》关于两种Server的介绍(其实应该是三种,丢掉了init调用的server,在init.rc中配置)。
4、客户端
一般是指Android系统上面的应用程序。它可以请求Server中的服务。
5、对象代理
是指在客户端应用程序中生成的Server代理(proxy)。从应用程序角度看代理对象和本地对象没有差别,都可以
调用其方法,方法都是同步的,并且返回相应的结果。

原文地址:https://www.cnblogs.com/sun-frederick/p/4763265.html