当前位置: 首页 > news >正文

福州网站设计十年乐云seo网站建设的相关政策

福州网站设计十年乐云seo,网站建设的相关政策,网站开发ui,网站建设方为客户提供使用说明书在前面一篇文章Android系统匿名共享内存Ashmem#xff08;Anonymous Shared Memory#xff09;驱动程序源代码分析中#xff0c;我们系统地介绍了Android系统匿名共享内存的实现原理#xff0c;其中着重介绍了它是如何辅助内存管理系统来有效地管理内存的#xff0c;在再前…  在前面一篇文章Android系统匿名共享内存AshmemAnonymous Shared Memory驱动程序源代码分析中我们系统地介绍了Android系统匿名共享内存的实现原理其中着重介绍了它是如何辅助内存管理系统来有效地管理内存的在再前面一篇文章Android系统匿名共享内存AshmemAnonymous Shared Memory简要介绍和学习计划中我们还提到Android系统匿名共享内存的另外一特点是通过Binder进程间通信机制来实现进程间共享的本文中将详细介绍Android系统匿名共享内存是如何使用Binder进程间通信机制来实现进程间共享的。         由于Android系统匿名共享内存在进程间共享的原理涉及到Binder进程间通信机制的相关知识所以希望读者在继续阅读本文之前最好对Android系统的Binder进程间通信机制有一定的了解具体可以参考Android进程间通信IPC机制Binder简要介绍和学习计划这篇文章。         在Android系统匿名共享内存AshmemAnonymous Shared Memory简要介绍和学习计划这篇文章中我们举了一个例子来简要地介绍了Android系统的匿名共享内存机制及其使用方法在这篇文章中我们继续以这个实例来说明Android系统的匿名共享内存是如何使用Binder进程间通信机制来实现进程间共享的。为了方便描述结合前面的Binder进程间通信机制知识我们通过下面这个序列图来总结这个实例中的匿名共享内存文件的文件描述符在进程间传输的过程         这里 我们需要关注的便是虚线框部分了它在Binder驱动程序中实现了在两个进程中共享同一个打开文件的方法。我们知道在Linux系统中文件描述符其实就是一个整数。每一个进程在内核空间都有一个打开文件的数组这个文件描述符的整数值就是用来索引这个数组的而且这个文件描述符只是在本进程内有效也就是说在不同的进程中相同的文件描述符的值代表的可能是不同的打开文件。因此在进程间传输文件描述符时不能简要地把一个文件描述符从一个进程传给另外一个进程中间必须做一过转换使得这个文件描述在目标进程中是有效的并且它和源进程的文件描述符所对应的打开文件是一致的这样才能保证共享。         在浅谈Service Manager成为Android进程间通信IPC机制Binder守护进程之路一文中我们介绍了用来传输的Binder对象的数据结构struct flat_binder_object它定义在kernel/common/drivers/staging/android/binder.h 文件中 /*    * This is the flattened representation of a Binder object for transfer    * between processes.  The offsets supplied as part of a binder transaction   * contains offsets into the data where these structures occur.  The Binder    * driver takes care of re-writing the structure type and data as it moves    * between processes.    */  struct flat_binder_object {       /* 8 bytes for large_flat_header. */       unsigned long       type;      unsigned long       flags;        /* 8 bytes of data. */       union {           void        *binder;    /* local object */           signed long handle;     /* remote object */      };        /* extra data associated with local object */       void            *cookie;  };        域type是一个枚举类型它的取值范围是 enum {       BINDER_TYPE_BINDER   B_PACK_CHARS(s, b, *, B_TYPE_LARGE),       BINDER_TYPE_WEAK_BINDER  B_PACK_CHARS(w, b, *, B_TYPE_LARGE),       BINDER_TYPE_HANDLE   B_PACK_CHARS(s, h, *, B_TYPE_LARGE),       BINDER_TYPE_WEAK_HANDLE  B_PACK_CHARS(w, h, *, B_TYPE_LARGE),       BINDER_TYPE_FD       B_PACK_CHARS(f, d, *, B_TYPE_LARGE),   };         这里我们要介绍的Binder对象的type便是BINDER_TYPE_FD了要传输的文件描述符的值保存在handle域中。           在Android系统进程间通信IPC机制Binder中的Server启动过程源代码分析一文中我们详细介绍了Binder对象在进程间通信传输的完整过程这里就不再详述了有兴趣的读都可以回过头去参考一下。这里我们只关注文件描述符类型的Binder对象在Binder驱动程序中的相关处理逻辑。         文件描述符类型的Binder对象在Binder驱动程序中的相关处理逻辑实现在binder_transact函数这个函数定义在kernel/common/drivers/staging/android/binder.c文件中 static void  binder_transaction(struct binder_proc *proc, struct binder_thread *thread,   struct binder_transaction_data *tr, int reply)   {      struct binder_transaction *t;      struct binder_work *tcomplete;      size_t *offp, *off_end;      struct binder_proc *target_proc;       struct binder_thread *target_thread  NULL;       struct binder_node *target_node  NULL;       struct list_head *target_list;      wait_queue_head_t *target_wait;       struct binder_transaction *in_reply_to  NULL;       struct binder_transaction_log_entry *e;      uint32_t return_error;       ......             offp  (size_t *)(t-buffer-data  ALIGN(tr-data_size, sizeof(void *)));       ......       off_end  (void *)offp  tr-offsets_size;       for (; offp  off_end; offp) {           struct flat_binder_object *fp;          ......          fp  (struct flat_binder_object *)(t-buffer-data  *offp);          switch (fp-type) {          ......           case BINDER_TYPE_FD: {               int target_fd;               struct file *file;               if (reply) {                  if (!(in_reply_to-flags  TF_ACCEPT_FDS)) {                       binder_user_error(binder: %d:%d got reply with fd, %ld, but target does not allow fds\n,                                       proc-pid, thread-pid, fp-handle);                      return_error  BR_FAILED_REPLY;                       goto err_fd_not_allowed;                   }               } else if (!target_node-accept_fds) {                   binder_user_error(binder: %d:%d got transaction with fd, %ld, but target does not allow fds\n,                                   proc-pid, thread-pid, fp-handle);                  return_error  BR_FAILED_REPLY;                   goto err_fd_not_allowed;               }               file  fget(fp-handle);               if (file  NULL) {                   binder_user_error(binder: %d:%d got transaction with invalid fd, %ld\n,                                       proc-pid, thread-pid, fp-handle);                  return_error  BR_FAILED_REPLY;                   goto err_fget_failed;               }              target_fd  task_get_unused_fd_flags(target_proc, O_CLOEXEC);              if (target_fd  0) {                  fput(file);                  return_error  BR_FAILED_REPLY;                   goto err_get_unused_fd_failed;               }              task_fd_install(target_proc, target_fd, file);              if (binder_debug_mask  BINDER_DEBUG_TRANSACTION)                       printk(KERN_INFO         fd %ld - %d\n, fp-handle, target_fd);               /* TODO: fput? */              fp-handle  target_fd;          } break;           ......          }      }            ......   }         这里我们先明确一下在Android系统匿名共享内存AshmemAnonymous Shared Memory简要介绍和学习计划这篇文章中所举的例子获取匿名共享内存文件的文件描述符的场景。匿名共享内存文件是在Server进程创建的Client通过IMemoryService.getFileDescriptor去获取Server进程所创建的匿名共享内存文件的文件描述符Server进程在返回这个文件描述符的过程中进入到Binder驱动程序即这里的binder_transact函数。因此这里的当前执行binder_transact函数的进程是Server进程即源进程是Server进程而目标进程是Client进程就是这里的target_proc所表示的进程了。           函数binder_transaction处理文件描述符类型的Binder对象就在中间的for循环里面。        首先是获得Binder对象并保存在本地变量fp中 fp  (struct flat_binder_object *)(t-buffer-data  *offp);        文件描述符的值就保存在fp-handle中通过fget函数取回这个文件描述符所对应的打开文件结构 file  fget(fp-handle);       这里的file是一个struct file指针它表示一个打开文件结构。注间在Linux系统中打开文件结构struct file是可以在进程间共享的它与文件描述符不一样。          接着在目标进程中获得一个空闲的文件描述符 target_fd  task_get_unused_fd_flags(target_proc, O_CLOEXEC);        现在在目标进程中打开文件结构有了文件描述符也有了接下来就可以把这个文件描述符和这个打开文件结构关联起来就可以了 task_fd_install(target_proc, target_fd, file);        由于这个Binder对象最终是要返回给目标进程的所以还要修改fp-handle的值它原来表示的是在源进程中的文件描述符现在要改成目标进程的文件描述符 fp-handle  target_fd;                这样对文件描述符类型的Binder对象的处理就完成了。目标进程拿到这个文件描述符后就可以和源进程一起共享打开文件了。          至此Android系统匿名共享内存利用Binder进程间通信机制来实现进程间共享的学习就结束了整个Android系统匿名共享内存机制的学习也完成了希望对读者有所帮助重新学习Android系统匿名共享内存机制请回到Android系统匿名共享内存AshmemAnonymous Shared Memory简要介绍和学习计划一文。 本文转自 Luoshengyang 51CTO博客原文链接http://blog.51cto.com/shyluo/965501如需转载请自行联系原作者
http://www.yutouwan.com/news/499024/

相关文章:

  • 自设计网站网站建设法语
  • 企业网站优化应该怎么做茂名网站建设制作
  • 谷歌seo站内优化网站风格细节
  • php 网站换空间沈阳网站排名公司
  • 网站seo 规范百度搜索一下就知道
  • 国家电网建设部网站官网小程序定制外包
  • 黄山网站建设哪家好母婴网站的功能设计
  • 建网站哪家质量好如何提高网站速度
  • 广州建设网站首页公司网站建设精英
  • 安全的网站建阿里巴巴官网入口
  • 推广 网站建设小程序问答库
  • 冯提莫斗鱼前在哪个网站做直播微信开放平台是干什么的
  • 做旅游网站的设计感想可视化建站工具
  • 北京市基础建设质量监督局网站昆明微网站搭建哪家好
  • 怎么给自己的网站设置关键词湖南网站建设 尖端磐石网络
  • 外贸网站建设收款通道全球搜索引擎网站
  • 怎么知道网站被百度k了网站开发用 c php
  • 国内知名摄影网站建站软件免费模板
  • 移动网站建设推广临淄区最新招聘信息
  • 为什么大家用wordpress建网站建设工程网站建筑工程预算
  • 网站屏蔽ip怎么制作美图素材图片
  • 广州专业网站建设有哪些网络营销案例及分析
  • 通过招聘网站如何做背景调查做网站先做前台还是后台
  • 平果县免费网站哪家好优化是什么意思?
  • 官方网站哪家做的最好西安制作标书的公司
  • 邢台县建设局网站wordpress页尾添加信息
  • wordpress多站点统计如何建立自己的超市网站
  • 网站建设与维护视频教程免费搭建一个网页
  • 成都租车公司网站旅游营销网站建设
  • 网站建设中轩网怎么样第三方平台推广引流