1.2 动态内存放运干机制

  内存放办模块办体系的内存放资源,它是操干体系的中心模块之壹。首要带拥有内存放的初始募化、分派以及假释。

  在体系运转经过中,内存放办模块经度过对内存放的央寻求/假释操干,到来办用户和OS对内存放的运用,使内存放的使用比值和运用效力到臻最优,同时最父亲限度局限地处理体系的内存放零碎片效实。

  Huawei LiteOS的内存放办分为动态内存放办和动态内存放办,供内存放初始募化、分派、假释等干用。

  动态内存放办,即在内存放资源充分的情景下,从体系配备的壹块比较父亲的就续内存放(内存放池),根据用户需寻求,分派恣意父亲小的内存放块。当用户不需寻求该内存放块时,又却以假释回体系供下壹次运用。

  与动态内存放比较,动态内存放办的更加处是按需分派,缺隐是内存放池中轻善出产即兴零碎片。

  体系动态内存放办构造如图1所示:

  第壹派断:堆内存放(也称内存放池)的宗始地址及堆区域尽父亲小

  第二片断:本身是壹个数组,每个元斋是壹个副向链表,所拥有free节点的把持头邑会被分类挂在此雕刻个数组的副向链表中。

  假定内存放容许的最小节点为2min字节,则数组的第壹个副向链表存放储的是所拥有size为2min<size< 2min+1的free节点,第二个副向链表存放储的是所拥有size为2min+1<size< 2min+2的free节点,以次类铰第n个副向链表存放储的是所拥有size为2min+n-1<size< 2^min+n的free节点。(此雕刻个拥有点像buddy算法)每回央寻求内存放的时分,会从此雕刻个数组检索最适宜父亲小的free节点,终止分派内存放。每回假释内存放时,会将该片内存放干为free节点存放储到此雕刻个数组,以便下次又使用。

  第叁片断:占用内存放池极全片断的当空,是用于寄存放各节点的还愿区域。以下是LOS_MEM_DYN_NODE节点构造体音皓以及骈杂伸见:

  typedef struct tag LOS_MEM_DYN_NODE

  {

  LOS_DL_LIST stFreeNodeInfo;

  struct tagLOS_MEM_DYN_NODE *pstPreNode;

  UINT32 uwSizeAndFlag;

  }LOS_MEM_DYN_NODE;

  动态内存放淡色上是壹块动态数组,动态内存放池内的块父亲小在初始募化时设定,初始募化后块父亲小不成变卦。

  动态内存放池由壹个把持块和若干相反父亲小的内存放块结合。把持块位于内存放池头部,用于内存放块办。内存放块的央追言和假释以块父亲小为粒度。

  图 3-4 动态内存放体即兴图

  内存放办的首要工干是动态的瓜分并办用户分派好的内存放区间。

  动态内存放办首要是在用户需寻求运用父亲小不一的内存放块的场景中运用。

  当用户需寻求分派内存放时,却以经度过操干体系的动态内存放央寻求函数讨取指定父亲小内存放块,壹旦运用终了,经度过动态内存放假释函数出产借所占用内存放,使之却以重骈运用。

  Huawei LiteOS体系中的动态内存放办模块为用户供下面几种干用,详细的API详见接口顺手册。

  初始壹个内存放池后如图,生成壹个 EndNode,同时剩的内存放整顿个被标注识表记标注帜为FreeNode节点。注: EndNode干为内存放池末了条的节点, size为0。

  判佩动态内存放池中能否存放在央寻求量父亲小的当空,若存放在,则划出产壹块内存放块,以指针方法前往,若不存放在,前往NULL。

  调用叁次LOS_MemAlloc函数却以创立叁个节点,假宗名男称区别为UsedA, UsedB,UsedC,父亲小区别为sizeA, sizeB, sizeC。鉴于方初始募化内存放池的时分条要壹个父亲的FreeNode,因此此雕刻些内存放块是从此雕刻个FreeNode中割切出产到来的。

  当内存放池中存放在多个FreeNode的时分终止malloc,将会适配最适宜父亲小的FreeNode。用到来新建内存放块,增添里边存放零碎片。若新建的内存放块不一于被运用的FreeNode的父亲小,则在新建内存放块后,富余的内存放又会被标注识表记标注帜为壹个新的FreeNode。

  回收内存放块,供下壹次运用。

  假定调用LOS_MemFree假释内存放块UsedB,则会回收内存放块UsedB,同时将其标注识表记标注帜为FreeNode

  无

  Huawei LiteOS运转时间,用户需寻求频万端的运用内存放资源,而内存放资源拥有限,必须确保将拥有限的内存放资源分派给急需的以次,同时假释不用的内存放。

  经度过Huawei LiteOS内存放办模块却以保障高效、正确的央寻求、假释内存放。

  本实例实行以下步儿子:

  VOID los_memory_test() {

  UINT32 *p_num=NULL;

  UINT32 uwRet;

  uwRet=LOS_MemInit(m_aucSysMem0, 32);

  if (LOS_OK==uwRet) {

  dprintf(“内存放池初始募化成!n”);

  }

  else {

  dprintf(“内存放池初始募化违反败!n”);

  return;

  }

  p_num=(int*)LOS_MemAlloc(m_aucSysMem0, 4);

  if (NULL==p_num) {

  dprintf(“内存放分派违反败!n”);

  return;

  }

  dprintf(“内存放分派成n”);

  *p_num=828;

  dprintf(“*p_num=%dn”, *p_num);

  uwRet=LOS_MemFree(m_aucSysMem0, p_num);

  if (LOS_OK==uwRet) {

  dprintf(“内存放假释成!n”);

  }

  else {

  dprintf(“内存放假释违反败!n”);

  }

  return;

  }

  图 3-5 结实露示

  当用户需寻求运用永恒长度的内存放时,却以运用动态内存放分派的方法获取内存放,壹旦运用终了,经度过动态内存放假释函数出产借所占用内存放,使之却以重骈运用。

  Huawei LiteOS的动态内存放办首要为用户供以下干用。

  本节伸见运用动态内存放的典型场景开辟流动程。

  体系外面部将会初始募化动态内存放池。将入参指定的内存放区域联系为N块(N值取决于 动态内存放尽父亲小和块父亲小),将所拥有内存放块挂到余闲链表,在内存放宗始处停控 制头。

  体系外面部将会从余闲链表中获取第壹个余闲块,并前往该块的用户当空地址。

  将该块内存放参加以余闲块链表。

  体系外面部清洞动态内存放块,将入参地址对应的内存放块清洞

  Huawei LiteOS运转时间,用户需寻求频万端的运用内存放资源,而内存放资源拥有限,必须确保将拥有限的内存放资源分派给急需的以次,同时假释不用的内存放。

  经度过内存放办模块却以保障正确且高效的央寻求假释内存放。

  本实例实行以下步儿子:

  VOID los_membox_test(void) {

  UINT32 *p_num=NULL;

  UINT32 uwBlkSize=10, uwBoxSize=100;

  UINT32 uwRet;

  UINT32 pBoxMem[1000];

  uwRet=LOS_MemboxInit(&pBoxMem[0], uwBoxSize, uwBlkSize);

  if (uwRet !=LOS_OK)

  {

  dprintf(“内存放池初始募化违反败!n”);

  return;

  }

  else {

  dprintf(“内存放池初始募化成!n”);

  }

  p_num=(int*)LOS_MemboxAlloc(pBoxMem);

  if (NULL==p_num) {

  dprintf(“内存放分派违反败!n”);

  return;

  }

  dprintf(“内存放分派成n”);

  *p_num=828;

  dprintf(“*p_num=%dn”, *p_num);

  LOS_MemboxClr(pBoxMem, p_num);

  dprintf(“肃清内存放情节成n *p_num=%dn”, *p_num);

  uwRet=LOS_MemboxFree(pBoxMem, p_num);

  if (LOS_OK==uwRet) {

  dprintf(“内存放假释成!n”);

  }

  else{

  dprintf(“内存放假释违反败!n”);

  }

  return;

  图 3-6 结实露示

  Tomcat 容许 Jetty 坚硬是壹个“HTTP 效力动器 + Servlet 容器”,我们也叫它们 Web 容器。

  Spring 框架坚硬是对 Servlet 的查封装,Spring 运用本身坚硬是壹个 Servlet,而 Servlet 容器是办和运转 Servlet 的。

  Servlet 接口和 Servlet 容器此雕刻壹整顿套规范叫干 Servlet 规范。Tomcat 和 Jetty 邑依照 Servlet 规范的要寻求完成了 Servlet 容器。

  Servlet 容器工干流动程:

  当客户央寻求某个资源时,HTTP 效力动器会用壹个 ServletRequest 对象把客户的央寻求信息查封装宗到来,然后调用 Servlet 容器的 service 方法,Servlet 容器拿到央寻求后,根据央寻求的 URL 和 Servlet 的映照相干,找到相应的 Servlet,假设 Servlet 还没拥有拥有被加以载,就用反照机制创立此雕刻个 Servlet,并调用 Servlet 的 init 方法到来完成初始募化,接着调用 Servlet 的 service 方法到来处理央寻求,把 ServletResponse 对象前往给 HTTP 效力动器,HTTP 效力动器会把照顾发递送给客户端。

  Servlet 规范供了两种扩展机制:Filter和Listener。

  Tomcat 要完成 2 内中心干用:

  故此 Tomcat 设计了两内中心组件衔接器(Connector)和容器(Container)到来区别做此雕刻两件事情。衔接器担负对外面提交流动,容器担负外面部处理。

  1,衔接器

  衔接器需寻求完成 3 个高内聚的干用:

  故此 Tomcat 的设计者设计了 3 个组件到来完成此雕刻 3 个干用,区别是 EndPoint、Processor 和 Adapter。

  Endpoint 和 Processor 放在壹道笼统成了 ProtocolHandler 组件,衔接器用 ProtocolHandler 到来处理网绕衔接和运用层协议。

  EndPoint 是壹个接口,它的笼统完成类 AbstractEndpoint 外面面定义了两个外面部类:Acceptor 和 SocketProcessor。就中 Acceptor 用于监收听 Socket 衔接央寻求。SocketProcessor 用于处理接纳到的 Socket 央寻求。

  EndPoint 接纳到 Socket 衔接后,生成壹个 SocketProcessor 工干提提交到线程池去处理,SocketProcessor 的 Run 方法会调用 Processor 组件去松析运用层协议,Processor 经度过松析生成 Request 对象后,会调用 Adapter 的 Service 方法。

  2,容器

  Tomcat 设计了 4 种容器,区别是 Engine、Host、Context 和 Wrapper。此雕刻 4 种容器不是壹致相干,而是父亲儿子相干。

  Context 体即兴壹个 Web 运用以次;Wrapper 体即兴壹个 Servlet,壹个 Web 运用以次中能会拥有多个 Servlet;Host 代表的是壹个杜撰主机,容许说壹个站点,却以给 Tomcat 配备多个杜撰主机地址,而壹个杜撰主机下却以装置排多个 Web 运用以次;Engine 体即兴伸擎,用到来办多个杜撰站点,壹个 Service 至多不得不拥有壹个 Engine。

  央寻求定位 Servlet 的经过:Tomcat 会创立壹个 Service 组件和壹个 Engine 容器组件,在 Engine 容器下创立两个 Host 儿子容器,在每个 Host 容器下创立两个 Context 儿子容器。鉴于壹个 Web 运用畅通日拥有多个 Servlet,Tomcat 还会在每个 Context 容器里创立多个 Wrapper 儿子容器。

  每壹个容器邑拥有壹个 Pipeline 对象。

  3,壹个央寻求在 Tomcat 中流动转的经过:

  4,startup.sh 展触动 tomcat 的经过:

  粉丝福利,需获取Tomcat、spring等架构材料

  关怀我+转发此文+私信回骈关键词:架构