常用的性能测试方法有哪些

常用的性能测试方法有哪些,第1张

1.负载测试

在这里,负载测试指的是最常见的验证一般性能需求而进行的性能测试,在上面我们提到了用户最常见的性能需求就是“既要马儿跑,又要马儿少吃草”。因此负载测试主要是考察软件系统在既定负载下的性能表现。我们对负载测试可以有如下理解:

(1)负载测试是站在用户的角度去观察在一定条件下软件系统的性能表现。

(2)负载测试的预期结果是用户的性能需求得到满足。此指标一般体现为响应时间、交易容量、并发容量、资源使用率等。

2.压力测试

压力测试是为了考察系统在极端条件下的表现,极端条件可以是超负荷的交易量和并发用户数。注意,这个极端条件并不一定是用户的性能需求,可能要远远高于用户的性能需求。可以这样理解,压力测试和负载测试不同的是,压力测试的预期结果就是系统出现问题,而我们要考察的是系统处理问题的方式。比如说,我们期待一个系统在面临压力的情况下能够保持稳定,处理速度可以变慢,但不能系统崩溃。因此,压力测试是能让我们识别系统的弱点和在极限负载下程序将如何运行。

例子:负载测试关心的是用户规则和需求,压力测试关心的是软件系统本身。对于它们的区别,我们可以用华山论剑的例子来更加形象地描述一下。如果把郭靖看做被测试对象,那么压力测试就像是郭靖和已经走火入魔的欧阳峰过招,欧阳锋蛮打乱来,毫无套路,尽可能地去打倒对方。郭靖要能应对住,并且不能丢进小命。而常规性能测试就好比郭靖和黄药师、洪七公三人约定,只要郭靖能分别接两位高手一百招,郭靖就算胜。至于三百招后哪怕郭靖会输掉那也不用管了。他只要能做到接下一百招,就算通过。

思考

我们在做软件压力测试时,往往要增加比负载测试更多的并发用户和交易,这是为什么?

3.并发测试

验证系统的并发处理能力。一般是和服务器端建立大量的并发连接,通过客户端的响应时间和服务器端的性能监测情况来判断系统是否达到了既定的并发能力指标。负载测试往往就会使用并发来创造负载,之所以把并发测试单独提出来,是因为并发测试往往涉及服务器的并发容量,以及多进程/多线程协调同步可能带来的问题。这是要特别注意,必须测试的。

4.基准测试

当软件系统中增加一个新的模块的时候,需要做基准测试,以判断新模块对整个软件系统的性能影响。按照基准测试的方法,需要打开/关闭新模块至少各做一次测试。关闭模块之前的系统各个性能指标记下来作为基准(Benchmark),然后与打开模块状态下的系统性能指标作比较,以判断模块对系统性能的影响。

5.稳定性测试

“路遥知马力”,在这里我们要说的是和性能测试有关的稳定性测试,即测试系统在一定负载下运行长时间后是否会发生问题。软件系统的有些问题是不能一下子就暴露出来的,或者说是需要时间积累才能达到能够度量的程度。为什么会需要这样的测试呢?因为有些软件的问题只有在运行一天或一个星期甚至更长的时间才会暴露。这种问题一般是程序占用资源却不能及时释放而引起的。比如,内存泄漏问题就是经过一段时间积累才会慢慢变得显著,在运行初期却很难检测出来;还有客户端和服务器在负载运行一段时间后,建立了大量的连接通路,却不能有效地复用或及时释放。

6.可恢复测试

测试系统能否快速地从错误状态中恢复到正常状态。比如,在一个配有负载均衡的系统中,主机承受了压力无法正常工作后,备份机是否能够快速地接管负载。可恢复测试通常结合压力测试一起来做。

提示:每种测试有其存在的空间和目的。当我们接手一个软件项目后,在有限的资源条件下,选择去做哪一种测试,这应该根据当前软件过程阶段和项目的本身特点来做选择。比如,在集成测试的时候要做基准测试,在软件产品每个发布点要做性能测试。

关于电脑进程:

现在是不是还有人对着任务管理器里面,一大堆的进程发呆?高手与低手的分别就是,高手能够很快地鉴别出有问题的进程,而低手则只能靠“排除法”一个个地试,搞不好还会系统崩溃,所以我们特意准备了这个超全的进程解释文章,以让大家更好地了解它们。

(1)[system Idle Process]

进程文件: [system process] or [system process]

进程名称: Windows内存处理系统进程

描 述: Windows页面内存管理进程,拥有0级优先。

介 绍:该进程作为单线程运行在每个处理器上,并在系统不处理其他线程的时候分派处理器的时间。它的cpu占用率越大表示可供分配的CPU资源越多,数字越小则表示CPU资源紧张。

(2)[algexe]

进程文件: alg or algexe

进程名称: 应用层网关服务

描 述: 这是一个应用层网关服务用于网络共享。

介 绍:一个网关通信插件的管理器,为 “Internet连接共享服务”和 “Internet连接防火墙服务”提供第三方协议插件的支持。

(3)[csrssexe]

进程文件: csrss or csrssexe

进程名称: Client/Server Runtime Server Subsystem

描 述: 客户端服务子系统,用以控制Windows图形相关子系统。

介 绍: 这个是用户模式Win32子系统的一部分。csrss代表客户/服务器运行子系统而且是一个基本的子系统必须一直运行。csrss用于维持Windows的控制,创建或者删除线程和一些16位的虚拟MS-DOS环境。

(4)[ddhelpexe]

进程文件: ddhelp or ddhelpexe

进程名称: DirectDraw Helper

描 述: DirectDraw Helper是DirectX这个用于图形服务的一个组成部分。

简 介:Directx 帮助程序

(5)[dllhostexe]

进程文件: dllhost or dllhostexe

进程名称: DCOM DLL Host进程

描 述: DCOM DLL Host进程支持基于COM对象支持DLL以运行Windows程序。

介 绍:com代理,系统附加的dll组件越多,则dllhost占用的cpu资源和内存资源就越多,而8月的“冲击波杀手”大概让大家对它比较熟悉吧。

(6)[explorerexe]

进程文件: explorer or explorerexe

进程名称: 程序管理

描 述: Windows Program Manager或者Windows Explorer用于控制Windows图形Shell,包括开始菜单、任务栏,桌面和文件管理。

介 绍:这是一个用户的shell,在我们看起来就像任务条,桌面等等。或者说它就是资源管理器,不相信你在运行里执行它看看。它对windows系统的稳定性还是比较重要的,而红码也就是找它的麻烦,在c和d根下创建explorerexe。

(7)[inetinfoexe]

进程文件: inetinfo or inetinfoexe

进程名称: IIS Admin Service Helper

描 述: InetInfo是Microsoft Internet Infomation Services (IIS)的一部分,用于Debug调试除错。

介绍:IIS服务进程,蓝码正是利用的inetinfoexe的缓冲区溢出漏洞。

(8)[internatexe]

进程文件: internat or internatexe

进程名称: Input Locales

描 述: 这个输入控制图标用于更改类似国家设置、键盘类型和日期格式。internatexe在启动的时候开始运行。它加载由用户指定的不同的输入点。输入点是从注册表的这个位置HKEY_USERS\DEFAULT\Keyboard Layout\Preload 加载内容的。internatexe 加载“EN”图标进入系统的图标区,允许使用者可以很容易的转换不同的输入点。当进程停掉的时候,图标就会消失,但是输入点仍然可以通过控制面板来改变。

介 绍:它主要是用来控制输入法的,当你的任务栏没有“EN”图标,而系统有internatexe进程,不妨结束掉该进程,在运行里执行internat命令即可。

(9)[kernel32dll]

进程文件: kernel32 or kernel32dll

进程名称: Windows壳进程

描 述: Windows壳进程用于管理多线程、内存和资源。

介 绍:更多内容浏览非法 *** 作与Kernel32解读

(10)[lsassexe]

进程文件: lsass or lsassexe

进程名称: 本地安全权限服务

描 述: 这个本地安全权限服务控制Windows安全机制。管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序等。

介 绍:这是一个本地的安全授权服务,并且它会为使用winlogon服务的授权用户生成一个进程。这个进程是通过使用授权的包,例如默认的msginadll来执行的。如果授权是成功的,lsass就会产生用户的进入令牌,令牌别使用启动初始的shell。其他的由用户初始化的进程会继承这个令牌的。而windows活动目录远程堆栈溢出漏洞,正是利用LDAP 3搜索请求功能对用户提交请求缺少正确缓冲区边界检查,构建超过1000个"AND"的请求,并发送给服务器,导致触发堆栈溢出,使Lsassexe服务崩溃,系统在30秒内重新启动。

(11)[mdmexe]

进程文件: mdm or mdmexe

进程名称: Machine Debug Manager

描 述: Debug除错管理用于调试应用程序和Microsoft Office中的Microsoft Script Editor脚本编辑器。

介 绍:Mdmexe的主要工作是针对应用软件进行排错(Debug),说到这里,扯点题外话,如果你在系统见到fff开头的0字节文件,它们就是mdmexe在排错过程中产生一些暂存文件,这些文件在 *** 作系统进行关机时没有自动被清除,所以这些fff开头的怪文件里是一些后缀名为CHK的文件都是没有用的LJ文件,可匀我馍境��换岫韵低巢��涣加跋臁6X系统,只要系统中有Mdmexe存在,就有可能产生以fff开头的怪文件。可以按下面的方法让系统停止运行Mdmexe来彻底删除以fff开头的怪文件:首先按“Ctrl+Alt+Del”组合键,在d出的“关闭程序”窗口中选中“Mdm”,按“结束任务”按钮来停止Mdmexe在后台的运行,接着把Mdmexe(在C:\Windows\System目录下)改名为Mdmbak。运行msconfig程序,在启动页中取消对“Machine Debug Manager”的选择。这样可以不让Mdmexe自启动,然后点击“确定”按钮,结束msconfig程序,并重新启动电脑。另外,如果你使用IE 5X以上版本浏览器,建议禁用脚本调用(点击“工具→Internet选项→高级→禁用脚本调用”),这样就可以避免以fff开头的怪文件再次产生。

(12)[mmtasktsk]

进程文件: mmtask or mmtasktsk

进程名称: 多媒体支持进程

描 述: 这个Windows多媒体后台程序控制多媒体服务,例如MIDI。

介 绍:这是一个任务调度服务,负责用户事先决定在某一时间运行的任务的运行。

(13)[mprexeexe]

进程文件: mprexe or mprexeexe

进程名称: Windows路由进程

描 述: Windows路由进程包括向适当的网络部分发出网络请求。

介 绍:这是Windows的32位网络界面服务进程文件,网络客户端部件启动的核心。印象中“A-311木马(TrojanA-311104)”也会在内存中建立mprexeexe进程,可以通过资源管理结束进程。

(14)[msgsrv32exe]

进程文件: msgsrv32 or msgsrv32exe

进程名称: Windows信使服务

描 述: Windows信使服务调用Windows驱动和程序管理在启动。

介 绍:msgsrv32exe 一个管理信息窗口的应用程序,win9x下如果声卡或者显卡驱动程序配置不正确,会导致死机或者提示msgsrv32exe 出错。

(15)[mstaskexe]

进程文件: mstask or mstaskexe

进程名称: Windows计划任务

描 述: Windows计划任务用于设定继承在什么时间或者什么日期备份或者运行。

介 绍:计划任务,它通过注册表自启动。因此,通过计划任务程序实现自启动的程序在系统信息中看不到它的文件名,一旦把它从注册表中删除或禁用,那么通过计划任务启动的程序全部不能自动运行。win9X下系统启动就会开启计划任务,可以通过双击计划任务图标-高级-终止计划任务来停止它自启动。另外,攻击者在攻击过程中,也经常用到计划任务,包括上传文件、提升权限、种植后门、清扫脚印等。

(16)[regsvcexe]

进程文件: regsvc or regsvcexe

进程名称: 远程注册表服务

描 述: 远程注册表服务用于访问在远程计算机的注册表。

(17)[rpcssexe]

进程文件: rpcss or rpcssexe

进程名称: RPC Portmapper

描 述: Windows 的RPC端口映射进程处理RPC调用(远程模块调用)然后把它们映射给指定的服务提供者。

介 绍:98它不是在装载解释器时或引导时启动,如果使用中有问题,可以直接在在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices添加"字符串值",定向到"C:\WINDOWS\SYSTEM\RPCSS"即可。

(18)[servicesexe]

进程文件: services or servicesexe

进程名称: Windows Service Controller

描 述: 管理Windows服务。

介 绍:大多数的系统核心模式进程是作为系统进程在运行。打开管理工具中的服务,可以看到有很多服务都是在调用%systemroot%\system32\serviceexe

(19)[smssexe]

进程文件: smss or smssexe

进程名称: Session Manager Subsystem

描 述: 该进程为会话管理子系统用以初始化系统变量,MS-DOS驱动名称类似LPT1以及COM,调用Win32壳子系统和运行在Windows登陆过程。

简 介:这是一个会话管理子系统,负责启动用户会话。这个进程是通过系统进程初始化的并且对许多活动的,包括已经正在运行的Winlogon,Win32(Csrssexe)线程和设定的系统变量作出反映。在它启动这些进程后,它等待Winlogon或者Csrss结束。如果这些过程时正常的,系统就关掉了。如果发生了什么不可预料的事情,smssexe就会让系统停止响应(就是挂起)。

(20)[snmpexe]

进程文件: snmp or snmpexe

进程名称: Microsoft SNMP Agent

描 述: Windows简单的网络协议代理(SNMP)用于监听和发送请求到适当的网络部分。

简 介:负责接收SNMP请求报文,根据要求发送响应报文并处理与WinsockAPI的接口。

(21)[spool32exe]

进程文件: spool32 or spool32exe

进程名称: Printer Spooler

描 述: Windows打印任务控制程序,用以打印机就绪。

(22)[spoolsvexe]

进程文件: spoolsv or spoolsvexe

进程名称: Printer Spooler Service

描 述: Windows打印任务控制程序,用以打印机就绪。

介 绍:缓冲(spooler)服务是管理缓冲池中的打印和传真作业。

(23)[stisvcexe]

进程文件: stisvc or stisvcexe

进程名称: Still Image Service

描 述: Still Image Service用于控制扫描仪和数码相机连接在Windows。

(24)[svchostexe]

进程文件: svchost or svchostexe

进程名称: Service Host Process

描 述: Service Host Process是一个标准的动态连接库主机处理服务

介 绍:Svchostexe文件对那些从动态连接库中运行的服务来说是一个普通的主机进程名。Svhostexe文件定位在系统的%systemroot%\system32文件夹下。在启动的时候,Svchostexe检查注册表中的位置来构建需要加载的服务列表。这就会使多个Svchostexe在同一时间运行。每个Svchostexe的回话期间都包含一组服务,以至于单独的服务必须依靠Svchostexe怎样和在那里启动。这样就更加容易控制和查找错误。windows 2k一般有2个svchost进程,一个是RPCSS(Remote Procedure Call)服务进程,另外一个则是由很多服务共享的一个svchostexe。而在windows XP中,则一般有4个以上的svchostexe服务进程,windows 2003 server中则更多。

(25)[taskmonexe]

进程文件: taskmon or taskmonexe

进程名称: Windows Task Optimizer

描 述: windows任务优化器监视你使用某个程序的频率,并且通过加载那些经常使用的程序来整理优化硬盘。

介 绍:任务管理器,它的功能是监视程序的执行情况并随时报告。能够监测所有在任务栏中以窗口方式运行的程序,可打开和结束程序,还可直接调出关闭系统对话框。

(26)[tcpsvcsexe]

进程文件: tcpsvcs or tcpsvcsexe

进程名称: TCP/IP Services

描 述: TCP/IP Services Application支持透过TCP/IP连接局域网和Internet。

(27)[winlogonexe]

进程文件: winlogon or winlogonexe

进程名称: Windows Logon Process

描 述: Windows NT用户登陆程序。这个进程是管理用户登录和退出的。而且winlogon在用户按下CTRL+ALT+DEL时就激活了,显示安全对话框。

(28)[winmgmtexe]

进程文件: winmgmt or winmgmtexe 文字

进程名称: Windows Management Service

描 述: Windows Management Service透过Windows Management Instrumentation data WMI)技术处理来自应用客户端的请求。

简 介:winmgmt是win2000客户端管理的核心组件。当客户端应用程序连接或当管理程序需要他本身的服务时这个进程初始化。WinMgmtexe(CIM对象管理器)和知识库(Repository)是WMI两个主要构成部分,其中知识库是对象定义的数据库,它是存储所有可管理静态数据的中心数据库,对象管理器负责处理知识库中对象的收集和 *** 作并从WMI提供程序收集信息。WinMgmtexe在Windows 2k/NT上作为一个服务运行,而在Windows 95/98上作为一个独立的exe程序运行。Windows 2k系统在某些计算机上出现的WMI错误可以通过安装Windows 2k SP2来修正。

(29)[system]

进程文件: system or system

进程名称: Windows System Process

描 述: Microsoft Windows系统进程。

介 绍:在任务管理器中会看到这项进程,属于正常系统进程。

系统进程就介绍到这里。

在Windows2k/XP中,以下进程是必须加载的:

smssexe、csrssexe、winlogonexe、servicesexe、lsassexe、svchostexe(可以同时存在多个)、spoolsvexe、explorerexe、System Idle Process;

在Windows 9x中,一下进程是必须加载的:

msgsrv32exe、mprexeexe、mmtasktsk、kenrel32dll

现在流行的进程线程同步互斥的控制机制,其实是由最原始最基本的4种方法实现的。由这4种方法组合优化就有了Net和Java下灵活多变的,编程简便的线程进程控制手段。

这4种方法具体定义如下 在《 *** 作系统教程》ISBN 7-5053-6193-7 一书中可以找到更加详细的解释

1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。

2、互斥量:为协调共同对一个共享资源的单独访问而设计的。

3、信号量:为控制一个具有有限数量用户资源而设计。

4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。

临界区(Critical Section)

保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式 *** 作共享资源的目的。

临界区包含两个 *** 作原语:

EnterCriticalSection() 进入临界区

 LeaveCriticalSection() 离开临界区

EnterCriticalSection()语句执行后代码将进入临界区以后无论发生什么,必须确保与之匹配的LeaveCriticalSection()都能够被执行到。否则临界区保护的共享资源将永远不会被释放。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。

MFC提供了很多功能完备的类,我用MFC实现了临界区。MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常简单的。只需在线程函数中用CCriticalSection类成员函数Lock()和UnLock()标定出被保护代码片段即可。Lock()后代码用到的资源自动被视为临界区内的资源被保护。UnLock后别的线程才能访问这些资源。

//CriticalSection

CCriticalSection global_CriticalSection;

// 共享资源

char global_Array[256];

//初始化共享资源

void InitializeArray()

{

for(int i = 0;i<256;i++)

{

global_Array[i]=I;

}

}

//写线程

UINT Global_ThreadWrite(LPVOID pParam)

{

CEdit ptr=(CEdit )pParam;

ptr->SetWindowText("");

//进入临界区

global_CriticalSectionLock();

for(int i = 0;i<256;i++)

{

global_Array[i]=W;

ptr->SetWindowText(global_Array);

Sleep(10);

}

//离开临界区

global_CriticalSectionUnlock();

return 0;

}

//删除线程

UINT Global_ThreadDelete(LPVOID pParam)

{

CEdit ptr=(CEdit )pParam;

ptr->SetWindowText("");

//进入临界区

global_CriticalSectionLock();

for(int i = 0;i<256;i++)

{

global_Array[i]=D;

ptr->SetWindowText(global_Array);

Sleep(10);

}

//离开临界区

global_CriticalSectionUnlock();

return 0;

}

//创建线程并启动线程

void CCriticalSectionsDlg::OnBnClickedButtonLock()

{

//Start the first Thread

CWinThread ptrWrite = AfxBeginThread(Global_ThreadWrite,

&m_Write,

THREAD_PRIORITY_NORMAL,

0,

CREATE_SUSPENDED);

ptrWrite->ResumeThread();

//Start the second Thread

CWinThread ptrDelete = AfxBeginThread(Global_ThreadDelete,

&m_Delete,

THREAD_PRIORITY_NORMAL,

0,

CREATE_SUSPENDED);

ptrDelete->ResumeThread();

}

在测试程序中,Lock UnLock两个按钮分别实现,在有临界区保护共享资源的执行状态,和没有临界区保护共享资源的执行状态。

程序运行结果

互斥量(Mutex)

互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。

互斥量包含的几个 *** 作原语:

CreateMutex() 创建一个互斥量

OpenMutex() 打开一个互斥量

ReleaseMutex() 释放互斥量

WaitForMultipleObjects() 等待互斥量对象

同样MFC为互斥量提供有一个CMutex类。使用CMutex类实现互斥量 *** 作非常简单,但是要特别注意对CMutex的构造函数的调用

 CMutex( BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL)

 不用的参数不能乱填,乱填会出现一些意想不到的运行结果。

//创建互斥量

CMutex global_Mutex(0,0,0);

// 共享资源

char global_Array[256];

void InitializeArray()

{

for(int i = 0;i<256;i++)

{

global_Array[i]=I;

}

}

UINT Global_ThreadWrite(LPVOID pParam)

{

CEdit ptr=(CEdit )pParam;

ptr->SetWindowText("");

global_MutexLock();

for(int i = 0;i<256;i++)

{

global_Array[i]=W;

ptr->SetWindowText(global_Array);

Sleep(10);

}

global_MutexUnlock();

return 0;

}

UINT Global_ThreadDelete(LPVOID pParam)

{

CEdit ptr=(CEdit )pParam;

ptr->SetWindowText("");

global_MutexLock();

for(int i = 0;i<256;i++)

{

global_Array[i]=D;

ptr->SetWindowText(global_Array);

Sleep(10);

}

global_MutexUnlock();

return 0;

}

同样在测试程序中,Lock UnLock两个按钮分别实现,在有互斥量保护共享资源的执行状态,和没有互斥量保护共享资源的执行状态。

程序运行结果

信号量(Semaphores)

信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与 *** 作系统中的PV *** 作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。在用CreateSemaphore()创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离开的同时通过ReleaseSemaphore()函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。

PV *** 作及信号量的概念都是由荷兰科学家EWDijkstra提出的。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。

P *** 作 申请资源:

 (1)S减1;

 (2)若S减1后仍大于等于零,则进程继续执行;

 (3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。

V *** 作 释放资源:

 (1)S加1;

 (2)若相加结果大于零,则进程继续执行;

 (3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。

信号量包含的几个 *** 作原语:

 CreateSemaphore() 创建一个信号量

 OpenSemaphore() 打开一个信号量

 ReleaseSemaphore() 释放信号量

 WaitForSingleObject() 等待信号量

//信号量句柄

HANDLE global_Semephore;

// 共享资源

char global_Array[256];

void InitializeArray()

{

for(int i = 0;i<256;i++)

{

global_Array[i]=I;

}

}

//线程1

UINT Global_ThreadOne(LPVOID pParam)

{

CEdit ptr=(CEdit )pParam;

ptr->SetWindowText("");

//等待对共享资源请求被通过 等于 P *** 作

WaitForSingleObject(global_Semephore, INFINITE);

for(int i = 0;i<256;i++)

{

global_Array[i]=O;

ptr->SetWindowText(global_Array);

Sleep(10);

}

//释放共享资源 等于 V *** 作

ReleaseSemaphore(global_Semephore, 1, NULL);

return 0;

}

UINT Global_ThreadTwo(LPVOID pParam)

{

CEdit ptr=(CEdit )pParam;

ptr->SetWindowText("");

WaitForSingleObject(global_Semephore, INFINITE);

for(int i = 0;i<256;i++)

{

global_Array[i]=T;

ptr->SetWindowText(global_Array);

Sleep(10);

}

ReleaseSemaphore(global_Semephore, 1, NULL);

return 0;

}

UINT Global_ThreadThree(LPVOID pParam)

{

CEdit ptr=(CEdit )pParam;

ptr->SetWindowText("");

WaitForSingleObject(global_Semephore, INFINITE);

for(int i = 0;i<256;i++)

{

global_Array[i]=H;

ptr->SetWindowText(global_Array);

Sleep(10);

}

ReleaseSemaphore(global_Semephore, 1, NULL);

return 0;

}

void CSemaphoreDlg::OnBnClickedButtonOne()

{

//设置信号量 1 个资源 1同时只可以有一个线程访问

global_Semephore= CreateSemaphore(NULL, 1, 1, NULL);

this->StartThread();

// TODO: Add your control notification handler code here

}

void CSemaphoreDlg::OnBnClickedButtonTwo()

{

//设置信号量 2 个资源 2 同时只可以有两个线程访问

global_Semephore= CreateSemaphore(NULL, 2, 2, NULL);

this->StartThread();

// TODO: Add your control notification handler code here

}

void CSemaphoreDlg::OnBnClickedButtonThree()

{

//设置信号量 3 个资源 3 同时只可以有三个线程访问

global_Semephore= CreateSemaphore(NULL, 3, 3, NULL);

this->StartThread();

// TODO: Add your control notification handler code here

}

信号量的使用特点使其更适用于对Socket(套接字)程序中线程的同步。例如,网络上的>

以上就是关于常用的性能测试方法有哪些全部的内容,包括:常用的性能测试方法有哪些、电脑高手进、请用技术语言介绍下线程同步,并发 *** 作怎么控制等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9663275.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存