CN108121594B - 一种进程管理方法及装置 - Google Patents

一种进程管理方法及装置 Download PDF

Info

Publication number
CN108121594B
CN108121594B CN201611078446.1A CN201611078446A CN108121594B CN 108121594 B CN108121594 B CN 108121594B CN 201611078446 A CN201611078446 A CN 201611078446A CN 108121594 B CN108121594 B CN 108121594B
Authority
CN
China
Prior art keywords
program
sub
dynamic link
link library
function
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201611078446.1A
Other languages
English (en)
Other versions
CN108121594A (zh
Inventor
关志俊
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Youku Culture Technology Beijing Co ltd
Original Assignee
Alibaba Group Holding Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201611078446.1A priority Critical patent/CN108121594B/zh
Priority to TW106126766A priority patent/TW201820131A/zh
Priority to PCT/CN2017/111997 priority patent/WO2018099292A1/zh
Publication of CN108121594A publication Critical patent/CN108121594A/zh
Application granted granted Critical
Publication of CN108121594B publication Critical patent/CN108121594B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/485Task life-cycle, e.g. stopping, restarting, resuming execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本申请公开了一种进程管理方法及装置。启动代理进程,所述代理进程加载该代理进程所链接的动态链接库到内存;所述代理进程创建第一子进程,所述第一子进程通过调用该程序的入口函数,加载所述第一程序;所述代理进程创建第二子进程,所述第二子进程通过调用所述第二程序的入口函数,加载所述第二程序;其中,所述第一程序和所述第二程序共享所述动态链接库占用的内存。

Description

一种进程管理方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种进程管理方法及装置。
背景技术
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是***进行资源分配和调度的基本单位,是操作***结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。
在Linux***中,init进程是Linux***中所有进程的父进程。init进程由Linux内核引导运行,是***中的第一个进程。init进程生成子进程,此时子进程共享父进程的内存空间,一旦父进程或子进程修改了某页内存,则Linux内核会创建该页内存专属于该进程的副本,这样父子进程即可共享内容相同的内存页,又互不干扰。
发明内容
本申请实施例提供了一种进程管理方法及装置。
本申请实施例提供的方法,包括:启动代理进程,所述代理进程加载所述代理进程所链接的动态链接库到内存;所述代理进程创建第一子进程,所述第一子进程通过调用所述第一程序的入口函数,加载所述第一程序;所述代理进程创建第二子进程,所述第二子进程通过调用所述第二程序的入口函数,加载所述第二程序;其中,所述第一程序和所述第二程序共享所述动态链接库占用的内存。
附图说明
图1为现有技术中Linux***加载程序的过程示意图;
图2为现有技术中Linux***加载程序后的内存分布示意图;
图3为本申请实施例中Linux***加载程序的过程示意图;
图4为本申请实施例中Linux***加载程序后的内存分布示意图;
图5为本申请实施例中应用程序的启动流程示意图;
图6为本申请实施例提供的装置的结构示意图;
图7为本申请另外的实施例提供的装置的结构示意图。
具体实施方式
虽然本申请的概念易于进行各种修改和替代形式,但是其具体实施例已经通过附图中的示例示出并且将在本文中详细描述。然而,应当理解,没有意图将本申请的概念限制为所公开的特定形式,而是相反,意图是覆盖与本申请以及所附权利要求一致的所有修改、等同物和替代物。
说明书中对“一个实施例”、“实施例”、“说明性实施例”等的引用,指示所描述的实施例可包括特定特征、结构或特性,但是每个实施例可以或可以不必包括特定特征、结构或特性。此外,这样的短语不一定指的是相同的实施例。进一步地,认为在本领域技术人员的知识范围内,当结合实施例描述特定特征、结构或特性时,结合无论是否明确描述的其它实施例影响这样的特征,结构或特性。另外,应当理解,以“A,B和C中的至少一个”的形式包括在列表中的项目可以表示(A);(B);(C);(A和B);(A和C);(B和C);或(A,B和C)。类似地,以“A,B或C中的至少一个”的形式列出的项目可以表示(A);(B);(C);(A和B);(A和C);(B和C)或(A,B和C)。
在一些情况下,所公开的实施例可以在硬件、固件、软件或其任何组合中实现。所公开的实施例还可以被实现为由一个或多个暂时性或非暂时性机器可读(例如,计算机可读)存储介质携带或存储的指令,其可以由一个或多个处理器读取和执行。机器可读存储介质可以体现为用于以机器可读形式(例如,易失性或非易失性存储器、介质盘或其他介质)存储或传输信息的任何存储设备,机制或其他物理结构的设备)。
在附图中,一些结构或方法特征可以以特定布置和/或顺序示出。然而,应当理解,可能不需要这样的具体布置和/或排序。相反,在一些实施例中,这些特征可以以与说明性附图中所示不同的方式和/或顺序来布置。另外,在特定图中包括结构或方法特征并不意味着暗示这种特征在所有实施例中都是需要的,并且在一些实施例中可以不包括或可以与其他特征组合。
参见图1,为目前Linux***中,由init进程启动程序a和程序b的示意图。如图所示,***首先启动init进程,init进程调用fork函数以生成子进程a,子进程a调用exec函数以加载程序a。程序b的加载过程类似。
子进程调用exec函数加载一个新程序时,该子进程的内存空间会被完全清除并重建,即该子进程与init进程不再存在共享的内存页。目前所有的Linux***中的init进程创建新程序时均通过调用exec函数实现。图2示出了程序a和程序b启动后***中的内存分布示意图,可以看到动态链接库内存在程序a、程序b两个子进程中都有一份副本。
其中,动态链接库是实现共享函数库的一种方式,使进程可以调用不属于其可执行代码的函数。***中存在大量动态链接库,大部分可执行程序均会使用动态链接库。这些动态链接库占用大量内存。因此,如何减少动态链接库的内存开销是目前需要解决的问题。
由于在Linux***中,init进程无法链接动态链接库,因此本申请实施例中使用代理进程(称为cinit进程)链接动态链接库,由该代理进程创建子进程,由代理进程创建的子进程调用程序的入口函数来加载程序,由于由代理进程创建的子进程通过调用程序的入口函数来加载程序,而非调用exec()函数来加载程序,因此不同程序的内存避免了被完全隔离;又由于该代理进程链接了动态链接库,在代理进程启动时该动态链接库被加载到内存,因此通过上述方式加载的多个程序可以共享代理进程所加载的动态链接库的内存,从而与现有技术中每个程序均需保存动态链接库的副本相比,减少了动态链接库的内存开销。
本申请实施例提供的原理,可程序于Linux***,也可程序于有类似需求的其他***。
下面以在Linux***中应用本申请实施例为例,对本申请实施例的具体实现过程进行描述。
当计算机开机的时候,***内核(kernel)只建立了一个init进程。Linux内核并不提供直接建立新进程的***调用,其他的所有进程都是init进程通过fork机制建立的。fork是一个***调用,通过调用fork函数,老进程(父进程)可通过复制自身得到新进程(子进程)。进程存活于内存中,每个进程都在内存中分配有属于自己的地址空间(addressspace)。当调用fork函数的时候,Linux在内存中开辟出新的内存空间给新进程,并将老进程内存空间中的内容复制到该新的空间中,此后两个进程同时运行。
由于init进程无法链接动态链接库,因此本申请实施例中引入了代理进程(称为cinit进程)。代理进程在编译时链接了动态链接库,该动态链接库可以包括Linux***提供的基本动态链接库,一般应用程序运行时均会用到。在init进程启动的过程中,该代理进程被启动,从而将该代理进程所链接的动态链接库加载到内存中。***中其他的程序可由该代理进程启动。
当需要加载新的程序时(比如用户通过移动终端的屏幕触摸操作,点击了一个应用程序的图标,或者发生了其他触发加载应用程序的操作),由代理进程创建子进程,该子进程通过调用该程序的入口函数,加载该程序。
该过程中,代理进程仍可通过调用fork函数创建子进程。当代理进程调用fork函数后,***给新的进程(子进程)分配资源,比如Linux在内存中开辟出一片新的内存空间给新的进程,用于存储数据和代码,并将老的进程空间中的内容复制到新的空间中,其中,只有少数参数与老进程的参数不同,这样,新的进程和老的进程可实现基本相同的功能。当然,调用fork函数时输入的初始参数或者传入的变量也可以不同,这样,新的进程和老的进程可实现不同的功能。
新创建得到的进程作为代理进程的子进程,获取应用程序的入口函数的地址,调用该应用程序的入口函数,从而加载该应用程序。其中,应用程序通常具有main函数,它是应用程序的入口函数,是启动应用程序时首先被调用的函数,从而开始运行该应用程序。在另外的一些实施例中,启动应用程序时,可先于该应用程序的main函数而执行其他函数,比如gcc编译器编译的可执行程序中都存在__libc_start_main函数,该函数调用了main函数,即该函数先于main函数执行。在这种情况下,代理进程创建子进程后,该子进程可通过调用应用程序的__libc_start_main函数来加载该应用程序。
其中,入口函数的地址可从经过编译和链接的可执行程序中获得。应用程序的源代码需要经过编译器进行编译以及链接器进行链接后,形成可执行程序,可执行程序通常以可执行和可链接格式(Executable and Linkable Format,简称ELF)文件存储。ELF文件中包括编译后的机器指令代码、数据、符号表、调试信息、字符串等。一般ELF文件将这些文件信息按不同的属性,以“段”或“节”的形式存储。其中,ELF文件中的dynsym段主要用于存储操作***相关的信息,比如变量名、函数名等。可通过调用dlsym函数获得ELF文件中的dynsym段中的main函数地址。
默认情况下,在将源代码编译为可执行文件时,main函数的地址不导出到dynsym段中,也就是说,无法通过调用dlsym函数得到main函数的地址。本申请实施例中,可通过修改链接器,使链接器进行链接时将main函数的地址导出到dynsym段中。针对不同的链接器,其修改方法不尽相同。当然也可以采用其他任何能够导出main函数的地址的方法。本申请实施例对获得入口函数的地址的方法不作限制。
进一步地,在一些实施例中,由代理进程创建的子进程调用程序的入口函数之前,将该子进程的名称修改为与该程序的名称相同。在Linux***中,默认情况下,子进程的名称与父进程(这里为代理进程cinit)的名称相同,否则进程名会显示错误。具体可通过以下方式修改进程的名称:
方式1:子进程调用用于修改进程名称的***调用函数。在Linux***中,prctl函数为***调用函数,具有较高的权限,可用于设置进程的名称。因此该子进程可向操作***内核请求调用prctl函数,通过执行prctl函数对该子进程的名称进行设置。
方式2:子进程获取该子进程中用于存储进程名称的内存区域的地址,并修改该地址对应的内存区域中存储的参数值(即将进程名称修改为应用程序的名称)。本申请实施例中,子进程内存空间中,在地址为argv[0]的区域存储有该子进程的名称,如果该区域中存储的参数值改变,则该子进程的名称也会改变。因此,如果将子进程中地址为argv[0]的区域中存储的参数值修改为需要启动的应用程序的名称,则可以使得该子进程的名称与应用程序的名称相同。后续创建的子进程,均可在该子进程中修改地址为argv[0]的区域中存储的参数值,这样每个子进程都可以设置自己的名称,而不干扰其他子进程。
进一步地,在一些实施例中,在应用程序启动后,如果需要修改应用程序名称(比如需要在用户界面中为当前应用程序显示一个特别的名称时),即修改该应用程序的进程名称,则还可以采用以下方式进行修改:该应用程序的进程从该进程独有的内存中存储的启动参数中,获得用于存储进程名称的内存区域的地址(该内存区域的地址为变量argv[0]的取值),并修改该地址对应的内存区域中存储的参数值(即将进程名称修改为应用程序的新名称)。
进一步地,在一些实施例中,有些环境变量与进程相关,在启动新程序时需要重置,具体哪些环境变量需要重置则可视平台而定。本申请实施例中,代理进程创建子进程后,该子进程可重置该子进程对应的程序所使用的环境变量,子进程重置环境变量的操作可在调用入口函数之前或者在其他需要修改环境变量的时候。比如,有一个环境变量的值是该应用在***中存放的文件名,显然每个应用对应的文件是不一样的,需要对每个应用重设该环境变量。
进一步地,在一些实施例中,考虑到某些不能被继承的资源若被子进程继承,则会产生错误,比如文件描述符这样的资源。因此,本申请实施例中,代理进程在创建子进程之前,可关闭不能被该子进程继承的资源。其中,代理进程可确定哪些资源不能被子进程继承。具体实施时,在一些例子中,可预先设置哪些资源不能被子进程继承,需要代理进程在创建子进程前将这些资源关闭或释放。在另外的例子中,子进程的父进程可根据预先设置的规则确定哪些资源不能被子进程继承,比如,当父进程监听一个网络端口,它不希望子进程也监听该端口,因为两个进程同时监听同一个端口通常会出现错误,那么它就需要在关闭该端口,关闭的时机是在该父进程调用fork函数之后、在运行子进程之前。
需要说明的是,如果代理进程启动的程序又使用exec函数启动了其他程序(以及其后启动的所有程序),则它们的内存无法共享。因此,凡是希望子进程可以与其父进程共享内存的,均需要按上述方式创建子进程以及加载程序。由于上述方案是通用的,为了让***的其他程序遵守该方案,本申请实施例可提供一个辅助函数来实现上述方案,以供其他程序调用该函数,这样,每个需要使用上述方案节省内存的进程均可使用该函数,而不需要针对每个进程编写用于实现上述方案的代码。
下面结合图3和图4,以应用程序a和应用程序b的加载过程为例,对上述实施例的具体实现过程进行描述。
如图3和图4所示,Linux***启动时,Linux内核为init进程分配init进程独有的内存空间,并引导运行init进程。init进程启动后启动代理进程(cinit),代理进程具有其独有的内存空间,该内存空间在init进程启动该代理进程时,由Linux内核分配。由于代理进程在编译时链接了Linux***的基本动态链接库,因此该动态链接库被加载到内存中。
加载应用程序a的过程,如图3所示,代理进程(cinit)调用fork函数,创建得到子进程a。此过程中,如图4所示,Linux在内存中开辟出一片新的内存空间给子进程a(即图中所示的a独有的内存),用于存储数据和代码,并将代理进程中的内容复制到新的空间中。如图3所示,子进程a调用dlopen函数,输入参数中包括动态链接库的文件名(该文件名与代理进程所连接的动态链接库的文件名相同),从而在子进程a中打开该动态链接库。通过调用dlopen函数,可以将dlopen函数返回的动态链接库句柄传入dlsym函数中的参数,以获得符号在该动态链接库中的地址,使用这个地址,可以获得该动态链接库中对应函数的指针,并且调用该动态链接库中的相应函数。子进程a调用应用程序a的main函数,从而启动应用程序a。
加载应用程序b的过程,如图3所示,代理进程(cinit)调用fork函数,创建得到子进程b。此过程中,如图4所示,Linux在内存中开辟出一片新的内存空间给子进程b(即图中所示的b独有的内存),用于存储数据和代码,并将代理进程中的内容复制到新的空间中。如图3所示,子进程b调用dlopen函数,输入参数中包括动态链接库的文件名(该文件名与代理进程所连接的动态链接库的文件名相同),从而在子进程a中打开该动态链接库。子进程b调用应用程序b的main函数,从而启动应用程序b。
从图4可以看出,子进程a和子进程b启动应用程序时未使用exec函数,而是调用入口函数,并且应用程序a和应用程序b所打开的动态链接库已经被代理进程加载到内存中,因此应用程序a和应用程序b可以共享该动态链接库的内存,而不必各自保存一份该动态链接库的副本。
当应用程序调用由代理进程加载的动态链接库中的函数时,该函数所修改的数据可被存储于该应用程序(或该应用程序对应的进程)所独有的内存空间。例如,若应用程序a(子进程a)调用动态链接库中的方法(函数),且在该方法(函数)执行过程中需要修改数据(比如修改变量的值),操作***会将该数据存储在应用程序a(子进程a)的独有内存空间;若应用程序b(子进程b)调用动态链接库中的该方法(函数),且在该方法(函数)执行过程中需要修改名称相同的变量,操作***会将该变量存储在应用程序b(子进程b)的独有内存空间。这样,应用程序a和应用程序b可共享动态链接库,但调用动态链接库所修改的变量会存储在各自独有的内存空间,避免数据冲突。
参见图5,该流程以上述应用程序a为例,描述了该应用程序的启动过程。应用程序b的启动过程与此类似。如图5所示,当需要启动应用程序a时,该流程可包括:
方框501:代理进程确定不能被子进程继承的资源,将这些资源关闭。
方框502:代理进程调用fork函数,创建子进程a。在该过程中,***给新创建的子进程分配该子进程独有的内存空间,该内存空间专属于该子进程。
方框503:子进程a调用prctl函数,通过执行该函数将子进程a的名称修改为应用程序a的名称。
方框504:子进程a重置部分环境变量,比如重置用于存储***中存放的文件名的变量值。
方框505:子进程a调用dlopen函数,并将被代理进程加载到内存的动态链接库的名称作为该函数的输入参数,从而通过执行该函数,在子进程a中打开该动态链接库。
方框506:子进程a调用dlsym函数,得到应用程序a的main函数地址。
方框507:子进程a根据应用程序a的main函数地址,调用应用程序a的main函数,从而加载应用程序a。
上述流程中,方框503至方框506的顺序可做调整,本申请实施例对此不做限制。
上述流程具体实现过程,可参见前述实施例,在此不再重复。
通过以上描述可以看出,本申请的上述实施例中,***中的init进程启动时启动代理进程,代理进程启动时,加载该代理进程所链接的动态链接库到内存;当需要加载某个程序时,代理进程创建一个子进程,该子进程通过调用该程序的入口函数,加载该程序,这样,通过上述方式加载的多个程序可以共享该代理进程所加载的动态链接库占用的内存,而不必每个程序保存一份动态链接库的副本,减少了动态链接库的内存开销。
基于相同的技术构思,本申请实施例还提供了一种装置,该装置可实现前述实施例描述的流程。
参见图6,为本申请实施例提供的装置的结构示意图。该装置可包括:启动模块601、进程创建模块602,其中:
启动模块601,用于启动代理进程,所述代理进程加载所述代理进程所链接的动态链接库到内存;进程创建模块602,用于创建第一子进程,所述第一子进程通过调用所述第一程序的入口函数,加载所述第一程序;以及,创建第二子进程,所述第二子进程通过调用所述第二程序的入口函数,加载所述第二程序;其中,所述第一程序和所述第二程序共享所述动态链接库占用的内存。
可选地,启动模块601为操作***中的第一个进程,被所述启动模块启动的所述代理进程用于代理所述第一个进程创建子进程。
可选地,进程创建模块602还用于:调用所述第一程序的入口函数之前,通过调用用于打开动态链接库的函数,在所述第一子进程中打开所述动态链接库,其中,该函数的输入参数中包括所述动态链接库的文件名;以及,调用所述第二程序的入口函数之前,通过调用用于打开动态链接库的函数,在所述第二子进程中打开所述动态链接库,其中,该函数的输入参数中包括所述动态链接库的文件名。
可选地,进程创建模块602创建的所述第一子进程调用所述第一程序的入口函数之前,将所述第一子进程的名称修改为与所述第一程序的名称相同;进程创建模块602创建的所述第二子进程调用所述第二程序的入口函数之前,将所述第二子进程的名称修改为与所述第二程序的名称相同。
可选地,进程创建模块602还用于:创建所述第一子进程之前,关闭不能被所述第一子进程继承的资源;以及,创建所述第二子进程之前,关闭不能被所述第二子进程继承的资源。
可选地,进程创建模块602创建的所述第一子进程调用所述第一程序的入口函数之前,重置所述第一程序所使用的环境变量;进程创建模块602创建的所述第二子进程调用所述第二程序的入口函数之前,重置所述第二程序所使用的环境变量。
可选地,所述第一程序在被编译时,所述第一程序的入口函数地址被导出到所述第一程序的可执行文件中;所述进程创建模块创建的所述第一子进程调用所述第一程序的入口函数之前,根据所述第一程序的可执行文件获取所述第一程序的入口函数地址;所述第二程序在被编译时,所述第二程序的入口函数地址被导出到所述第二程序的可执行文件中;所述进程创建模块创建的所述第二子进程调用所述第二程序的入口函数之前,根据所述第二程序的可执行文件获取所述第二程序的入口函数地址。
可选地,上述装置中还可包括处理模块(未在图中示出),该处理模块可用于在加载所述第一程序之后,将被所述第一程序调用的所述动态链接库中的函数所修改的数据,存储于所述第一子进程独有的内存空间;以及,在加载所述第二程序之后,将被所述第二程序调用的所述动态链接库中的函数所修改的数据,存储于所述第二子进程独有的内存空间。
基于相同的技术构思,本申请实施例还提供了一个或多个计算机可读介质,所述可读介质上存储有指令,所述指令被一个或多个处理器执行时,使得用户设备执行前述实施例描述的流程。
基于相同的技术构思,本申请实施例还提供了一种装置700,该装置700可实现前述实施例描述的流程。
图7示例性地示出了根据各种实施例的示例装置700.装置700可包括一个或多个处理器702,***控制逻辑701耦合于至少一个处理器702,非易失性存储器(non-volatilememory,NMV)/存储器704耦合于***控制逻辑701,网络接口706耦合于***控制逻辑701。
处理器702可包括一个或多个单核处理器或多核处理器。处理器702可包括任何一般用途处理器或专用处理器(如图像处理器、应用处理器基带处理器等)的组合。
一个实施例中的***控制逻辑701,可包括任何适当的接口控制器,以提供到处理器702中的至少一个的任何合适的接口,和/或提供到与***控制逻辑701通信的任何合适的设备或组件的任何合适的接口。
一个实施例中的***控制逻辑701,可包括一个或多个内存控制器,以提供到***内存703的接口。***内存703用来加载以及存储数据和/或指令。例如,对应装置700,在一个实施例中,***内存703可包括任何合适的易失性存储器。
NVM/存储器704可包括一个或多个有形的非暂时的计算机可读介质,用于存储数据和/或指令。例如,NVM/存储器704可包括任何合适的非易失性存储装置,如一个或多个硬盘(hard disk device,HDD),一个或多个光盘(compact disk,CD),和/或一个或多个数字通用盘(digital versatile disk,DVD)。
NVM/存储器704可包括存储资源,该存储资源物理上是该***所安装的或者可以被访问的设备的一部分,但不一定是设备的一部分。例如,NVM/存储器704可经由网络接口706被网络访问。
***内存703以及NVM/存储器704可分别包括临时的或持久的指令710的副本。指令710可包括当由处理器702中的至少一个执行时导致装置700实现图2至图5描述的方法之一或组合的指令。各实施例中,指令710或硬件、固件,和/或软件组件可另外地/可替换地被置于***控制逻辑701,网络接口706和/或处理器702。
网络接口706可包括一个接收器来为装置700提供无线接口来与一个或多个网络和/或任何合适的设备进行通信。网络接口706可包括任何合适的硬件和/或固件。网络接口706可包括多个天线来提供多输入多输出无线接口。在一个实施例中,网络接口706可包括一个网络适配器、一个无线网络适配器、一个电话调制解调器,和/或无线调制解调器。
在一个实施例中,处理器702中的至少一个可以与用于***控制逻辑的一个或多个控制器的逻辑一起封装。在一个实施例中,处理器中的至少一个可以与用于***控制逻辑的一个或多个控制器的逻辑一起封装以形成***级封装。在一个实施例中,处理器中的至少一个可以与用于***控制逻辑的一个或多个控制器的逻辑集成在相同的管芯上。在一个实施例中,处理器中的至少一个可以与用于***控制逻辑的一个或多个控制器的逻辑集成在相同的管芯上以形成***芯片。
装置700可进一步包括输入/输出装置705,。输入/输出装置705可包括用户接口旨在使用户与装置700进行交互,可包括***组件接口,其被设计为使得***组件能够与***交互,和/或,可包括传感器,旨在确定环境条件和/或有关装置700的位置信息。
本公开可以包括以下公开的各种示例实施例。
示例实施例1中,采用的方法可以进行合并:启动代理进程,所述代理进程加载所述代理进程所链接的动态链接库到内存;所述代理进程创建第一子进程,所述第一子进程通过调用所述第一程序的入口函数,加载所述第一程序;所述代理进程创建第二子进程,所述第二子进程通过调用所述第二程序的入口函数,加载所述第二程序;其中,所述第一程序和所述第二程序共享所述动态链接库占用的内存。
示例实施例2中,根据示例实施例1,所述代理进程由操作***中的第一个进程启动,所述代理进程用于代理所述第一个进程创建子进程。
示例实施例3中,根据示例实施例1-2,还包括:通过调用用于打开动态链接库的函数,在所述第一子进程中打开所述动态链接库,其中,该函数的输入参数中包括所述动态链接库的文件名;和/或,还包括:通过调用用于打开动态链接库的函数,在所述第二子进程中打开所述动态链接库,其中,该函数的输入参数中包括所述动态链接库的文件名。
示例实施例4中,根据示例实施例1-3,还包括:将所述第一子进程的名称修改为与所述第一程序的名称相同;和/或,还包括:将所述第二子进程的名称修改为与所述第二程序的名称相同。
示例实施例5中,根据示例实施例4,通过以下方式修改子进程的名称:子进程调用用于修改进程名称的***调用函数;或者,子进程获取所述子进程中用于存储进程名称的内存区域的地址,并修改所述地址对应的内存区域中存储的参数值。
示例实施例6中,根据示例实施例1-5,所述代理进程创建所述第一子进程之前,还包括:关闭不能被所述第一子进程继承的资源;所述代理进程创建所述第二子进程之前,还包括:关闭不能被所述第二子进程继承的资源。
示例实施例7中,根据示例实施例1-6,还包括:重置所述第一程序所使用的环境变量;和/或,还包括:重置所述第二程序所使用的环境变量。
示例实施例8中,根据示例实施例1-7,还包括:所述第一子进程获取用于存储第一子进程名称的内存区域的地址,并修改所述地址对应的内存区域中存储的参数值;和/或,还包括:所述第二子进程向所述代理进程发送请求;所述代理进程根据所述请求,获取用于存储第二子进程名称的参数的地址,并修改所述地址中的参数值。
示例实施例9中,根据示例实施例1-8,还包括:将被所述第一程序调用的所述动态链接库中的函数所修改的数据,存储于所述第一子进程独有的内存空间;和/或,还包括:将被所述第二程序调用的所述动态链接库中的函数所修改的数据,存储于所述第二子进程独有的内存空间。
示例实施例10中,根据示例实施例1-9,所述第一程序在被编译时,所述第一程序的入口函数地址被导出到所述第一程序的可执行文件中;所述第一子进程调用所述第一程序的入口函数之前,根据所述第一程序的可执行文件获取所述第一程序的入口函数地址;所述第二程序在被编译时,所述第二程序的入口函数地址被导出到所述第二程序的可执行文件中;所述第二子进程调用所述第二程序的入口函数之前,根据所述第二程序的可执行文件获取所述第二程序的入口函数地址。
本公开还可以包括以下公开的各种示例实施例。
示例实施例1中,装置可以进行合并,该装置可包括:启动模块,用于启动代理进程,所述代理进程加载所述代理进程所链接的动态链接库到内存;进程创建模块,用于创建第一子进程,所述第一子进程通过调用所述第一程序的入口函数,加载所述第一程序;以及,创建第二子进程,所述第二子进程通过调用所述第二程序的入口函数,加载所述第二程序;其中,所述第一程序和所述第二程序共享所述动态链接库占用的内存。
示例实施例2中,根据示例实施例1,所述启动模块为操作***中的第一个进程,被所述启动模块启动的所述代理进程用于代理所述第一个进程创建子进程。
示例实施例3中,根据示例实施例1-2,所述进程创建模块还用于:通过调用用于打开动态链接库的函数,在所述第一子进程中打开所述动态链接库,其中,该函数的输入参数中包括所述动态链接库的文件名;和/或,通过调用用于打开动态链接库的函数,在所述第二子进程中打开所述动态链接库,其中,该函数的输入参数中包括所述动态链接库的文件名。
示例实施例4中,根据示例实施例1-3,所述进程创建模块创建的所述第一子进程将所述第一子进程的名称修改为与所述第一程序的名称相同;和/或,所述进程创建模块创建的所述第二子进程将所述第二子进程的名称修改为与所述第二程序的名称相同。
示例实施例5中,根据示例实施例1-4,所述进程创建模块还用于:创建所述第一子进程之前,关闭不能被所述第一子进程继承的资源;以及,创建所述第二子进程之前,关闭不能被所述第二子进程继承的资源。
示例实施例6中,根据示例实施例1-5,所述进程创建模块创建的所述第一子进程重置所述第一程序所使用的环境变量;和/或,所述进程创建模块创建的所述第二子进程重置所述第二程序所使用的环境变量。
示例实施例7中,根据示例实施例1-6,还包括处理模块,用于将被所述第一程序调用的所述动态链接库中的函数所修改的数据,存储于所述第一子进程独有的内存空间;和/或,将被所述第二程序调用的所述动态链接库中的函数所修改的数据,存储于所述第二子进程独有的内存空间。
示例实施例8中,根据示例实施例1-7,所述第一程序在被编译时,所述第一程序的入口函数地址被导出到所述第一程序的可执行文件中;所述进程创建模块创建的所述第一子进程根据所述第一程序的可执行文件获取所述第一程序的入口函数地址;所述第二程序在被编译时,所述第二程序的入口函数地址被导出到所述第二程序的可执行文件中;和/或,所述进程创建模块创建的所述第二子进程根据所述第二程序的可执行文件获取所述第二程序的入口函数地址。
本公开还可以包括以下公开的各种示例实施例。
示例实施例1中,计算机可读介质可以进行合并,其可包括:一个或多个计算机可读介质,所述可读介质上存储有指令,所述指令被一个或多个处理器执行时,使得通信设备执行如权利要求1-10中任一项所述的方法。
本公开还可以包括以下公开的各种示例实施例。
示例实施例1中,装置可以进行合并,其可包括:一个或多个处理器;以及,一个或多个计算机可读介质,所述可读介质上存储有指令,所述指令被所述一个或多个处理器执行时,使得所述装置执行如权利要求1-10中任一项所述的方法。

Claims (20)

1.一种进程管理方法,其特征在于,包括:
启动代理进程,所述代理进程加载所述代理进程所链接的动态链接库到内存;
所述代理进程创建第一子进程,所述第一子进程通过调用第一程序的入口函数,加载所述第一程序;
所述代理进程创建第二子进程,所述第二子进程通过调用第二程序的入口函数,加载所述第二程序;
其中,所述第一程序和所述第二程序共享所述动态链接库占用的内存;
所述代理进程由init进程启动,所述代理进程具有其独有的内存空间,所述内存空间在init进程启动所述代理进程时由Linux内核分配,且所述代理进程在编译时链接了所述动态链接库。
2.如权利要求1所述的方法,其特征在于,所述代理进程由操作***中的第一个进程启动,所述代理进程用于代理所述第一个进程创建子进程。
3.如权利要求1所述的方法,其特征在于,还包括:通过调用用于打开动态链接库的函数,在所述第一子进程中打开所述动态链接库,其中,该函数的输入参数中包括所述动态链接库的文件名;和/或
还包括:通过调用用于打开动态链接库的函数,在所述第二子进程中打开所述动态链接库,其中,该函数的输入参数中包括所述动态链接库的文件名。
4.如权利要求1所述的方法,其特征在于,还包括:将所述第一子进程的名称修改为与所述第一程序的名称相同;和/或
还包括:将所述第二子进程的名称修改为与所述第二程序的名称相同。
5.如权利要求4所述的方法,其特征在于,通过以下方式修改子进程的名称:
子进程调用用于修改进程名称的***调用函数;或者,
子进程获取所述子进程中用于存储进程名称的内存区域的地址,并修改所述地址对应的内存区域中存储的参数值。
6.如权利要求1所述的方法,其特征在于,所述代理进程创建所述第一子进程之前,还包括:关闭不能被所述第一子进程继承的资源;和/或
所述代理进程创建所述第二子进程之前,还包括:关闭不能被所述第二子进程继承的资源。
7.如权利要求1所述的方法,其特征在于,还包括:重置所述第一程序所使用的环境变量;和/或
还包括:重置所述第二程序所使用的环境变量。
8.如权利要求1所述的方法,其特征在于,还包括:
所述第一子进程获取用于存储第一子进程名称的内存区域的地址,并修改所述地址对应的内存区域中存储的参数值;
和/或,还包括:
所述第二子进程向所述代理进程发送请求;
所述代理进程根据所述请求,获取用于存储第二子进程名称的参数的地址,并修改所述地址中的参数值。
9.如权利要求1所述的方法,其特征在于,还包括:
将被所述第一程序调用的所述动态链接库中的函数所修改的数据,存储于所述第一子进程独有的内存空间;和/或
将被所述第二程序调用的所述动态链接库中的函数所修改的数据,存储于所述第二子进程独有的内存空间。
10.如权利要求1至9中任一项所述的方法,其特征在于,所述第一程序在被编译时,所述第一程序的入口函数地址被导出到所述第一程序的可执行文件中;所述第一子进程调用所述第一程序的入口函数之前,根据所述第一程序的可执行文件获取所述第一程序的入口函数地址;
所述第二程序在被编译时,所述第二程序的入口函数地址被导出到所述第二程序的可执行文件中;所述第二子进程调用所述第二程序的入口函数之前,根据所述第二程序的可执行文件获取所述第二程序的入口函数地址。
11.一种进程管理装置,其特征在于,包括:
启动模块,用于启动代理进程,所述代理进程加载所述代理进程所链接的动态链接库到内存;
进程创建模块,用于由所述代理进程创建第一子进程,所述第一子进程通过调用第一程序的入口函数,加载所述第一程序;以及
由所述代理进程创建第二子进程,所述第二子进程通过调用第二程序的入口函数,加载所述第二程序;
其中,所述第一程序和所述第二程序共享所述动态链接库占用的内存;
所述代理进程由init进程启动,所述代理进程具有其独有的内存空间,所述内存空间在init进程启动所述代理进程时由Linux内核分配,且所述代理进程在编译时链接了所述动态链接库。
12.如权利要求11所述的装置,其特征在于,所述启动模块为操作***中的第一个进程,被所述启动模块启动的所述代理进程用于代理所述第一个进程创建子进程。
13.如权利要求11所述的装置,其特征在于,所述进程创建模块还用于:通过调用用于打开动态链接库的函数,在所述第一子进程中打开所述动态链接库,其中,该函数的输入参数中包括所述动态链接库的文件名;和/或
通过调用用于打开动态链接库的函数,在所述第二子进程中打开所述动态链接库,其中,该函数的输入参数中包括所述动态链接库的文件名。
14.如权利要求11所述的装置,其特征在于,所述进程创建模块创建的所述第一子进程将所述第一子进程的名称修改为与所述第一程序的名称相同;和/或
所述进程创建模块创建的所述第二子进程将所述第二子进程的名称修改为与所述第二程序的名称相同。
15.如权利要求11所述的装置,其特征在于,所述进程创建模块还用于:创建所述第一子进程之前,关闭不能被所述第一子进程继承的资源;以及
创建所述第二子进程之前,关闭不能被所述第二子进程继承的资源。
16.如权利要求11所述的装置,其特征在于,所述进程创建模块创建的所述第一子进程调用所述第一程序的入口函数之前,重置所述第一程序所使用的环境变量;和/或
所述进程创建模块创建的所述第二子进程调用所述第二程序的入口函数之前,重置所述第二程序所使用的环境变量。
17.如权利要求11所述的装置,其特征在于,还包括:
处理模块,用于将被所述第一程序调用的所述动态链接库中的函数所修改的数据,存储于所述第一子进程独有的内存空间;和/或,将被所述第二程序调用的所述动态链接库中的函数所修改的数据,存储于所述第二子进程独有的内存空间。
18.如权利要求11至17中任一项所述的装置,其特征在于,所述第一程序在被编译时,所述第一程序的入口函数地址被导出到所述第一程序的可执行文件中;所述进程创建模块创建的所述第一子进程根据所述第一程序的可执行文件获取所述第一程序的入口函数地址;
所述第二程序在被编译时,所述第二程序的入口函数地址被导出到所述第二程序的可执行文件中;所述进程创建模块创建的所述第二子进程根据所述第二程序的可执行文件获取所述第二程序的入口函数地址。
19.一种计算机可读介质,其特征在于,所述可读介质上存储有指令,所述指令被一个或多个处理器执行时,使得处理器执行如权利要求1-10中任一项所述的方法。
20.一种进程管理装置,其特征在于,包括:
一个或多个处理器;以及
计算机可读介质,所述可读介质上存储有指令,所述指令被所述一个或多个处理器执行时,使得所述装置执行如权利要求1-10中任一项所述的方法。
CN201611078446.1A 2016-11-29 2016-11-29 一种进程管理方法及装置 Active CN108121594B (zh)

Priority Applications (3)

Application Number Priority Date Filing Date Title
CN201611078446.1A CN108121594B (zh) 2016-11-29 2016-11-29 一种进程管理方法及装置
TW106126766A TW201820131A (zh) 2016-11-29 2017-08-08 進程管理方法及裝置
PCT/CN2017/111997 WO2018099292A1 (zh) 2016-11-29 2017-11-21 一种进程管理方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611078446.1A CN108121594B (zh) 2016-11-29 2016-11-29 一种进程管理方法及装置

Publications (2)

Publication Number Publication Date
CN108121594A CN108121594A (zh) 2018-06-05
CN108121594B true CN108121594B (zh) 2020-10-20

Family

ID=62226976

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611078446.1A Active CN108121594B (zh) 2016-11-29 2016-11-29 一种进程管理方法及装置

Country Status (3)

Country Link
CN (1) CN108121594B (zh)
TW (1) TW201820131A (zh)
WO (1) WO2018099292A1 (zh)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109086136A (zh) * 2018-07-26 2018-12-25 广东浪潮大数据研究有限公司 一种Samba软件的请求处理方法及相关装置
CN109408147B (zh) * 2018-10-22 2022-04-19 深圳市元征科技股份有限公司 一种协议确定方法、***、装置及可读存储介质
CN112083998B (zh) * 2019-06-14 2024-05-17 中车株洲电力机车研究所有限公司 VxWorks***的RTP中任务参数的动态配置方法及其装置
CN112256339B (zh) * 2019-07-22 2023-11-03 百度在线网络技术(北京)有限公司 多进程管理方法、装置、电子设备和存储介质
CN111083195B (zh) * 2019-11-12 2022-09-13 烽火通信科技股份有限公司 虚拟单盘代理***及方法
CN113282380B (zh) * 2020-02-18 2024-05-24 深圳信可通讯技术有限公司 一种多路控制接口调用的方法、装置及计算机可读介质
CN111596970B (zh) * 2020-05-12 2023-04-28 广州市百果园信息技术有限公司 动态库延迟加载方法、装置、设备和存储介质
CN113377543A (zh) * 2021-06-28 2021-09-10 上海商汤科技开发有限公司 任务处理***、电子设备和存储介质
CN114385261A (zh) * 2021-12-23 2022-04-22 湖南小算科技信息有限公司 一种进程内装载程序的方法
CN115309523A (zh) * 2022-07-28 2022-11-08 青岛云天励飞科技有限公司 数据处理方法、装置、电子设备及存储介质
CN115589503A (zh) * 2022-10-28 2023-01-10 惠州市德赛西威汽车电子股份有限公司 车载主机开机动画实现方法,***,主机及存储介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20090113111A1 (en) * 2007-10-30 2009-04-30 Vmware, Inc. Secure identification of execution contexts
CN101382953B (zh) * 2008-09-19 2013-03-20 中兴通讯股份有限公司 在用户空间访问文件***的接口***与文件读、写方法
CN101576912A (zh) * 2009-06-03 2009-11-11 中兴通讯股份有限公司 实现分布式文件***异步输入输出接口的***及读写方法
US9104504B2 (en) * 2013-03-13 2015-08-11 Dell Products Lp Systems and methods for embedded shared libraries in an executable image

Also Published As

Publication number Publication date
CN108121594A (zh) 2018-06-05
WO2018099292A1 (zh) 2018-06-07
TW201820131A (zh) 2018-06-01

Similar Documents

Publication Publication Date Title
CN108121594B (zh) 一种进程管理方法及装置
CN107967139B (zh) 游戏的热更新方法及装置
US10019598B2 (en) Dynamic service discovery
EP2557498A1 (en) Updating method and computer system for hypervisor components
CN104731622B (zh) 一种应用程序的加载方法、装置和移动终端
CN106648755B (zh) 一种在安卓art环境中动态加载dex的方法及装置
CN109614772B (zh) 基于应用安装包文件的代码转换方法及装置
US20120198431A1 (en) Method for upgrading hypervisor component and computer system
CN111736913B (zh) 类加载方法和装置
CN107402792B (zh) 应用软件安装包的集成方法、装置、设备及存储介质
US20120227056A1 (en) Method and system for enabling access to functionality provided by resources outside of an operating system environment
CN114077460A (zh) 软件操作***调用Android动态库HAL接口的方法、设备及介质
CN114721688A (zh) 一种sdk升级方法、装置以及计算机设备
CN113986402A (zh) 函数调用方法、装置、电子设备及存储介质
CN110333872B (zh) 一种应用的处理方法、装置、设备和介质
CN115335806A (zh) 以模块粒度的影子堆栈违规强制
CN110045998B (zh) 加载动态库的方法及装置
JP2007510211A (ja) コンピュータ装置におけるダイナミック・リンク・ライブラリのマッピング
CN108595192A (zh) 一种应用程序的安装方法及终端设备
CN106775608B (zh) 独立***进程的实现方法和装置
CN112148351A (zh) 一种应用软件跨版本兼容的方法和***
CN111381816A (zh) 应用程序的获取方法、装置、设备及存储介质
US20220004422A1 (en) Method and Apparatus of Providing a Function as a Service (FAAS) Deployment of an Application
CN113835748B (zh) 基于html5的应用程序的打包方法、***和可读介质
CN113282363A (zh) 一种优化混合app的方法及装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20240621

Address after: Room 201, No. 9 Fengxiang East Street, Yangsong Town, Huairou District, Beijing

Patentee after: Youku Culture Technology (Beijing) Co.,Ltd.

Country or region after: China

Address before: Cayman Islands Grand Cayman capital building, a four storey No. 847 mailbox

Patentee before: ALIBABA GROUP HOLDING Ltd.

Country or region before: Cayman Islands