- 浏览: 265379 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (298)
- 工作感悟 (6)
- java基础 (23)
- 计算机硬件知识 (1)
- 计算机网络知识 (2)
- Struts (3)
- Srping (4)
- hibernate (0)
- ibatis (0)
- webservice (4)
- Thread (22)
- maven (5)
- ubuntu/linux/centos/redhat (46)
- SSO (1)
- ESB (0)
- 工作流 (0)
- oracle (15)
- 云计算 (1)
- hadoop (1)
- nosql (0)
- mysql (3)
- sqlserver (0)
- jquery (0)
- 分布式 (3)
- 集群 (0)
- 设计模式 (2)
- EJB (0)
- map (0)
- cache (5)
- Niginx+varnish+squid+Ats (14)
- Apache (0)
- 工作/职业规划 (0)
- Scala & Groovy (1)
- English (4)
- 数据结构/算法 (6)
- 开发工具 (5)
- 测试 (2)
- Exception (0)
- 定时器 (3)
- j2ee (2)
- 部署 (1)
- Openssl (1)
- 操作系统 (3)
- kvm (13)
- libvirt (5)
- PostgreSql (5)
- 虚拟化 (3)
- 概念理解 (1)
- virt-manager (1)
- RESTful (3)
- 其它 (4)
- ssh2 (14)
- windows (1)
- 房产 (2)
- svn (1)
- 手机 (1)
- ant (1)
- flume (2)
- sqoop (1)
- fastdfs (5)
- log4j (1)
- SPDY (1)
- mongodb (2)
- MQ (2)
- Mina (1)
- dubbo (4)
- PMP (1)
- Webshpere (2)
- jvm (1)
- Btrace (1)
- zookeeper (7)
- UML (1)
- spring cloud (6)
- spring boot (5)
- storm (0)
- 软件管理 (1)
- elasticsearch (1)
- 协议 (2)
- docker (1)
- 性能 (2)
- 安全 (1)
- 代码规范 (1)
- mqtt (1)
- lombok (1)
- 车联网 (1)
- kafka (1)
最新评论
1. 什么是Monitor?
Monitor其实是一种同步工具,也可以说是一种同步机制,它通常被描述为一个对象,主要特点是:
对象的所有方法都被“互斥”的执行。好比一个Monitor只有一个运行“许可”,任一个线程进入任何一个方法都需要获得这个“许可”,离开时把许可归还。
通常提供singal机制:允许正持有“许可”的线程暂时放弃“许可”,等待某个谓词成真(条件变量),而条件成立后,当前进程可以“通知”正在等待这个条件变量的线程,让他可以重新去获得运行许可。
Monitor对象可以被多线程安全地访问。关于“互斥”与“为什么要互斥”,我就不傻X兮兮解释了;而关于Monitor的singal机制,历史上曾经出现过两大门派,分别是Hoare派和Mesa派(上过海波老师OS课的SS同学应该对这个有印象),我还是用我的理解通俗地庸俗地解释一下:
Hoare派的singal机制江湖又称“Blocking condition variable”,特点是,当“发通知”的线程发出通知后,立即失去许可,并“亲手”交给等待者,等待者运行完毕后再将许可交还通知者。在这种机制里,可以等待者拿到许可后,谓词肯定为真——也就是说等待者不必再次检查条件成立与否,所以对条件的判断可以使用“if”,不必“while”
Mesa派的signal机制又称“Non-Blocking condition variable”, 与Hoare不同,通知者发出通知后,并不立即失去许可,而是把闻风前来等待者安排在ready queue里,等到schedule时有机会去拿到“许可”。这种机制里,等待者拿到许可后不能确定在这个时间差里是否有别的等待者进入过Monitor,因此不能保证谓词一定为真,所以对条件的判断必须使用“while”
这两种方案可以说各有利弊,但Mesa派在后来的盟主争夺中渐渐占了上风,被大多数实现所采用,有人给这种signal另外起了个别名叫“notify”,想必你也知道,Java采取的就是这个机制。
2. Monitor与Java不得不说的故事
子曰:“Java对象是天生的Monitor。”每一个Java对象都有成为Monitor的“潜质”。这是为什么?因为在Java的设计中,每一个对象自打娘胎里出来,就带了一把看不见的锁,通常我们叫“内部锁”,或者“Monitor锁”,或者“Intrinsic lock”。为了装逼起见,我们就叫它Intrinsic lock吧。有了这个锁的帮助,只要把类的所有对象方法都用synchronized关键字修饰,并且所有域都为私有(也就是只能通过方法访问对象状态),就是一个货真价实的Monitor了。比如,我们举一个大俗例吧:
3. synchronized关键字
上面我们已经看到synchronized的一种用法,用来修饰方法,表示进入该方法需要对Intrinsic lock加锁,离开时放锁。synchronized可以用在程序块中,显示说明对“哪个对象的Intrinsic lock加锁”,比如
这时,你可能就要问了,你不是说任何对象都有intrinsic lock么?而synchronized关键字又可以显示指定去锁谁,那我们是不是可以这样做:
不用this的内部锁,而是用另外任意一个对象的内部锁来完成完全相同的任务?没错,完全可以。不过,需要注意的是,这时候,你实际上禁止了“客户代码加锁”的行为。前几天BBS上简哥有一贴提到的bug其实就是这个,这个时候使用这份代码的客户程序如果想当然地认为Account的同步是基于其内部锁的,并且傻X兮兮地写了类似下面的代码:
自认为后面的同步快对account加了锁,期间的操作不会被其余通过Account方法操作account对象的线程所干扰,那就太悲剧了。因为他们并不相干,锁住了不同的锁。
4. Java中的条件变量
正如我们前面所说,Java采取了wait/notify机制来作为intrinsic lock 相关的条件变量,表示为等待某一条件成立的条件队列——说到这里顺带插一段,条件队列必然与某个锁相关,并且语义上关联某个谓词(条件队列、锁、条件谓词就是吉祥的一家)。所以,在使用wait/notify方法时,必然是已经获得相关锁了的,在进一步说,一个推论就是“wait/notify 方法只能出现在相应的同步块中”。如果不呢?就像下面一段(notify表示的谓词是“帐户里有钱啦~”):
这两段都是错的,第一段没有在同步块里,而第二段拿到的是lock的内部锁,调用的却是this.notify(),让人遗憾。运行时他们都会抛IllegalMonitorStateException异常——唉,想前一阵我参加一次笔试的时候,有一道题就是这个,让你选所给代码会抛什么异常,我当时就傻了,想这考得也太偏了吧,现在看看,确实是很基本的概念,当初被虐是压根没有理解wait/notify机制的缘故。那怎么写是对的呢?
5.这就够了吗?
看上去,Java的内部锁和wait/notify机制已经可以满足任何同步需求了,不是吗?em…可以这么说,但也可以说,不那么完美。有两个问题:
锁不够用
有时候,我们的类里不止有一个状态,这些状态是相互独立的,如果只用同一个内部锁来维护他们全部,未免显得过于笨拙,会严重影响吞吐量。你马上会说,你刚才不是演示了用任意一个Object来做锁吗?我们多整几个Object分别加锁不就行了吗?没错,是可行的。但这样可能显得有些丑陋,而且Object来做锁本身就有语义不明确的缺点。
条件变量不够用
Java用wait/notify机制实际上默认给一个内部锁绑定了一个条件队列,但是,有时候,针对一个状态(锁),我们的程序需要两个或以上的条件队列,比如,刚才的Account例子,如果某个2B银行有这样的规定“一个账户存款不得多于10000元”,这个时候,我们的存钱需要满足“余额+要存的数目不大于10000,否则等待,直到满足这个限制”,取钱需要满足“余额足够,否则等待,直到有钱为止”,这里需要两个条件队列,一个等待“存款不溢出”,一个等待“存款足够”,这时,一个默认的条件队列够用么?你可能又说,够用,我们可以模仿network里的“多路复用”,一个队列就能当多个来使,像这样:
不是挺好吗?恩,没错,是可以。但是,仍然存在性能上的缺陷:每次都有多个线程被唤醒,而实际只有一个会运行,频繁的上下文切换和锁请求是件很废的事情。我们能不能不要notifyAll,而每次只用notify(只唤醒一个)呢?不好意思,想要“多路复用”,就必须notifyAll,否则会有丢失信号之虞(不解释了)。只有满足下面两个条件,才能使用notify:
一,只有一个条件谓词与条件队列相关,每个线程从wait返回执行相同的逻辑。
二,一进一出:一个对条件变量的通知,语义上至多只激活一个线程。
我又想插播一段:刚才写上面那段代码,IDE提示抛InterruptedException,我想提一下,这是因为wait是一个阻塞方法,几乎所有阻塞方法都会声明可能抛InterruptedException,这是和Java的interrupt机制有关的,以后我们有机会再说。
既然这么做不优雅不高效不亚 克西,那如之奈何?Java提供了其他工具吗?是的。这就是传说中的java.util.concurrency包里的故事,今天也不说了,有机会在和大家讨论。
Monitor其实是一种同步工具,也可以说是一种同步机制,它通常被描述为一个对象,主要特点是:
对象的所有方法都被“互斥”的执行。好比一个Monitor只有一个运行“许可”,任一个线程进入任何一个方法都需要获得这个“许可”,离开时把许可归还。
通常提供singal机制:允许正持有“许可”的线程暂时放弃“许可”,等待某个谓词成真(条件变量),而条件成立后,当前进程可以“通知”正在等待这个条件变量的线程,让他可以重新去获得运行许可。
Monitor对象可以被多线程安全地访问。关于“互斥”与“为什么要互斥”,我就不傻X兮兮解释了;而关于Monitor的singal机制,历史上曾经出现过两大门派,分别是Hoare派和Mesa派(上过海波老师OS课的SS同学应该对这个有印象),我还是用我的理解通俗地庸俗地解释一下:
Hoare派的singal机制江湖又称“Blocking condition variable”,特点是,当“发通知”的线程发出通知后,立即失去许可,并“亲手”交给等待者,等待者运行完毕后再将许可交还通知者。在这种机制里,可以等待者拿到许可后,谓词肯定为真——也就是说等待者不必再次检查条件成立与否,所以对条件的判断可以使用“if”,不必“while”
Mesa派的signal机制又称“Non-Blocking condition variable”, 与Hoare不同,通知者发出通知后,并不立即失去许可,而是把闻风前来等待者安排在ready queue里,等到schedule时有机会去拿到“许可”。这种机制里,等待者拿到许可后不能确定在这个时间差里是否有别的等待者进入过Monitor,因此不能保证谓词一定为真,所以对条件的判断必须使用“while”
这两种方案可以说各有利弊,但Mesa派在后来的盟主争夺中渐渐占了上风,被大多数实现所采用,有人给这种signal另外起了个别名叫“notify”,想必你也知道,Java采取的就是这个机制。
2. Monitor与Java不得不说的故事
子曰:“Java对象是天生的Monitor。”每一个Java对象都有成为Monitor的“潜质”。这是为什么?因为在Java的设计中,每一个对象自打娘胎里出来,就带了一把看不见的锁,通常我们叫“内部锁”,或者“Monitor锁”,或者“Intrinsic lock”。为了装逼起见,我们就叫它Intrinsic lock吧。有了这个锁的帮助,只要把类的所有对象方法都用synchronized关键字修饰,并且所有域都为私有(也就是只能通过方法访问对象状态),就是一个货真价实的Monitor了。比如,我们举一个大俗例吧:
public class Account { private int balance; public Account(int balance) { this.balance = balance; } synchronized public boolean withdraw(int amount){ if(balance<amount) return false; balance -= amount; return true; } synchronized public void deposit(int amount){ balance +=amount; } }
3. synchronized关键字
上面我们已经看到synchronized的一种用法,用来修饰方法,表示进入该方法需要对Intrinsic lock加锁,离开时放锁。synchronized可以用在程序块中,显示说明对“哪个对象的Intrinsic lock加锁”,比如
synchronized public void deposit(int amount){ balance +=amount; } // 等价于 public void deposit(int amount){ synchronized(this){ balance +=amount; } }
这时,你可能就要问了,你不是说任何对象都有intrinsic lock么?而synchronized关键字又可以显示指定去锁谁,那我们是不是可以这样做:
public class Account { private int balance; private Object lock = new Object(); public Account(int balance) { this.balance = balance; } public boolean withdraw(int amount){ synchronized (lock) { if(balance<amount) return false; balance -= amount; return true; } } public void deposit(int amount){ synchronized (lock) { balance +=amount; } } }
不用this的内部锁,而是用另外任意一个对象的内部锁来完成完全相同的任务?没错,完全可以。不过,需要注意的是,这时候,你实际上禁止了“客户代码加锁”的行为。前几天BBS上简哥有一贴提到的bug其实就是这个,这个时候使用这份代码的客户程序如果想当然地认为Account的同步是基于其内部锁的,并且傻X兮兮地写了类似下面的代码:
public static void main(String[] args) { Account account =new Account(1000); //some threads modifying account through Account’s methods... synchronized (account) { ;//blabla } }
自认为后面的同步快对account加了锁,期间的操作不会被其余通过Account方法操作account对象的线程所干扰,那就太悲剧了。因为他们并不相干,锁住了不同的锁。
4. Java中的条件变量
正如我们前面所说,Java采取了wait/notify机制来作为intrinsic lock 相关的条件变量,表示为等待某一条件成立的条件队列——说到这里顺带插一段,条件队列必然与某个锁相关,并且语义上关联某个谓词(条件队列、锁、条件谓词就是吉祥的一家)。所以,在使用wait/notify方法时,必然是已经获得相关锁了的,在进一步说,一个推论就是“wait/notify 方法只能出现在相应的同步块中”。如果不呢?就像下面一段(notify表示的谓词是“帐户里有钱啦~”):
public void deposit(int amount){ balance +=amount; notify(); } //或者这样: public void deposit(int amount){ synchronized (lock) { balance +=amount; notify(); } }
这两段都是错的,第一段没有在同步块里,而第二段拿到的是lock的内部锁,调用的却是this.notify(),让人遗憾。运行时他们都会抛IllegalMonitorStateException异常——唉,想前一阵我参加一次笔试的时候,有一道题就是这个,让你选所给代码会抛什么异常,我当时就傻了,想这考得也太偏了吧,现在看看,确实是很基本的概念,当初被虐是压根没有理解wait/notify机制的缘故。那怎么写是对的呢?
public void deposit(int amount){ synchronized (lock) { balance +=amount; lock.notify(); } } //或者(取决于你采用的锁): synchronized public void deposit(int amount){ balance +=amount; notify(); }
5.这就够了吗?
看上去,Java的内部锁和wait/notify机制已经可以满足任何同步需求了,不是吗?em…可以这么说,但也可以说,不那么完美。有两个问题:
锁不够用
有时候,我们的类里不止有一个状态,这些状态是相互独立的,如果只用同一个内部锁来维护他们全部,未免显得过于笨拙,会严重影响吞吐量。你马上会说,你刚才不是演示了用任意一个Object来做锁吗?我们多整几个Object分别加锁不就行了吗?没错,是可行的。但这样可能显得有些丑陋,而且Object来做锁本身就有语义不明确的缺点。
条件变量不够用
Java用wait/notify机制实际上默认给一个内部锁绑定了一个条件队列,但是,有时候,针对一个状态(锁),我们的程序需要两个或以上的条件队列,比如,刚才的Account例子,如果某个2B银行有这样的规定“一个账户存款不得多于10000元”,这个时候,我们的存钱需要满足“余额+要存的数目不大于10000,否则等待,直到满足这个限制”,取钱需要满足“余额足够,否则等待,直到有钱为止”,这里需要两个条件队列,一个等待“存款不溢出”,一个等待“存款足够”,这时,一个默认的条件队列够用么?你可能又说,够用,我们可以模仿network里的“多路复用”,一个队列就能当多个来使,像这样:
public class Account { public static final int BOUND = 10000; private int balance; public Account(int balance) { this.balance = balance; } synchronized public boolean withdraw(int amount) throws InterruptedException{ while(balance<amount) wait();// no money, wait balance -= amount; notifyAll();// not full, notify return true; } synchronized public void deposit(int amount) throws InterruptedException{ while(balance+amount >BOUND) wait();//full, wait balance +=amount; notifyAll();// has money, notify } }
不是挺好吗?恩,没错,是可以。但是,仍然存在性能上的缺陷:每次都有多个线程被唤醒,而实际只有一个会运行,频繁的上下文切换和锁请求是件很废的事情。我们能不能不要notifyAll,而每次只用notify(只唤醒一个)呢?不好意思,想要“多路复用”,就必须notifyAll,否则会有丢失信号之虞(不解释了)。只有满足下面两个条件,才能使用notify:
一,只有一个条件谓词与条件队列相关,每个线程从wait返回执行相同的逻辑。
二,一进一出:一个对条件变量的通知,语义上至多只激活一个线程。
我又想插播一段:刚才写上面那段代码,IDE提示抛InterruptedException,我想提一下,这是因为wait是一个阻塞方法,几乎所有阻塞方法都会声明可能抛InterruptedException,这是和Java的interrupt机制有关的,以后我们有机会再说。
既然这么做不优雅不高效不亚 克西,那如之奈何?Java提供了其他工具吗?是的。这就是传说中的java.util.concurrency包里的故事,今天也不说了,有机会在和大家讨论。
发表评论
-
Java通过Executors提供四种线程池
2017-09-27 10:21 468Java通过Executors提供四种线程池,分别为: new ... -
并发线程组件 Amino
2013-07-23 13:29 695Amino CBB (Concurrent Building ... -
Java多线程之Semaphore
2013-07-17 16:12 582import java.util.ArrayL ... -
ThreadLocal的介绍(利用变量副本实现多线程访问同一变量)
2013-07-17 14:20 803早在Java 1.2推出之时,Ja ... -
ThreadGroup其实比ExecutorService更好
2013-07-17 13:32 702用java做抓取的时候免不了要用到多线程的了,因为要同时抓取多 ... -
Java多线程同步器
2013-07-12 17:00 860CyclcBarrier 在实际应用中,有时候需要多个线程 ... -
Java Thread.interrupt 害人! 中断JAVA线程
2013-07-12 16:37 768程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难 ... -
Java多线程学习——Condition的使用
2013-07-12 14:36 835Condition 将 Object 监视器方法(wait、n ... -
java多线程设计wait
2013-07-12 14:30 694在Java中,这个机制的实 ... -
处理 子线程的返回值
2013-07-08 14:19 860package com.jimmy.Thread.Conc ... -
ExecutorService的execute和submit方法
2013-07-05 17:21 1033因为之前一直是用的exec ... -
Exchanger-兄弟线程的信息交换
2013-07-05 16:23 697如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使 ... -
lockInterruptibly 和lock的区别
2013-06-26 16:36 886lockInterruptibly 与 lock比较区别在于 ... -
慎重使用volatile关键字
2013-06-26 11:10 743volatile关键字相信了解Java多线程的读者都很清楚它的 ... -
对synchronized(this)的一些理解
2013-06-26 10:18 674一、当两个并发线程访问同一个对象object中的这个synch ... -
java中的lock和synchronized区别
2013-06-26 10:02 5901、ReentrantLock 拥有Synchronized相 ... -
线程sleep,join,yield的区别
2013-06-21 17:37 5141.sleep() 使当前线程(即调用该方法的线程)暂停执行 ... -
初学Java多线程:慎重使用volatile关键字
2013-02-25 15:18 694学习Java多线程中会遇到使用volatile关键字的情况。v ... -
java之yield(),sleep(),wait()区别详解-备忘笔记
2013-02-25 14:32 6331、sleep() 使当前线程(即调用该方法的线程)暂停执行 ... -
Java Thread join() 的用法
2013-02-25 13:24 587Java Thread中, join() 方法主要是让调用改方 ...
相关推荐
"Monitor Monitor Monitor"是一款强大的驱动加载工具,专为IT专业人士设计,用于管理和优化系统的硬件驱动程序。这款工具在行业中获得了广泛的认可,因其高效、稳定和易用性而备受好评。下面我们将深入探讨这款工具...
【标题】:“power monitor驱动文件”是计算机硬件监控的重要组件,它主要负责监测系统的电源状态,包括功耗、电流等关键参数。在计算机系统中,驱动程序是硬件设备与操作系统之间的桥梁,允许操作系统与硬件进行...
标题 "ProcessMonitor.zip" 暗示我们关注的是一个与 Process Monitor 相关的压缩文件。Process Monitor 是微软出品的一款强大的系统监控工具,用于实时跟踪系统事件,包括文件系统、注册表、进程线程以及网络活动等...
《SQLMonitor:Oracle数据库SQL跟踪与分析利器》 在IT行业中,数据库的高效管理与优化是至关重要的。针对Oracle数据库,有一款名为SQLMonitor的工具,它专为跟踪和监控SQL语句而设计,帮助开发者和DBA们找出程序...
SQL Monitor是一款专为SQL Server设计的强大监控工具,它旨在帮助管理员实时了解数据库系统的健康状态、性能指标以及活动情况。这款工具能够提供全面的洞察力,确保SQL Server的稳定运行,及时发现并解决潜在问题,...
Process Monitor 是windows下高级实时监听工具,用于监视文件系统、注册表、进程和线程的活动。它兼并了两个Sysinternals实用工具Filemon和Regmon的特点,并且增加了一系列的扩展包括丰富而无干扰的过滤全面的事件...
《深入理解serial-monitor串口监控》 在现代电子设备和嵌入式系统开发中,串口通信扮演着至关重要的角色。它是一种简单而实用的数据传输方式,尤其在调试和测试阶段,通过串口监控工具可以实时查看设备间的通信数据...
API Monitor是一款功能强大的API监视工具,它被广泛用于软件开发者和系统管理员,以跟踪和调试应用程序与系统级接口之间的交互。这款工具适用于Windows操作系统,包括x86和x64架构,确保了对32位和64位程序的全面...
《FileMonitor文件变化实时监控工具:深入解析与应用》 在IT行业中,对文件系统的监控是一项至关重要的任务,特别是在代码审计、黑盒测试和白盒审计等场景下。FileMonitor是一款专为此目的设计的高效工具,它能够...
"Source Monitor"是一款强大的源代码分析工具,它主要用于帮助开发者理解、管理和优化他们的代码库。这款工具提供了丰富的功能,其中包括了对代码圈复杂度的检测。 **源码监控工具——Source Monitor** Source ...
**ProcessMonitor**,在Windows 7环境下,是一个不可或缺的系统监控神器。由Sysinternals开发,现已成为Microsoft Windows工具集的一部分。它提供了极其详细的实时监控功能,帮助用户深入理解系统的运行状态,查找并...
SQLTracker和SQLMonitor是两款专为数据库管理人员设计的高效工具,用于监视和分析SQL语句的执行情况。在IT行业中,特别是在数据库管理领域,理解并优化SQL查询性能至关重要,因为这直接影响到系统的整体效率和响应...
**源码分析与度量工具SourceMonitor** SourceMonitor是一款广受欢迎的代码检查工具,专为开发者设计,用于度量和分析源代码的复杂性。它支持多种编程语言,包括但不限于C、C++、C#、Java、VB.NET、JavaScript、PHP...
打开HostMonitor注册机,然后在下拉列表中选择:host monitor 下面填写域名,如:www.baidu.com 然后单击Generate,即可获取注册码 注册方法: 打开hostMonitor,单击help--license.., 在打开的窗口中单击register...
HostMonitor是一款强大的系统监控工具,主要用于企业级网络和服务器的性能监控。它的最新版本是9.9,这个版本包含了各种改进和新特性,以提供更高效、更全面的监控解决方案。在描述中提到的"hostmonitor2015最新版...
TrafficMonitor是一款功能强大的网速显示工具,主要用于实时监控用户的网络流量使用情况。它可以在桌面或者任务栏上以直观的方式展示上传、下载速度以及已使用的总流量等信息,为用户提供了便捷的网络监控体验。 在...
### Hostmonitor监控Windows系统配置及迁移步骤 #### 一、概述 在IT运维工作中,确保系统的稳定性和可靠性至关重要。Hostmonitor作为一款强大的监控工具,能够有效地监控网络连通性,并通过邮件等方式进行报警通知...
【Dubbo Monitor Simple】是Dubbo框架中的一个关键组件,主要功能是提供服务监控与管理。Dubbo是一款高性能、轻量级的开源Java RPC框架,它由阿里巴巴开发并维护,旨在提高服务治理的效率和质量。Monitor Simple是...
### 使用Windows系统Performance Monitor监控进程性能 #### 一、引言 在现代计算机环境中,确保应用程序及系统的稳定性和性能至关重要。Microsoft Windows操作系统提供了一个强大的工具——Performance Monitor...
Process Monitor是Windows的高级监视工具,可显示实时文件系统,注册表和进程/线程活动。它结合了两个旧的Sysinternals实用程序Filemon和 Regmon的功能,并添加了广泛的增强功能列表,包括丰富的和非破坏性的过滤,...