<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                我們在main函數的開始處便碰見了ProcessState。由于每個進程只有一個ProcessState,所以它是獨一無二的。它的調用方式如下面的代碼所示: **Main_MediaServer.cpp** ~~~ //①獲得一個ProcessState實例 sp<ProcessState> proc(ProcessState::self()); ~~~ 下面,來進一步分析這個獨一無二的ProcessState。 1. 單例的ProcessState ProcessState的代碼如下所示: **ProcessState.cpp** ~~~ sp<ProcessState> ProcessState::self() { //gProcess是在Static.cpp中定義的一個全局變量 //程序剛開始執行,gProcess一定為空 if(gProcess != NULL) return gProcess; AutoMutex_l(gProcessMutex); //創建一個ProcessState對象,并賦值給gProcess if(gProcess == NULL) gProcess = new ProcessState; return gProcess; } ~~~ self函數采用了單例模式,這很明確地告訴了我們一個信息:每個進程只有一個ProcessState對象。這一點,從它的命名中也可看出些端倪。 2. ProcessState的構造 再來看ProcessState的構造函數。這個函數非常重要,它悄悄地打開了Binder設備。代碼如下所示: **ProcessState.cpp** ~~~ ProcessState::ProcessState() // Android的中有很多代碼都是這么寫的,稍不留神就容易忽略這里調用了一個很重要的函數 :mDriverFD(open_driver()) ,mVMStart(MAP_FAILED)//映射內存的起始地址 ,mManagesContexts(false) ,mBinderContextCheckFunc(NULL) , mBinderContextUserData(NULL) ,mThreadPoolStarted(false) ,mThreadPoolSeq(1) { if(mDriverFD >= 0) { /* BIDNER_VM_SIZE定義為(1*1024*1024) - (4096 *2) = 1M-8K mmap的用法希望讀者man一下,不過這個函數真正的實現和驅動有關系,而Binder驅動會分配一塊 內存用來接收數據。 */ mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ,MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0); } ...... } ~~~ 3. 打開binder設備 open_driver的作用就是打開/dev/binder這個設備,它是android在內核中專門用于完成進程間通信而設置的一個虛擬設備,具體實現如下所示: **ProcessState.cpp** ~~~ static int open_driver() { int fd =open("/dev/binder", O_RDWR);//打開/dev/binder設備 if (fd>= 0) { ...... size_t maxThreads = 15; //通過ioctl方式告訴binder驅動,這個fd支持的最大線程數是15個 result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads); } return fd; ...... } ~~~ 至此,Process::self函數就分析完了。它到底干了什么呢?通過前面的分析,總結如下: - 打開/dev/binder設備,這就相當于與內核的Binder驅動有了交互的通道。 - 對返回的fd使用mmap,這樣Binder驅動就會分配一塊內存來接收數據。 - 由于ProcessState的惟一性,因此一個進程只打開設備一次。 分析完ProcessState,接下來將要分析第二個關鍵函數defaultServiceManager。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看