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

网站建设的费用怎么做账wordpress 头像不见

网站建设的费用怎么做账,wordpress 头像不见,专业网站建设哪家权威,写小说的小网站文章目录 一个Binder的前生今世 (二):Binder进程和线程的创建binder在进程中的启动小结注释一个Binder的前生今世 (二):Binder进程和线程的创建 前篇文章一个Binder的前生今世 (一):Service的创建 讲了一个Service是如何创建以及如何与客户端建立联系的。讲解中涉及到… 文章目录 一个Binder的前生今世 (二):Binder进程和线程的创建binder在进程中的启动小结注释 一个Binder的前生今世 (二):Binder进程和线程的创建 前篇文章一个Binder的前生今世 (一):Service的创建 讲了一个Service是如何创建以及如何与客户端建立联系的。讲解中涉及到了两个类 ProcessState 和 IPCThreadState ,当时没有详细介绍这两个类是怎么来的,只是介绍了它们在Binder客户端和服务端传递的作用。这篇文章我们就来深入了解下这两个类以及和binder的关系。可以说这两个类整个串联起了Binder驱动和Binder应用的联系,在Binder的架构实现中属于中流砥柱的作用。 binder在进程中的启动 首先要明确一个概念: 一个进程中对应一个Binder进程(也就是后文说的ProcessState)用来管理与Binder驱动的通讯和Binder对应的应用线程(后文说的IPCThreadState)。 要说明Binder在进程中如何启动,我们就需要先了解一个android的应用是如何创建起来的。当然我们这篇文章不介绍Android应用是如何创建的,不了解的可以网上查看其他的资料,很多,我也会另写文章记录。 Android的应用都会通过app_main.cpp来创建,惯例,我们先来明确用到的类的路径: app_main.cpp : Android/frameworks/base/cmds/app_process/app_main.cpp IPCThreadState : Android/frameworks/native/libs/binder/IPCThreadState.cpp ProcessState : Android/frameworks/native/libs/binder/ProcessState.cpp好,我们了解到,Android应用的启动都会走到app_main.cpp中的AppRuntime类的onZygoteInit函数: virtual void onZygoteInit(){spProcessState proc = ProcessState::self();ALOGV("App process: starting thread pool.\n");proc-startThreadPool();}好,这里我们今天的第一个主角类登场了:ProcessState。先来了解下这个类。 这个类和IPCthreadState在Android的Binder架构体系中启动连接应用层和驱动层的作用,应用和驱动层打交道的所有接口调用都是在这两个类中的。 所以,每当一个应用初始化的时候,都会调用到这里,那我们就接着往下看这个ProcessState是如何初始化的: spProcessState ProcessState::self() {Mutex::Autolock _l(gProcessMutex);if (gProcess != nullptr) {return gProcess;}gProcess = new ProcessState(kDefaultDriver);return gProcess; }这个self函数就是一个单例模式,创建ProcessState: ProcessState::ProcessState(const char *driver): mDriverName(String8(driver)), mDriverFD(open_driver(driver)), mVMStart(MAP_FAILED), mThreadCountLock(PTHREAD_MUTEX_INITIALIZER), mThreadCountDecrement(PTHREAD_COND_INITIALIZER), mExecutingThreadsCount(0), mMaxThreads(DEFAULT_MAX_BINDER_THREADS), mStarvationStartTimeMs(0), mBinderContextCheckFunc(nullptr), mBinderContextUserData(nullptr), mThreadPoolStarted(false), mThreadPoolSeq(1), mCallRestriction(CallRestriction::NONE) {// TODO(b/139016109): enforce in build system #if defined(__ANDROID_APEX__)LOG_ALWAYS_FATAL("Cannot use libbinder in APEX (only system.img libbinder) since it is not stable."); #endifif (mDriverFD = 0) {// mmap the binder, providing a chunk of virtual address space to receive transactions.mVMStart = mmap(nullptr, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);if (mVMStart == MAP_FAILED) {// *sigh*ALOGE("Using %s failed: unable to mmap transaction memory.\n", mDriverName.c_str());close(mDriverFD);mDriverFD = -1;mDriverName.clear();}}#ifdef __ANDROID__LOG_ALWAYS_FATAL_IF(mDriverFD 0, "Binder driver '%s' could not be opened. Terminating.", driver); #endif }这里可以大概看出这个类是管理一个线程池的作用,另外还有管理binder驱动,我们可以看到第3行open_driver ,这里就是打开了Bidner驱动: static int open_driver(const char *driver) {int fd = open(driver, O_RDWR | O_CLOEXEC);if (fd = 0) {int vers = 0;status_t result = ioctl(fd, BINDER_VERSION, vers);if (result == -1) {ALOGE("Binder ioctl to obtain version failed: %s", strerror(errno));close(fd);fd = -1;}if (result != 0 || vers != BINDER_CURRENT_PROTOCOL_VERSION) {ALOGE("Binder driver protocol(%d) does not match user space protocol(%d)! ioctl() return value: %d",vers, BINDER_CURRENT_PROTOCOL_VERSION, result);close(fd);fd = -1;}size_t maxThreads = DEFAULT_MAX_BINDER_THREADS;result = ioctl(fd, BINDER_SET_MAX_THREADS, maxThreads);if (result == -1) {ALOGE("Binder ioctl to set max threads failed: %s", strerror(errno));}} else {ALOGW("Opening '%s' failed: %s\n", driver, strerror(errno));}return fd; } 这里除了open驱动外,还设置了最大线程数,这里DEFAULT_MAX_BINDER_THREADS为15: #define DEFAULT_MAX_BINDER_THREADS 15然后,我们在回过头继续看ProcessState构造函数,接着初始化了一个锁mThreadCountLock 1和 一个条件变量 mThreadCountDecrement 2,最后初始花了内存映射: mVMStart = mmap(nullptr, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);这里可以看到一个进程的mVMStart 内存映射大小为: #define BINDER_VM_SIZE ((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)好了,到这里ProcessState的初始化就完成了,它是一个线程池,管理进程中所有的Binder线程,它还负责进程的Binder驱动打开和初始化操作,然后就是开启了与Binder驱动的内存映射。 我们接着来看proc-startThreadPool(): void ProcessState::startThreadPool() {AutoMutex _l(mLock);if (!mThreadPoolStarted) {mThreadPoolStarted = true;spawnPooledThread(true);} }从名字可以看出这个方法的作用就是启动线程池了。我们继续往下跟踪: void ProcessState::spawnPooledThread(bool isMain) {if (mThreadPoolStarted) {String8 name = makeBinderThreadName();ALOGV("Spawning new pooled thread, name=%s\n", name.string());spThread t = new PoolThread(isMain);t-run(name.string());} }这里的作用就是启动一个Binder线程了,接着我们就来到了查看PoolThread是个什么东东: class PoolThread : public Thread { public:explicit PoolThread(bool isMain): mIsMain(isMain){}protected:virtual bool threadLoop(){IPCThreadState::self(
http://www.hkea.cn/news/14557573/

相关文章:

  • 5g空间大吗企业网站广州网站制作知名 乐云践新
  • 景区旅游网站平台建设网站式登录页面模板下载
  • 网站建设的作用是什么意思网站是用织梦系统做的首页打开超慢
  • 陕西建设网站电子政务大厅网站建设公司岗位
  • 销售一个产品的网站怎么做的深圳市大鹏建设局网站
  • 网站建设互联网加友情链接发布平台
  • 能免费做片头的网站网站建设找王科杰信誉
  • FPGA毕业设计代做网站永久网站空间
  • 宜飞思工业设计网站宁波网站制作定制
  • 注册网站帐号注销佛山网中互联网服务有限公司
  • 网站开发最强工具工信部企业网站备案吗
  • 龙华网站建设专业公司中国建设银行官网登录入口手机版
  • 模拟网站建设软件有哪些dedecms怎么制作网站
  • 网站制作报价图片欣赏商品网站建设实验记录
  • 动漫php网站模板毕业设计指导网站开发
  • 常德网站优化公司国际网站如何做seo
  • 南阳公司网站建设win10建站wordpress
  • 如何选择佛山网站建设大型网站怎么做优化
  • 小众网站论文上海企业体检
  • 永久免费自助建站建平台需要投资多少钱
  • 网站应该怎么建设肥东住房和城乡建设部网站
  • 智能建站实验报告网站如何被收录
  • 网站开发人员配置广东东莞保安公司
  • 企业网站的意思深圳建筑业协会
  • 手机端网站建设的费用清单wap文字游戏搭建教程
  • 外贸网站vps服务器做网站如何防止被坑
  • 网站流量监控在政务网站建设与管理上的讲话
  • 一个空间怎么做两个网站营销型网站建设微博
  • mvc5网站开发之六小规模公司需要交哪些税
  • 西宁网站建设价格东莞seo网站建设公司