CN114625545A - 进程持锁检测方法及其电子设备和可读介质 - Google Patents
进程持锁检测方法及其电子设备和可读介质 Download PDFInfo
- Publication number
- CN114625545A CN114625545A CN202011457088.1A CN202011457088A CN114625545A CN 114625545 A CN114625545 A CN 114625545A CN 202011457088 A CN202011457088 A CN 202011457088A CN 114625545 A CN114625545 A CN 114625545A
- Authority
- CN
- China
- Prior art keywords
- lock
- processes
- state
- memory
- electronic device
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3466—Performance evaluation by tracing or monitoring
- G06F11/3471—Address tracing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5038—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请涉及计算机领域,公开了一种进程持锁检测方法及其电子设备和可读介质。本申请的进程持锁检测方法包括:确定电子设备的第一进程所处进程状态满足***保护触发条件,并且第一进程在等待使用电子设备的共享内存的读写锁;从第一进程所处的线程组中选择出多个第二进程,其中第二进程不在等待读写锁并且处于持锁进程状态;保存多个第二进程的进程信息。因此,采用本申请的进程持锁检测方法,最终内核打印的进程栈的数量大大减少,极大降低了开发人员的排查工作量,也利于精准定位持锁进程。
Description
技术领域
本申请涉及计算机领域,尤其涉及一种进程持锁检测方法及其电子设备和可读介质。
背景技术
内核用于管理***的进程、内存、设备驱动程序、文件和网络***,决定着***的性能和稳定性。例如,多个进程共享内存会存在竞争问题,内核为了保护共享内存,提供了一种读写锁机制,即只有持有读写锁的进程才能访问共享内存进行读写操作,在Linux内核中线程组内所有进程共享内存空间,用于保护线程组的内存空间的读写锁叫做mmap_sem锁(memory map_semaphore,内存映射_信号量),
如图1所示,一个线程组的多个进程在等待mmap_sem锁(下文称为等锁进程),等锁进程都处于不可中断睡眠状态(即D状态),而持有mmap_sem锁的进程(下文称为持锁进程)处于可执行状态(即R状态),处于R状态的持锁进程占用共享内存执行读写操作。
但是当线程组中持锁进程长时间持有mmap_sem锁时,可能导致线程组内其他等锁进程长时间等待mmap_sem锁,即长时间处于D状态。如果等锁进程处于D状态时间超过时间阈值(例如,90秒),内核会打印***中所有处于D状态或R状态进程的进程栈,再触发***的保护机制(例如,关机重启)。
开发人员需要分析***日志中内核打印的所有处于D状态或R状态进程的进程栈,找到唯一持有mmap_sem锁的进程,然后优化该持锁进程的程序代码以降低宕机几率。但是***中处于D状态或R状态的进程成百上千个,而***日志的容量有限,这些都给开发人员的排查工作带来极大困难。
发明内容
本申请实施例提供了一种进程持锁检测方法及其电子设备和可读介质,采用本申请的进程持锁检测方法,最终内核打印的进程栈的数量大大减少,极大降低了开发人员的排查工作量,也利于精准定位持锁进程。
第一方面,一种电子设备的进程持锁检测方法,包括:
确定所述电子设备的第一进程所处进程状态满足***保护触发条件,并且所述第一进程在等待使用所述电子设备的共享内存的读写锁;
从所述第一进程所处的线程组中选择出多个第二进程,其中所述第二进程不在等待所述读写锁并且处于持锁进程状态;
保存所述多个第二进程的进程信息。
在本申请的一些实施例中,内核创建守护进程khungtaskd,用于遍历***中是否存在处于不可中断睡眠状态的第一进程。
在上述第一方面的一种实现中,所述电子设备的***使用的内核为Linux内核。
在本申请的一些实施例中,Linux内核至少包含进程管理模块、内存管理模块、虚拟文件***和网络子***。
在上述第一方面的一种实现中,所述***保护触发条件包括:
进程处于不可中断睡眠状态的持续时间超过预定时间阈值。
在本申请的一些实施例中,预定时间阈值可以由用户或***设置,例如,预定时间阈值设置为90秒。
在上述第一方面的一种实现中,所述并且所述第一进程在等待使用所述电子设备的共享内存的读写锁通过以下方式得出:
遍历等锁链表中是否存在所述第一进程的结构体指针;
在所述等锁链表中存在所述第一进程的结构体指针的情况下,所述第一进程在等待使用所述电子设备的共享内存的读写锁。
在本申请的一些实施例中,内核创建等锁链表,用于保存所有等待读写锁的进程的相关信息,其中,相关信息包括进程的结构体指针,结构体指针是进程的结构体的首地址。
以mmap_sem锁为例,当有进程要访问共享内存时,首先必须要申请到mmap_sem锁,在等锁进程处于等锁队列时(如图1所示),内核会将等锁进程的相关信息加入到等锁链表中。
在上述第一方面的一种实现中,所述从所述第一进程所处的线程组中选择出多个第二进程包括:
基于所述第一进程的线程组标识符遍历所述第一线程组的全部进程,从所述第一进程的线程组中选择多个第二进程。
在上述第一方面的一种实现中,所述持锁进程状态包括不可中断睡眠状态和可执行状态。
在本申请的一些实施例中,持锁进程状态包括不可中断睡眠状态(即D状态)和可执行状态(即R状态),这是因为当一个进程持锁后,可能处于R状态并一直占用共享内存空间不释放读写锁,或者,该进程持锁后在等待另外一个读写锁的读写锁并处于D状态,由此可见,处于R状态或D状态的进程都有可能持锁。
在上述第一方面的一种实现中,所述进程信息包括进程栈,所述进程栈包括函数的参数、局部变量和函数的返回地址中的至少一个。
在上述第一方面的一种实现中,所述读写锁为内存映射_信号量锁,用于保护所述电子设备的共享内存。
其中,内存映射_信号量锁把对访问共享内存空间的进程划分成读者和写者,读者只对共享内存空间进行读操作,写者只对共享内存空间进行写操作。内存映射_信号量锁允许同时有多个读者来访问共享内存空间,但只能有一个写者来访问共享内存空间,即内存映射_信号量锁同时只能有一个写者或多个读者,但不能同时既有读者又有写者。
第二方面,一种电子设备,包括:
存储器,存储有指令;
处理器,所述处理器和存储器耦合,当所述存储器存储的程序指令被所述处理器执行时使得所述电子设备执行上述第一方面所述的进程持锁检测方法。
第三方面,一种可读介质,所述可读介质中存储有指令,当所述指令在所述可读介质上运行时,使得所述可读介质执行上述第一方面所述的进程持锁检测方法。
第四方面,一种计算机程序产品,包括计算机程序/指令,该计算机程序/指令被处理器执行时实现上述第一方面所述的进程持锁检测方法。
第五方面,一种装置,该装置包含在电子设备中,该装置具有实现上述方面及上述方面的可能实现方式中电子设备行为的功能。功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。硬件或软件包括一个或多个与上述功能相对应的模块或单元。例如,通信连接单元或模块(如可以是蓝牙或者WIFI模块),显示参数获取单元或模块,显示界面生成单元或模块和多屏协同单元或模块(如具有该模块或单元功能的处理器)等。例如,通信连接单元或模块用于支持多个电子设备中的第一电子设备和第二电子设备建立多屏协同连接;显示参数获取单元或模块,用于支持第一电子设备从第二电子设备接收第二显示参数;显示界面生成单元或模块,用于支持第一电子设备根据显示参数获取单元或模块接收的第二显示参数对生成一个第三界面,第三界面包括第一电子设备的第一界面的第一内容,且该第一内容具有第二显示参数。多屏协同单元或模块,用于支持第一电子设备向第二电子设备发送第三界面;第二电子设备响应于接收到的第三界面,显示第四界面,第四界面包括第二内容和第一窗口,第一窗口包括第一内容,第一窗口中的第一内容具有第二显示参数。
附图说明
图1根据本申请一些实施例,提供一种进程等锁的示意图。
图2根据本申请一些实施例,提供一种进程持锁检测技术方案的应用场景图。
图3根据本申请一些实施例,提供一种手机100的硬件结构框图。
图4根据本申请一些实施例,提供一种手机100的软件结构框图。
图5根据本申请一些实施例,提供一种进程结构体示意图。
图6根据本申请一些实施例,提供一种共享内存示意图。
图7根据本申请一些实施例,提供一种进程持锁检测方法的流程图。
图8根据本申请一些实施例,提供一种等待mmap_sem锁的单向链表。
图9根据本申请一些实施例,提供一种线程组900示意图。
图10根据本申请一些实施例,提供另一种进程持锁检测方法的流程图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行详细描述。
图2示出了本申请具体实施例提供的进程持锁检测技术方案的应用场景图。
如图2所示,电子设备100的屏幕界面101有多个应用程序(application,APP),用户点击APP后,电子设备100创建相应的应用进程,应用进程可以实现对应APP的各项功能。例如,用户点击即时通信APP,电子设备创建即时通信APP的进程,用户可以通过即时通信APP的进程实现发语音、打电话等聊天功能,但是当即时通信APP的进程因为访问共享内存要等锁时,如果等锁时间超过***设置的阈值,如图102所示,在电子设备100的用户界面即时通信APP会卡住不动,此时电子设备100通过内部的***保护机制,例如,如图103所示,电子设备103关机重启,以解决即时通信APP卡死的问题。
在本申请的一些实施例中,在电子设备100重启之前,电子设备100的内核并不是打印***中所有处于D状态或R状态进程的进程栈,保存在电子设备100的***日志中,然后供开发人员分析出持锁时间超过时间阈值的持锁进程,而是通过以下方式打印包括持锁进程的进程栈的日志:
首先电子设备100的内核判断卡死进程是否在等锁,如果确定卡死进程在等锁,以mmap_sem锁为例,如果确定卡死进程在等待mmap_sem锁,则表明持锁进程与卡死等锁进程是属于同一线程组。
然后,从该卡死的等锁进程所处线程组的其他进程中选择出没有等锁且处于D状态或R状态的进程进行打印,得到包括持锁进程的进程栈日志,其中,打印进程栈就是内核导出进程的相关数据。因为只有处于D状态和R状态的进程才可能持锁,如果等锁进程不持锁,则卡死线程组中不在等锁且处于D状态和R状态的进程都有可能是持锁进程。这是因为当一个进程持有mmap_sem锁后,可能处于R状态并一直占用共享内存空间不释放mmap_sem锁,或者,该进程持有mmap_sem锁后在等待另外一个非mmap_sem锁的读写锁并处于D状态,由此可见,处于R状态或D状态的进程都有可能持有mmap_sem锁。
可以看出,相比于现有技术中将包括***中所有处于D状态或R状态的进程打印到日志中,本申请的技术方案只打印卡死进程所在线程组内不在等锁的处于D状态或R状态的进程,最终内核打印的进程的数量大大减少,极大降低了开发人员的排查工作量,也利于精准定位持锁进程。
需要说明的是,如果等锁进程持锁则***处于死锁状态,现有技术可以解决死锁问题,本申请实施例对此不做赘述。
需要说明的是,在本申请中线程被看作是一种轻量级的进程,所有线程都当作进程来实现,本申请中将进程与线程统一描述为进程。
可以理解的是,电子设备100包括但不限于手机、平板电脑、笔记本电脑、台式计算机、车载电子设备、掌上电脑、个人数字助理(Personal Digital Assistant,PDA)和智能电视等任何安装有***的电子设备。为了便于说明,下面以手机100描述本申请的技术方案。
图3根据本申请的实施例示出了一种能够实现图2所示的电子设备100功能的手机100的结构框图。具体地,如图3所示,手机100可以包括处理器110,移动通信模块120,无线通信模块121,内部存储器130,外部存储接口140,显示屏150,音频模块160,传感器模块170,输入单元180和电源190。
可以理解的是,本申请的实施例示意的结构并不构成对手机100的具体限定。在本申请的另一些实施例中,手机100可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
处理器110可以包括一个或多个处理单元,例如:处理器110可以包括应用处理器(application processor,AP),调制解调处理器,图形处理器(graphics processingunit,GPU),图像信号处理器(image signal processor,ISP),控制器,视频编解码器,数字信号处理器(digital signal processor,DSP),DPU(data processing unit,数据处理器)、基带处理器,和/或神经网络处理器(neural-network processing unit,NPU)等。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。
处理器110中还可以设置存储器,用于存储指令和数据。在一些实施例中,处理器110中的存储器为高速缓冲存储器。该存储器可以保存处理器110刚用过或循环使用的指令或数据。如果处理器110需要再次使用该指令或数据,可从所述存储器中直接调用。避免了重复存取,减少了处理器110的等待时间,因而提高了***的效率。此外,在本申请的一些实施例中,处理器110可以用于执行本申请的进程持锁检测技术方案。
在本申请的一些实施例中,处理器110可以包括一个或多个接口。接口可以包括集成电路(inter-integrated circuit,I2C)接口,集成电路内置音频(inter-integratedcircuit sound,I2S)接口,脉冲编码调制(pulse code modulation,PCM)接口,通用异步收发传输器(universal asynchronous receiver/transmitter,UART)接口,移动产业处理器接口(mobile industry processor interface,MIPI),通用输入输出(general-purposeinput/output,GPIO)接口,用户标识模块(subscriber identity module,SIM)接口,和/或通用串行总线(universal serial bus,USB)接口等。
可以理解的是,本申请的实施例示意的各模块间的接口连接关系,只是示意性说明,并不构成对手机100的结构限定。在本申请另一些实施例中,手机100也可以采用上述实施例中不同的接口连接方式,或多种接口连接方式的组合。
移动通信模块120可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器110处理;另外,将涉及上行的数据发送给基站。通常,移动通信模块120包括但不限于天线、至少一个放大器、调谐器、一个或多个振荡器、用户身份模块(SIM)卡、收发信机、耦合器、LNA(英文:Low Noise Amplifier,中文低噪声放大器)、双工器等。此外,移动通信模块120还可以通过无线通信与网络和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于GSM(英文:GlobalSystem of Mobile communication,中文:全球移动通讯***)、GPRS(英文:GeneralPacket Radio Service,中文:通用分组无线服务)、CDMA(英文:Code Division MultipleAccess,中文:码分多址)、CDMA(英文:Wideband Code Division Multiple Access,中文:宽带码分多址)、LTE(英文:Long Term Evolution,中文:长期演进)、电子邮件、SMS(英文:Short Messaging Service,中文:短消息服务)等。
无线通信模块121可以提供应用在手机100上的包括无线局域网(wireless localarea networks,WLAN)(如无线保真(wireless fidelity,Wi-Fi)网络),蓝牙(bluetooth,BT),全球导航卫星***(global navigation satellite system,GNSS),调频(frequencymodulation,FM),近距离无线通信技术(near field communication,NFC),红外技术(infrared,IR)等无线通信的解决方案。无线通信模块121可以是集成至少一个通信处理模块的一个或多个器件。无线通信模块121经由天线接收电磁波,将电磁波信号调频以及滤波处理,将处理后的信号发送到处理器110。无线通信模块121还可以从处理器110接收待发送的信号,对其进行调频,放大,经天线转为电磁波辐射出去。在一些实施例中,无线通信模块121能够实现前文所述的基于Wi-Fi网路的通信协议的多载波技术,从而支持手机100通过现有的Wi-Fi与邮件服务器300建立通信连接。
内部存储器130可以用于存储计算机可执行程序代码,所述可执行程序代码包括指令。内部存储器130可以包括存储程序区和存储数据区。其中,存储程序区可存储***,至少一个功能所需的应用程序(比如声音播放功能,图像播放功能等)等。存储数据区可存储手机100使用过程中所创建的数据(比如音频数据,电话本等)等。此外,内部存储器130可以包括随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件,闪存器件,通用闪存存储器(universal flash storage,UFS)等。在本申请的一些实施例中,处理器110通过运行存储在内部存储器130的指令,和/或存储在设置于处理器中的存储器的指令以及各种功能应用以及数据处理。
在本申请的一些实施例中,内部存储器130可以是随机存取存储器(randomaccess memory,RAM),用于存储进程的结构体以及等锁链表,例如,手机100上安装的各个应用的进程的task_struct,所有等待memap_sem锁的单向链表。
在本申请的一些实施例中,内部存储器130可以是非易失性存储器,用于存储应用程序等,在用户点击应用程序后,应用程序被加载到RAM中成为进程,处理器110可以在RAM中运行进程。
外部存储器接口240可以用于连接外部存储卡,例如Micro SD卡,实现扩展手机100的存储能力。外部存储卡通过外部存储器接口240与处理器110通信,实现数据存储功能。
显示屏150,显示屏150可以采用液晶显示屏(liquid crystal display,LCD),有机发光二极管(organic light-emitting diode,OLED)显示屏,有源矩阵有机发光二极体(active-matrix organic light emitting diode,AMOLED)显示屏,柔性发光二极管(flexible light-emitting diode,FLED)显示屏,量子点发光二极管(quantum dot lightemitting diodes,QLED)显示屏等。
手机100还包括音频模块160,音频模块160可以包括扬声器,受话器,麦克风,耳机接口,以及应用处理器等实现音频功能。例如音乐播放,录音等。
音频模块160用于将数字音频信息转换成模拟音频信号输出,也用于将模拟音频输入转换为数字音频信号。音频模块160还可以用于对音频信号编码和解码。在一些实施例中,音频模块160可以设置于处理器110中,或将音频模块160的部分功能模块设置于处理器110中。
手机100还包括传感器模块170,其中传感器模块170可以包括压力传感器,陀螺仪传感器,气压传感器,磁传感器,加速度传感器,距离传感器,接近光传感器,指纹传感器,温度传感器,触摸传感器,环境光传感器等。
输入单元180可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。
手机100还包括给各个部件供电的电源190(比如电池),优选的,电源可以通过电源管理***与处理器110逻辑相连,从而通过电源管理***实现管理充电、放电、以及功耗管理等功能。电源190还可以包括一个或一个以上的直流或交流电源、再充电***、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
现参考图4,手机100的软件***可以采用分层架构,事件驱动架构,微核架构,微服务架构,或云架构。本申请实施例以分层架构的Android***为例,示例性说明终端设备的软件结构。图4是本申请实施例的手机100的软件结构框图。
分层架构将软件分成若干个层,每一层都有清晰的角色和分工。层与层之间通过软件接口通信。在一些实施例中,将Android***分为四层,从上至下分别为应用程序层,应用程序框架层,安卓运行时(Android runtime)和***库,以及内核层。
应用程序层可以包括一系列应用程序包。
如图4所示,应用程序包可以包括电话、相机,图库,日历,通话,地图,导航,WLAN,蓝牙,音乐,视频,短信息等应用程序。
应用程序框架层为应用程序层的应用程序提供应用编程接口(applicationprogramming interface,API)和编程框架。应用程序框架层包括一些预先定义的函数。
如图4所示,应用程序框架层可以包括窗口管理器,内容提供器,视图***,电话管理器,资源管理器,通知管理器等。
窗口管理器用于管理窗口程序。窗口管理器可以获取显示屏大小,判断是否有状态栏,锁定屏幕,截取屏幕等。
内容提供器用来存放和获取数据,并使这些数据可以被应用程序访问。所述数据可以包括视频,图像,音频,拨打和接听的电话,浏览历史和书签,电话簿等。
视图***包括可视控件,例如显示文字的控件,显示图片的控件等。视图***可用于构建应用程序。显示界面可以由一个或多个视图组成的。例如,包括短信通知图标的显示界面,可以包括显示文字的视图以及显示图片的视图。
电话管理器用于提供终端设备的通信功能。例如通话状态的管理(包括接通,挂断等)。
资源管理器为应用程序提供各种资源,比如本地化字符串,图标,图片,布局文件,视频文件等等。
通知管理器使应用程序可以在状态栏中显示通知信息,可以用于传达告知类型的消息,可以短暂停留后自动消失,无需用户交互。比如通知管理器被用于告知下载完成,消息提醒等。通知管理器还可以是以图表或者滚动条文本形式出现在***顶部状态栏的通知,例如后台运行的应用程序的通知,还可以是以对话窗口形式出现在屏幕上的通知。例如在状态栏提示文本信息,发出提示音,终端设备振动,指示灯闪烁等。
Android runtime包括核心库和微信。Android runtime负责安卓***的调度和管理。
核心库包含两部分:一部分是java语言需要调用的功能函数,另一部分是安卓的核心库。
应用程序层和应用程序框架层运行在即时通信APP中。即时通信APP将应用程序层和应用程序框架层的java文件执行为二进制文件。即时通信APP用于执行对象生命周期的管理,堆栈管理,线程管理,安全和异常的管理,以及垃圾回收等功能。
***库可以包括多个功能模块。例如:表面管理器(surface manager),媒体库(Media Libraries),三维图形处理库(例如:OpenGL ES),2D图形引擎(例如:SGL)等。
表面管理器用于对显示子***进行管理,并且为多个应用程序提供了2D和3D图层的融合。
媒体库支持多种常用的音频,视频格式回放和录制,以及静态图像文件等。媒体库可以支持多种音视频编码格式,例如:MPEG4,H.264,MP3,AAC,AMR,JPG,PNG等。
三维图形处理库用于实现三维图形绘图,图像渲染,合成,和图层处理等。
2D图形引擎是2D绘图的绘图引擎。
内核层是硬件和软件之间的层。内核层至少包含进程管理模块、内存管理模块、虚拟文件***和网络子***。下面分别介绍内核层的各个模块,具体包括:
(1)进程管理模块(process scheduler,PS):负责管理中央处理器(CPU,CentralProcessing Unit)资源,以便让各个进程可以以尽量公平的方式访问CPU。
内核检测到用户点击应用程序后,应用程序被加载到内存后成为进程,进程可以看成是应用程序的一次活动。当应用程序成为进程以后,进程管理模块为进程创建一个进程控制块(processing control block,PCB),在Linux***中,进程控制块也被称为task_struct结构体,进程管理模块通过task_struct结构体管理进程。
每个进程都有一个task_struct结构体,task_struct结构体包含了进程的所有属性信息。
如图5所示,task_struct结构体包括进程标识符、进程状态、优先级、程序计数器、上下文数据、I/O状态信息、记账信息等。
进程标识符(process identifier,PID):也称为进程控制符,表示进程的身份标识,只要内核创建进程,就会自动分配一个标识给进程,不过PID只是暂时唯一的,在进程中止后PID被***回收,可能会被分配给另一个新进程。
进程状态:反映进程执行过程的变化,这些状态随着进程的执行和外界条件的变化而转换。
例如,在Linux***中有6种进程状态,分别是:可执行状态(TASK_RUNNING)、可中断睡眠状态(TASK_INTERRUPTIBLE)、不可中断睡眠状态(TASK_UNINTERRUPTIBLE)、暂停或跟踪状态(TASK_STOPPED or TASK_TRACED)、退出状态(TASK_DEAD–EXIT_ZOMBLE)、退出状态(TASK_DEAD–EXIT_DEAD)。
可执行状态(TASK_RUNNING),简称R状态,只有该状态的进程才可能在CPU上执行。
可中断睡眠状态(TASK_INTERRUPTIBLE),简称S状态,处于这个状态的进程会被定期唤醒。
不可中断睡眠状态(TASK_UNINTERRUPTIBLE):简称D状态,进程处于睡眠状态,不响应异步信号。
暂停或跟踪状态(TASK_STOPPED or TASK_TRACED):简称T/t状态,向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态,当进程正在被跟踪时,它处于TASK_TRACED这个特殊的状态,“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。
退出状态(TASK_DEAD–EXIT_ZOMBLE),简称Z状态,进程成为僵尸进程。
退出状态(TASK_DEAD–EXIT_DEAD),简称X状态,进程即将被销毁。
优先级:如果多个进程正在执行,就涉及到进程被执行的先后顺序的问题,这和进程优先级有关。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:程序代码和进程相关数据的指针。
上下文数据:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表等。
记账信息:包括处理器的时间总和,记账号等等。
(2)内存管理模块(memory manager,MM):负责管理内存(Memory)空间,以便让各个进程可以安全地共享电子设备100的内存空间。另外,内存管理模块会提供虚拟内存的机制,该机制可以让进程使用多于***可用的内存,不用的内存会通过虚拟文件***保存在外部的非易失存储器中,需要使用的时候,再取回到***内存中。
例如,图6示出了共享内存的示意图,如图6所示,进程A和进程B通过页表将地址空间(虚拟地址)映射到物理地址时,在物理地址中有一块共同的内存区,即共享内存,这块共享内存对两个进程来说同时是可选用的。其中,页表负责将进程的虚拟地址与物理地址进行映射。
例如,一个线程组内有100个进程,由于线程组内的所有进程共享内存空间,为了保护线程组的内存空间,内存管理模块通过mmap_sem锁保护共享内存空间,mmap_sem锁把对访问共享内存空间的进程划分成读者和写者,读者只对共享内存空间进行读操作,写者只对共享内存空间进行写操作。mmap_sem锁允许同时有多个读者来访问共享内存空间,但只能有一个写者来访问共享内存空间,即mmap_sem锁同时只能有一个写者或多个读者,但不能同时既有读者又有写者。
(3)虚拟文件***(virtual file system,VFS):内核将不同功能的外部设备,例如硬盘、磁盘、NAND Flash、Nor Flash等、输入输出设备、显示设备等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。
(4)网络子***(network):负责管理各种网络设备,并实现各种网络协议栈,最终实现网络连接其他***的功能。
下面基于上述图3和图4所述的结构,根据图7并结合具体场景,详细介绍本申请的技术方案。如图7所示,本申请的进程持锁检测的技术方案包括:
701:内核的进程管理模块检测***中是否存在处于不可中断睡眠状态(D状态)的进程。
在本申请的一些实施例中,在***中内核创建守护进程khungtaskd,用于遍历***中是否存在处于D状态的进程。
如果存在处于D状态的进程,执行702;否则,返回执行701。
702:内核的进程管理模块判断进程处于不可中断的睡眠状态的持续时间是否超过时间阈值。
在本申请的一些实施例中,时间阈值可以由用户或***进行设定,例如,时间阈值设定为90秒。
如果超过时间阈值,执行703;否则,返回执行701。
703:内核的进程管理模块判断超过时间阈值的不可中断睡眠状态的进程是否在等待读写锁,即是否为等锁进程。
可以理解的是,如果超过时间阈值的不可中断睡眠状态的进程在等锁,则说明持锁进程与超过时间阈值的不可中断睡眠状态的进程是属于同一个线程组,则执行704,内核从超过时间阈值的等锁进程所处线程组中选择出非等锁进程;否则,说明超过时间阈值的不可中断睡眠状态的进程不在等锁,执行706,内核触发***保护机制,***重启。
在本申请的一些实施例中,内核首先获取超过时间阈值的不可中断睡眠状态的进程的标识符,再根据进程标识符获取该进程的结构体指针,最后基于结构体指针判断该进程是否在等锁。
具体地,即时通信APP以微信TM为例,在内核创建微信进程时,内核会分配给微信进程一个独一无二的PID,其中,PID的取值范围是0到32767。例如,微信进程的PID是31001。
然后,内核根据微信进程的PID获取微信进程的结构体指针。其中,结构体指针是进程结构体保存在***内存中的首地址。例如,微信进程的task_struct结构体在***内存中的首地址是0x00000038,则微信进程的结构体指针就是0x00000038。
最后,内核获取到微信进程的结构体指针后,根据结构体指针判断微信进程是否在等锁。
以mmap_sem锁为例,当有进程要访问共享内存时,首先必须要申请到mmap_sem锁,在等锁进程处于等锁队列时(如图1所示),内核会将等锁进程的相关信息加入到等锁链表中。
图8示出了一种等待mmap_sem锁的单向链表,如图8所示,链表800包括头指针801,结点802,结点803,结点804和结点805,头指针801内只有指针元素,没有数据元素,表示链表800的开始。每个结点对应一个进程,结点包括数据元素和指针元素,其中,数据元素内包括进程结构体指针,指针元素表示指向下一个结点。例如,结点802包括数据元素a1和指针元素next,数据元素a1中包括了一个等待mmap_sem锁的进程的结构体指针,指针元素next表示访问的下一个结点是结803。
如果在链表800中的其中一个结点查询到与微信进程的结构体指针相同的结构体指针,表示微信进程在等待mmap_sem锁。例如,微信的结构体指针是0x00000038,在链表的结点802中数据元素a1中有结构体指针是0x00000038,表示该结点802对应微信进程,说明微信进程在等待mmap_sem锁。
可以理解的是,图8所示的链表中包括4个结点,表示存储了4个进程信息,实际上图8所示的链表中结点的数量还可以是其他数量,本申请实施例对等锁链表的结点数量不做限制。此外,图8所示的链表是单向链表,在本申请的其他实施例中,等锁链表还可以是双向链表、循环链表或非线性链表等,本申请实施例对链表的形式不做限制。
704:内核的进程管理模块从超过时间阈值的等锁进程所处线程组中选择出非等锁进程。
如果线程组中的有进程在等锁,则说明该进程不可能持锁,返回执行704;否则,说明该进程可能持锁,执行705。
如图9所示,线程组900中包含多个线程,主线程t0,线程t1,线程t2,……,线程tn,每个线程对应一个轻量级进程,例如,主线程t0对应轻量级进程P0,线程t1对应轻量级进程P1,线程t2对应轻量级进程P2,线程tn对应轻量级进程Pn。这些线程都有一个共同的线程组标识符(thread group identifier,TGID),其中,线程组标识符就是主线程对应的轻量级进程的PID。例如,在线程组900中,主线程t0对应轻量级进程P0的PID是a,则线程组900的TGID就是a。
由此可见,内核的进程管理模块根据微信进程的TGID(例如TGID为31000)找到微信进程所处线程组的其他进程,然后逐一判断该线程组的其他进程是否在等锁,从而选择出非等锁进程。判断同一线程组内的其他进程是否在等锁的方法参考上述703描述,在此不做赘述。
705:内核打印选择出的非等锁进程中处于不可中断睡眠状态和可执行状态进程的进程栈,并保存在***日志中。
可以理解的是,进程栈是进程数据的存储方式,进程栈用于存储函数的参数、局部变量,寄存器的值(用于恢复寄存器),函数的返回地址以及用于结构化异常处理的数据,这些数据是按照一定的顺序组织在一起。内核打印进程栈,开发人员可以通过进程栈分析持锁进程持锁时间过长的原因,然后优化持锁进程的程序代码,降低宕机几率。
在本申请的一些实施例中,内核首先遍历同一线程组中不在等锁的所有进程的进程状态,如果该进程的进程状态不是D状态或R状态,则说明该进程不可能持锁;反之,如果该进程的进程状态是D状态或R状态,则说明该进程可能持锁,然后,内核将同一进程中所有处于D状态和R状态的非等锁进程的进程栈打印,并保存在手机100的***日志中。
参考图8和图9,在线程组900中,假设有100个进程,其中,有90个进程处于D状态等待mmap_sem锁,微信进程是等锁进程的其中一个,内核检测到微信进程的处于D状态的时间超过时间阈值(90s),内核200判断出微信进程在等锁,首先筛查出与微信进程同处一个线程组的其他99个进程,排除与微信不在同一个线程组的其他进程,然后遍历这99个进程是否在等锁,例如,筛查出有10个进程不在等锁,排除89个等锁的进程(不包括微信进程),最后筛查出有5个处于D状态或R状态的不在等锁的进程,排除5个不处于D状态或R状态的不在等锁的进程。
可以看出,内核经过三次筛查最终确定有5个进程可能持有mmap_sem锁,然后打印这5个可能持有mmap_sem锁的进程的进程栈。作为对比,如果内核在判断有进程处于D状态的进程超过时间阈值(90s),就打印处于D状态或R状态进程的进程栈,其打印的进程栈的数量将远远超过本申请实施例提供的进程持锁检测方法,例如,***中有1000个进程处于D状态或R状态,则内核会打印这1000个处于D状态或R状态进程的进程栈,假设***日志只能保存200个进程的进程栈,则***日志只会保存1000个进程的进程栈中的后200个进程的进程栈,而持锁进程的进程栈可能位于前800个进程的进程栈当中,由此给开发人员无法找到持锁进程。
在本申请的一些实施例中,内核经过三次筛查后得到5个可能持有mmap_sem锁的进程,内核可以只打印这5个进程的进程栈保存在***日志中。此外,为了充分利用***的日志空间,内核可以先打印***中所有处于D状态或R状态的1000个进程的进程栈,最后打印经过筛查的5个进程的进程栈。
此外,如果最终只筛查出一个进程栈,则该进程必定持有mmap_sem锁,导致微信进程卡死时间超过时间阈值,因此可以将最终筛查出的持锁进程的进程栈上报至商用大数据网站,这样不仅可以知道微信卡死的事实,还可以检测出微信卡死的原因,即微信等待mmap_sem锁时间过长而卡死,开发人员可以优化持锁进程的代码,以减少这类持锁时间过长导致***重启的问题。
706:***重启。
在本申请的一些实施例中,在内核打印完进程栈后,内核主动触发***保护机制,手机100关机重启。在本申请另外一些实施例中,内核判断出超过时间阈值的不可中断睡眠状态的进程在不在等锁,内核主动触发***保护机制,手机100关机重启。
下面介绍本申请实施例提供的另一个进程持锁检测的技术方案,如图10所示,本申请的进程持锁检测的技术方案包括:
1001:守护进程检测到需触发***保护机制的进程标识符。
参考上述实施例,触发***保护机制的条件是进程处于D状态的持续时间超过时间阈值,例如,时间阈值为90秒。守护进程检测到超过时间阈值的处于D状态的进程,获取该进程的进程标识符。
1002:内核通过进程标识符获取进程结构体指针,具体过程请参考图7中703的描述,在此不做赘述。
1003:内核判断该进程是否在等锁链表中,具体判断过程请参考图7中703的描述,在此不做赘述。
如果该进程在等锁链表中,说明持锁进程与该进程同属一个线程组,则执行1004;否则,执行1009,***重启。
1004:内核遍历进程所处线程组的全部进程。
1005:内核遍历线程组的进程是否在等锁链表中,具体判断过程请参考图7中703的描述,在此不做赘述。
如果线程组的进程在等锁链表,返回执行1004,继续遍历线程组的下一个进程;否则,如果进程的进程不在等锁链表,执行1006。
1006:内核判断进程是否处于不可中断睡眠状态或可执行状态,具体判断过程请参考图7中704的描述,在此不做赘述。
如果进程不处于D状态或R状态,返回执行1004,继续遍历下一个进程;否则,执行1007。
1007:打印处于D状态或R状态的进程栈。
1008:判断线程组的进程是否遍历完毕。
如果没有遍历完毕,返回执行1004,直到线程组的进程遍历完毕为止;否则,执行1009。
1009:***重启。
可以理解的是,上述实施例中列举的数字只是示例性的,例如,线程组有100个进程,有90个进程在等待mmap_sem锁,***中有1000个处于D状态或R状态的进程,这些示例中的数字还可以是其他数字,本申请实施例对此不做限制。
可以理解的是,本申请实施例提供的进程持锁检测方法可以用于检测持有mmap_sem锁的进程,在本申请的其他实施例中,进程持锁检测方法还可以用于其他非mmap_sem锁的读写锁,本申请实施例对读写锁的类型不做限制。
在说明书对“一些实施例”或“实施例”的引用意指结合实施例所描述的具体特征、结构或特性被包括在根据本申请的至少一个范例实施方案或技术中。说明书中的各个地方的短语“在一个实施例中”的出现不一定全部指代同一个实施例。
本申请还涉及用于执行文本中的操作装置。该装置可以专门处于所要求的目的而构造或者其可以包括由被存储在计算机中的计算机程序选择性地激活或者重新配置的通用计算机。这样的计算机程序可以被存储在计算机可读介质中,诸如,但不限于任何类型的盘,包括软盘、光盘、CD-ROM、磁光盘、只读存储器(ROM)、随机存取存储器(RAM)、EPROM、EEPROM、磁或光卡、专用集成电路(ASIC)或者适于存储电子指令的任何类型的介质,并且每个可以被耦合到计算机***总线。此外,说明书中所提到的计算机可以包括单个处理器或者可以是采用针对增加的计算能力的多个处理器涉及的架构。
本申请所提出的过程和显示器固有地不涉及任何具体计算机或其他装置。各种通用***也可以与根据本文中的教导的程序一起使用,或者构造更多专用装置以执行一个或多个方法步骤可以证明是方便的。在一下描述中讨论了用于各种这些***的结构。另外,可以使用足以实现本申请的技术和实施方案的任何具体编程语言。各种编程语言可以被用于实施本申请,如本文所讨论的。
另外,在本说明书所使用的语言已经主要被选择用于可读性和指导性的目的并且可能未被选择为描绘或限制所公开的主题。因此,本申请旨在说明而非限制本文所讨论的概念的范围。
Claims (10)
1.一种电子设备的进程持锁检测方法,其特征在于,包括:
确定所述电子设备的第一进程所处进程状态满足***保护触发条件,并且所述第一进程在等待使用所述电子设备的共享内存的读写锁;
从所述第一进程所处的线程组中选择出多个第二进程,其中所述第二进程不在等待所述读写锁并且处于持锁进程状态;
保存所述多个第二进程的进程信息。
2.根据权利要求1所述的方法,其特征在于,所述电子设备的***使用的内核为Linux内核。
3.根据权利要求2所述的方法,其特征在于,所述***保护触发条件包括:
进程处于不可中断睡眠状态的持续时间超过预定时间阈值。
4.根据权利要求2所述的方法,其特征在于,所述并且所述第一进程在等待使用所述电子设备的共享内存的读写锁通过以下方式得出:
遍历等锁链表中是否存在所述第一进程的结构体指针;
在所述等锁链表中存在所述第一进程的结构体指针的情况下,所述第一进程在等待使用所述电子设备的共享内存的读写锁。
5.根据权利要求2所述的方法,其特征在于,所述从所述第一进程所处的线程组中选择出多个第二进程包括:
基于所述第一进程的线程组标识符遍历所述第一线程组的全部进程,从所述第一进程的线程组中选择多个第二进程。
6.根据权利要求5所述的方法,其特征在于,所述持锁进程状态包括不可中断睡眠状态和可执行状态。
7.根据权利要求2所述的方法,其特征在于,所述进程信息包括进程栈,所述进程栈包括函数的参数、局部变量和函数的返回地址中的至少一个。
8.根据权利要求2所述的方法,其特征在于,所述读写锁为内存映射_信号量锁,用于保护所述电子设备的共享内存。
9.一种电子设备,其特征在于,包括:
存储器,存储有指令;
处理器,所述处理器和存储器耦合,当所述存储器存储的程序指令被所述处理器执行时使得所述电子设备执行权利要求1至8中任一项所述的进程持锁检测方法。
10.一种可读介质,所述可读介质中存储有指令,其特征在于,当所述指令在所述可读介质上运行时,使得所述可读介质执行权利要求1至8中任一项所述的进程持锁检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011457088.1A CN114625545A (zh) | 2020-12-10 | 2020-12-10 | 进程持锁检测方法及其电子设备和可读介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011457088.1A CN114625545A (zh) | 2020-12-10 | 2020-12-10 | 进程持锁检测方法及其电子设备和可读介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114625545A true CN114625545A (zh) | 2022-06-14 |
Family
ID=81895510
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011457088.1A Pending CN114625545A (zh) | 2020-12-10 | 2020-12-10 | 进程持锁检测方法及其电子设备和可读介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114625545A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116701320A (zh) * | 2022-12-01 | 2023-09-05 | 荣耀终端有限公司 | 一种日志生成方法及相关装置 |
CN116860402A (zh) * | 2023-05-26 | 2023-10-10 | 荣耀终端有限公司 | 锁资源调度方法及装置 |
CN117131497A (zh) * | 2023-02-28 | 2023-11-28 | 荣耀终端有限公司 | 一种软件检测方法及电子设备 |
CN117539650A (zh) * | 2023-10-10 | 2024-02-09 | 本原数据(北京)信息技术有限公司 | 数据管理***的去中心化记录锁管理方法以及相关设备 |
WO2024046089A1 (zh) * | 2022-08-31 | 2024-03-07 | 华为技术有限公司 | 持锁进程检测方法及相关设备 |
-
2020
- 2020-12-10 CN CN202011457088.1A patent/CN114625545A/zh active Pending
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024046089A1 (zh) * | 2022-08-31 | 2024-03-07 | 华为技术有限公司 | 持锁进程检测方法及相关设备 |
CN116701320A (zh) * | 2022-12-01 | 2023-09-05 | 荣耀终端有限公司 | 一种日志生成方法及相关装置 |
CN116701320B (zh) * | 2022-12-01 | 2024-05-14 | 荣耀终端有限公司 | 一种日志生成方法及相关装置 |
CN117131497A (zh) * | 2023-02-28 | 2023-11-28 | 荣耀终端有限公司 | 一种软件检测方法及电子设备 |
CN116860402A (zh) * | 2023-05-26 | 2023-10-10 | 荣耀终端有限公司 | 锁资源调度方法及装置 |
CN116860402B (zh) * | 2023-05-26 | 2024-07-23 | 荣耀终端有限公司 | 锁资源调度方法及装置 |
CN117539650A (zh) * | 2023-10-10 | 2024-02-09 | 本原数据(北京)信息技术有限公司 | 数据管理***的去中心化记录锁管理方法以及相关设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114625545A (zh) | 进程持锁检测方法及其电子设备和可读介质 | |
CN108512695B (zh) | 监控应用卡顿的方法及装置 | |
US11099900B2 (en) | Memory reclamation method and apparatus | |
US20240231890A1 (en) | Memory management method and electronic device | |
EP3506105B1 (en) | Method and device for processing a memory and storage medium | |
WO2019128540A1 (zh) | 资源管理方法、移动终端及计算机可读存储介质 | |
CN107545067B (zh) | 日志信息上报方法、装置及存储介质、adsp和终端 | |
WO2019137258A1 (zh) | 内存处理方法、电子设备及计算机可读存储介质 | |
WO2019137252A1 (zh) | 内存处理方法、电子设备、计算机可读存储介质 | |
EP3506114B1 (en) | Memory processing method and device and storage medium | |
WO2019128588A1 (zh) | 进程处理方法和装置、电子设备、计算机可读存储介质 | |
US20120144406A1 (en) | Wait on address synchronization interface | |
CN107609120B (zh) | 日志信息上报方法、装置及存储介质、adsp和终端 | |
WO2019137173A1 (zh) | 资源管理方法、移动终端及计算机可读存储介质 | |
CN105847446B (zh) | 一种网络数据的获取方法、装置和*** | |
WO2019128542A1 (zh) | 应用处理方法、电子设备、计算机可读存储介质 | |
WO2019128574A1 (zh) | 信息处理方法、装置、计算机设备和计算机可读存储介质 | |
CN109992399B (zh) | 资源管理方法、装置、移动终端及计算机可读存储介质 | |
WO2019128573A1 (zh) | 信息处理方法、装置、计算机设备和计算机可读存储介质 | |
WO2022017328A1 (zh) | 一种电子设备的锁屏界面显示方法和电子设备 | |
WO2019128586A1 (zh) | 应用程序处理方法、电子设备、计算机可读存储介质 | |
CN107818036B (zh) | 黑屏检测方法、移动终端及计算机可读存储介质 | |
WO2019128569A1 (zh) | 应用程序冻结方法、装置、存储介质和终端 | |
CN107609114B (zh) | 日志信息上报方法、装置及存储介质、adsp和终端 | |
CN111935353B (zh) | 移动终端及其短信显示方法 |
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 |