zoukankan      html  css  js  c++  java
  • SpProcPool阅读笔记--1

    公司产品用了一个开源的框架,最近出了点问题,细看了这个框架。

    SpProcPool:  https://github.com/spsoft/spprocpool.git

    我们的线程池用的是传递文件描述符这套,这里主要记录主如何把收到的sockfd丢给子处理的。

    主启动 : SP_ProcInetServer::start()

    SP_ProcInetServer::start()里构造了SP_ProcManager procManager,执行procManager.start()。start方法里做了很多事,建了一个全双工管道(用来传递WorkerProecss 创建的全双工管道一端) pipeFd[ 2 ] = {USED_BY_PARENT, USED_BY_CHILD},后fork进程,父拿到USED_BY_PARENT pipeFd[0](写,给父传WorkerProecss 的读端),构造进程池信息,子ChildProcess一直(loop)做pipeFd[0]的对端pipeFd[1](读)的读recv_fd ,读出的实际是WorkerProecss 创建时,通过pipeFd[0]传过来的实际的WorkerProecss 待读端,调用worker->process去读真实上来的socketFd,worker拿到socketFd,取数据做具体的业务处理。

    SP_ProcInetServer::start()之后就是从进程池里拿进程WorkerProecss来处理accept上来的socketFd,具体的处理就是发送出去SP_ProcPduUtils::send_fd( workerProcessPipeFd[0], clientFd ), 上说到的ChildProcess会在loop中从workerProcessPipeFd[1]中拿到实际的socketFd,然后进行业务处理。

    PS:

    a)主进程:1个,主要工作是创建Manager进程,从Manager进程池中取进程(实际是进程之间通信的管道信息)来处理accept 上来的socketFd(实际就是把收到的socketFd发出去,让WorkProcess来处理)。

    b) Manager进程: 1个,构造全双工管道,一端给主进程写(写workProcessInfo创建时的创建的全双工管道一端),另一端自己用来读写入的内容(Manager进程是主fork出的子)

    c) Worker进程:N个,进程池中无可用,创建 进程管道信息,管道信息一端通过pipeFd[0]发(主进程中),触发Manager进程中创建Worker进程,创建之后,长读、等实际要上送的socketFd

    d) 主、Manager、Worker之间的关系:   主-fork->  Manager-fork->  Worker-fork

    e)关于send_fd,recv_fd:

    [03-04 01:09:00][spprocpdu.cpp_144][PID_651][信息中心][DEBUG] send_fd: [5] [6].
    [03-04 01:09:04][spprocpdu.cpp_144][PID_651][信息中心][DEBUG] send_fd: [7] [6].
    [03-04 01:09:05][spprocpdu.cpp_144][PID_651][信息中心][DEBUG] send_fd: [7] [6].

    [03-04 01:09:00][spprocpdu.cpp_137][PID_658][信息中心][DEBUG] recv_fd :[6] [5].  -- 这里为什么收到的不是[6][6],纠结了下,参考文件描述符理解
    [03-04 01:09:04][spprocpdu.cpp_137][PID_659][信息中心][DEBUG] recv_fd :[5] [7].  -- 这里为什么收到的不是[5][6],参考文件描述符理解
    [03-04 01:09:05][spprocpdu.cpp_137][PID_659][信息中心][DEBUG] recv_fd :[5] [7].

    套接字是一个特殊的文件描述符。以前理解有误。参考:https://blog.csdn.net/cywosp/article/details/38965239 这个来理解文件描述符

    其它,当前只看了SpProcPool 传文件描述符这块,还有其它的方式,有空看下。

  • 相关阅读:
    User Get 'Access Denied' with Excel Service WebPart
    How To Search and Restore files from Site Collection Recycle Bin
    How To Collect ULS Log from SharePoint Farm
    How To Restart timer service on all servers in farm
    How to Operate SharePoint User Alerts with PowerShell
    How to get Timer Job History
    Synchronization Service Manager
    SharePoint 2007 Full Text Searching PowerShell and CS file content with SharePoint Search
    0x80040E14 Caused by Max Url Length bug
    SharePoint 2007 User Re-created in AD with new SID issue on MySite
  • 原文地址:https://www.cnblogs.com/ashen/p/10474616.html
Copyright © 2011-2022 走看看