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)。从应用程序角度看代理对象和本地对象没有差别,都可以
调用其方法,方法都是同步的,并且返回相应的结果。
Linux系统——机制策略(一)的更多相关文章
- linux系统——机制与策略(三)
机制与策略 学习系统调用时,书上提到机制与策略,这也是陈老师与武特学长经常给我们强调的,这是一种设计模式,帮助我们理解操作系统的设计.下面的内容是从陈莉君老师的博客上copy下来的,写的很好,很通俗. ...
- linux系统——机制与策略(二)
策略与机制 大部分策略与机制的区别定义是,策略是描述如何实现什么功能,机制则是需要实现怎样的功能.在"The Art of Unix Programming" 中Raymond通过 ...
- 关于linux系统密码策略的设置
由于工作需要最近需要将公司的多台linux服务器进行密码策略的设置,主要内容是增加密码复杂度. 操作步骤如下,不会的同学可以参考: 操作前需要掌握如下几个简单的知识点:(其实不掌握也行,不过学学没坏处 ...
- linux系统缓存机制
http://my.oschina.net/lenglingx/blog/425258 1.缓存机制 为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读 ...
- Linux系统的Cache工作原理和管理机制
Linux系统Cache 管理是 Linux 内核中一个很重要并且较难理解的组成部分.本文详细介绍了 Linux 内核中文件 Cache 管理的各个方面,希望能够帮助到你. 操作系统和文件 Cache ...
- 在新安装的Linux系统中,防火墙默认是被禁掉的,一般也没有配置过任何防火墙的策略,所有不存在/etc/sysconfig/iptables文件。
原因:在新安装的Linux系统中,防火墙默认是被禁掉的,一般也没有配置过任何防火墙的策略,所有不存在/etc/sysconfig/iptables文件. 解决办法: .随便写一条iptables命令配 ...
- Linux系统的快速启动机制(内核切换) 【转】
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4187846 原文地址:Linux系统的 ...
- Linux系统SCSI磁盘扫描机制解析及命令实例(转)
转载请在文首保留原文出处:EMC中文支持论坛 介绍 Linux系统扫描SCSI磁盘有几种方式?Linux新增LUN之后,能否不重启主机就认出设备?如果安装了PowerPath,动态添加/删除LUN的命 ...
- Linux系统SCSI磁盘扫描机制解析及命令实例
介绍Linux系统扫描SCSI磁盘有几种方式?Linux新增LUN之后,能否不重启主机就认出设备?如果安装了PowerPath,动态添加/删除LUN的命令是什么?本文总结了Linux主机对磁盘设备进行 ...
随机推荐
- 踩坑日志!viser-ng的使用
在ng-alian项目中使用viser图表库,在app.module中引用了viser-ng,然而,在具体的html项目中使用<v-chart>会报错,提示v-chart不是一个angul ...
- js实现指定日期增加指定月份
首先,大致思路为: 1. 先将字符串格式的时间类型转化为Date类型 2. 再将Date类型的时间增加指定月份 3. 最后将Date类型的时间在转化为字符串类型 1. 先将字符串格式的时间类型转化为 ...
- 解决使用Application Loader上传ipa提示“上传appstore失败”
试了好多次使用Application Loader上传ipa,一直提示上传失败,用其他mac电脑却可以,那就是环境有问题,笔者试过重装xcode,都无法解决问题, 查看日志类似是jdk版本问题,换了所 ...
- Load事件中控件Focus()无效解决办法
原因:Load窗体时,窗体未显示 解决:1.Focus()之前添加this.Show(); 2.在Shown事件中添加Focus()
- JS的四舍五入问题
最近踩了一个坑,mark一下toFixed四舍五入问题,详见代码: var myFixed = function(num, fix) { num = (parseFloat(num) * + ) / ...
- oracle 11gR2 for win7旗舰版64安装以及连接plsql和NaviCat(win64_11gR2_database) (2012-12-31-bd 写的日志迁移
先到oracle官网http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html下载必要数 ...
- Python入门必学:字符串和编码正确的使用方法
字符编码,我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...
- C、C++混合调用——博客收藏
C与C++接口相互调用:https://www.cnblogs.com/feige1314/p/7890982.html C.C++混合调用:https://www.cnblogs.com/xuany ...
- 笔记-python-standard library-8.10 copy
笔记-python-standard library-8.10 copy 1. copy source code:Lib/copy.py python中的赋值语句不复制对象,它创建了对象和目 ...
- laravel5.2总结--关联关系
参考文章 http://laravelacademy.org/post/1095.html http://laravelacademy.org/post/1174.html http://d.lar ...