互斥信号量怎么理解

推荐 生活 2019-10-08 04:10:36 2916

本文收集整理关于互斥信号量怎么理解的相关议题,使用内容导航快速到达。

内容导航:

  • Q1:【讨论】为什么要先资源信号量,再互斥信号量~~
  • Q2:怎么修改互斥信号量名称
  • Q3:嵌入式操作系统中互斥信号量、二值信号量、计数信号量有什么异同
  • Q4:互斥量和信号量的区别
  • Q1:【讨论】为什么要先资源信号量,再互斥信号量~~

    如两个进程都反过来操作,先互斥了,但是没有得到临界资源,不就是死锁在哪儿了吗

    Q2:怎么修改互斥信号量名称

    做这个至少要有点编程基础,禁双开的方法不止一种,不过一般利用Mutex的多一些,但如果游戏还有另外的验证措施,修改也不一定能成功:) 给你来个例子: QQ堂多开补丁的制作方法--原理篇+视频教程
    经常有会员提出想知道QQT多开补丁的修改方法,今天心情不错,嘿嘿,就有了这篇文章。 [所用工具]:
    OllyDbg V1.1(免费软件,点击下载)
    UltraEdit(点击下载) [修改的QQ堂版本]
    0.10 Beta2 Build11(注意,这个教程只针对旧版的,对新版不适用) 先说一说windows系统下,程序防止多开的几种常见方法:
    1)使用FindWindow API函数。
    通过查找窗口标题(或/和类名)来判断程序是否正在运行。如果找到了,表明程序正在运行,这时可退出程序,达到不重复运行的效果;反之表明程序是第一次运行。
    这种方法不适用于以下情况,程序的标题是动态变化的、系统中运行了相同标题(或/和类名)的程序 2)Mutex/Event/Semaphore
    通过互斥对象/信号量/事件等线程同步对象来确定程序是否已经运行。最常用的函数如:CreateMutexA(注意:QQ堂、QQ游戏大厅就是采用这样方法来限制程序多开的) 3)内存映射文件(File Mapping)
    通过把程序实例信息放到跨进程的内存映射文件中,也可以控制程序多开。 4)DLL全局共享区
    DLL全局共享区在映射到各个进程的地址空间时仅被初始化一次,且是在第一次被windows加载时,所以利用该区数据就能对程序进行多开限制。5)全局Atom
    将某个特定字符串通过GlobalAddAtom加入全局原子表(Global Atom Table),程序运行时检查该串是否存在来限制程序多开。(该Atom不会自动释放,程序退出前必须调用GlobalDeleteAtom来释放Atom) 6)检查窗口属性
    将某些数据通过SetProp加入到指定窗口的property list,程序运行时枚举窗口并检查这些数据是否存在来限制多开。 以上只列举了最常见的几种方法,具体应用中可以有n种选择,或综合运用多种方法来限制。 上面说过,QQT采用CreateMutex函数来限制多开,那么我怎么知道是使用这个函数来限制的呢?
    答案就是跟踪程序,查找程序是使用哪种方法来限制的。比如先看看是否使用CreateMutex来限制,如果不是,再看看是不是使用FindWindow,以此类推,直到找到方法为止。当然,有些程序也会综合使用多种方法来限制多开,方法也是一样的,只是麻烦点而已。 下面讲一讲使用CreateMutex函数来限制多开的方法:
    CreateMutex函数声明如下(具体请查阅相关资料,如MSDN)
    HANDLE CreateMutex(
    LPSECURITY_ATTRIBUTES lpMutexAttributes,// pointer to security attributes
    BOOL bInitialOwner,// flag for initial ownership
    LPCTSTR lpName// pointer to mutex-object name
    ); 以下是使用CreateMutex函数来限制多开的典型delphi代码
    hMutex:=CreateMutex(nil,TRUE,qqtang);//建立互斥量
    //调用失败?已经存在?
    if(hMutex=0) or (GetLastError=ERROR_ALREADY_EXISTS)then
    begin
    //程序第二(或以上)次运行时,GetLastError会返回ERROR_ALREADY_EXISTS,表明互斥量已存在
    //可以在这里编写退出代码
    end;
    该段代码首先调用CreateMutex函数创建一名为 qqtang 的互斥对象,如果调用CreateMutex函数失败(hMutex=nil)或互斥对象早已存在(GetLastError=ERROR_ALREADY_EXISTS),则退出程序。 好了,明白上面的内容后,我们进入修改实战:
    下载OllyDbg V1.1,解压到任何目录即可使用。
    启动OllyDbg,打开QQT目录下的Core.dll文件,按[是]载入DLL文件。
    按Ctrl+N打开API调用列表,找到CreateMutexA后按回车,在弹出的窗口里双击第一行来到CPU窗口,反汇编代码如下: 10002FB9.51push ecx; /MutexName = "qqtang"
    10002FBA.6A 01push 1;InitialOwner = TRUE
    10002FBC.6A 00push 0;pSecurity = NULL
    10002FBE.FF15 60E40010call dword ptr [<&KERNEL32.CreateMutexA>]; \CreateMutexA 建立互斥量
    10002FC4.8B95 D4FEFFFFmov edx,dword ptr [ebp-12C]
    10002FCA.8902mov dword ptr [edx],eax
    10002FCC.8B85 D4FEFFFFmov eax,dword ptr [ebp-12C]
    10002FD2.8338 00cmp dword ptr [eax],0;检查CreateMutexA函数是否调用失败
    10002FD5.0F84 CD000000je Core.100030A8;把je改为jmp即可
    10002FDB.FF15 5CE40010call dword ptr [<&KERNEL32.GetLastError>]; [GetLastError
    10002FE1.3D B7000000cmp eax,0B7;检查对象是否已存在
    10002FE6.0F85 BC000000jnz Core.100030A8;(也可以在这里把jnz改为jmp)
    10002FEC.8B8D D4FEFFFFmov ecx,dword ptr [ebp-12C]
    10002FF2.C701 00000000mov dword ptr [ecx],0
    10002FF8.6A 00push 0; /Title = NULL
    10002FFA.68 5CC60010push Core.1000C65C;Class = "QQTangWinClass"
    10002FFF.6A 00push 0;hAfterWnd = NULL
    10003001.6A 00push 0;hParent = NULL
    10003003.FF15 40E70010call dword ptr [<&USER32.FindWindowExA>]; \FindWindowExA 查找QQT窗口 选中这行:
    10002FD5.0F84 CD000000je Core.100030A8
    然后按空格,在弹出的窗口中把“je 100030A8”修改为“jmp 100030A8”,按[汇编]。
    右键单击CPU窗口,在弹出菜单中选“复制到可执行文件”-》“所有改动”,选[全部复制]。右键单击弹出的窗口,选“保存文件”保存即可。 是否觉得上面的修改比较麻烦呢?呵呵,授人于鱼不如授人于渔,上面是告诉你为什么要这样修改,修改的原理是什么,你明白修改原理后,有新版本时你就可以自己修改了。 下面是简单的修改方法:
    用UltraEdit打开Core.dll文件,按Ctrl+G,输入0x2FD5按[确定],把0F84改为90E9即可。 由于作者水平有限,如有错漏,敬请指出 -----------------------------------------------------
    一个费劲点的法子。。。
    先运行游戏,然后可以利用一些软件找到这个游戏调用了哪些文件,例如安全卫士360,看游戏那个进程里加载了哪些模块,一般都是dll文件类型的,是带路径的,不用管windows系统自带的那些,只看哪几个是游戏里的文件;
    再加上游戏的exe文件,需要修改的内容应该只在这些里面;wwW.Y&iJitaO.com

    Q3:嵌入式操作系统中互斥信号量、二值信号量、计数信号量有什么异同

    周慈航 基于嵌入式实时操作系统的程序设计基础 讲得很明白
    他把这个过程比作生产者(释放信号量的任务或ISR)提供(释放)产品(信号量),消费者(等待信号量的任务)消费产品(信号量)
    书上原话+我的理解是,
    互斥信号量:对于一个资源,同一时间只能有一个任务占用
    二值信号量:生产不如消费快,供不应求
    计数信号量:生产者短期内可能生产的产品比较多,造成积压,但这是暂时的

    Q4:互斥量和信号量的区别

    你是说 有多工能耐的电脑作业系统 提供的程式用那些系统物件 咩.
    信号 (Semaphore) 可以计次. 讯号进来几次, 就要需处理几次, 那就要用这个.
    互斥 (Mutex) 不会计次, 就单纯的 有 和 无. 纯粹防止多个程式同时进入, 就用这个就可以了,.

    相关文章
    如何提高孩子的阅读理解能力2019-01-12
    如何理解面向对象思想2019-01-17
    理解为话题的作文600字2019-01-19
    什么是超越自我的理解2019-01-20
    如何理解建设社会主义新农村的意义2019-01-22
    什么是管理 你怎样理解2019-02-02
    理解能力差是智商低吗2019-02-04
    如何提高阅读理解能力2019-02-06
    怎么样来理解英语单词2019-03-09
    考研英语阅读理解150篇2019-03-13