应用层上的同步原理

来源:互联网 发布:can总线报文数据段 编辑:程序博客网 时间:2024/06/05 23:48

对于内核程序来说,同步和异步是经常用来处理某些请求的。。。

他们的区别在于执行的效率以及执行的方法上。。。

对于应用层上的实现,可以有三个函数吧:

1:ReadFiel()

2:WriteFile()

3:DeviceIoControl()

 

他们都可以来设置不同还是异步的方式,之前的帖子又说道过这个,不过是在内核程序下实现的,现在来说说应用层它是怎么来运行的。

 

还是以DeviceIoControl 为 例子吧:

1:同步的时候:

当函数得到 irp 后, 它会将irp 传到内核, 也就是 irp_mj_device_Control  请求。。

然后内核就回相应这个事件,而这个函数就回等待这个事件被底层完成,并且返回,它才回去做其他的处理,

在这期间,底层的IoCompleteRequest(), 会去调用 WaitForObjectRequset(), 这个函数,

从这里,可见请求的处理方式,以及内核程序的强大。。。

 

2:异步处理:

顾名思义吧,就是各干各的,当我把请求发给你之后,我就不再对你负责了,就像两个对象,分手了,谁还去对你负责呀。。。

比喻而已,呵呵。。。之后,当请求完成时,底层会通知上层这个请求完成。。。

在异步处理的过程中,如果不使用IoCompleteRequest(),那么一定要将此 IRP 出于挂起状态,也就是标记未决,在键盘过滤中

有这样的使用。。。函数是 IoMarkPending(irp);

 

从上边可以容易的看出,异步对于对线程的支持比较强大,效率也是比较高的。。。

同样,在之前对 磁盘还原, 虚拟磁盘的设计,以及 键盘,usb 等的过滤驱动的学习,我感觉,完成函数在处理异步的请求方面

有着非常大的作用。。。

 

对于这些发到底层的请求,内核程序会怎么样去处理呢?

一般来说可以有三种处理方法:

 

1:首先,我来说一下过滤驱动的处理方法吧,毕竟我对这方面是比较感兴趣的。。。

对于过滤驱动而言,拦截时他的首要任务,对于它关系的请求,他当然是不会放过的哦。。。

1)我们可以得到放送下来的请求,然后决定是继续发往下层设备,让底层设备处理,2)当然,我们同样可以直接的返回请求,

那么底层就不知道这回事了,也就达到了过滤,3)我们还可以更改请求信息,达到某些目的,加密,或者对数据进行处理,

防火墙,杀软。。。。他们都是这么做的。。。

 

 

原创粉丝点击