前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# Windows异步I/O操作

C# Windows异步I/O操作

作者头像
郑小超.
发布2019-05-25 18:38:10
7650
发布2019-05-25 18:38:10
举报
文章被收录于专栏:GreenLeavesGreenLeaves

1、简介

关于Windows的异步I/O操作,只要解决的是同步I/O操作的线程利用率问题,通过异步I/O Api来提升线程的利用率,提升系统的吞吐能力,将各种I/O操作交给线程池然后交由硬件设备执行,期间完全不占用线程和CPU资源.

2、同步I/O存在的问题

当编写同步I/O操作时,在硬件设备执行I/O操作的期间,当前线程会等待硬件设备完成执行,所以这个时候主线程处于休眠状态(Windows控制),为了防止主线程浪费CPU时间,但是虽然不浪费时间,它还是会浪费内存!

        static string _filePath = @"C:\Users\zhengchao\Desktop\测试文件.txt";
        static void Main(string[] args)
        {
            //打开目标文件,并进行只读操作(FileAccess.Read文件的操作权限)
            using (var stream = new FileStream(_filePath,FileMode.Open,FileAccess.Read))
            {
                //打开磁盘文件后,先申明一个和流大小一样的字节数组
                var contentBytes = new byte[stream.Length];

                //调用Read方法,当前主线程的托管代码转换为用户模式代码,接着Read会调用Win32 ReadFile函数
                //ReadFile分配一个小的数据结构,即I/O请求包(I/O Request Packet,IRP),IRP结构包含如下内容
                //文件句柄(关于文件句柄,可以在FileStream种给定IntPtr对象实例)
                //文件的偏移量(即你想从那个位置开始读取文件,可在Read方法种给定offset参数)
                //一个Byte数组的地址,即给定Read方法成功读取内容后,需要将内容填充至哪里

                //此时当前主线的托管代码已经转换为用户模式代码,开启向内核传递IRP数据,根据IRP种的设备句柄,Windows
                //知道要将I/O请求传递给哪个硬件设备,因此,Windows知道将IRP传送给对应的设备驱动程序的IRP队列,每个
                //设备驱动程序都维护者自己的IRP队列,其中运行者设备上所有进程发出的I/O请求,接着设备驱动程序会将IRP信息
                //发送给物理设备上安装的电路板,开始执行对应的I/O操作

                //但是,在电路板执行I/O操作的期间,当前线程会等待电路板完成执行,所以这个时候主线程处于休眠状态(Windows控制)
                //为了防止主线程浪费CPU时间,但是虽然不浪费时间,它还是会浪费内存!

                //最后,硬件设备完成I/O操作,Windows会唤起主线程,这个时候内核代码会转变成为托管代码,最后Read方法会拿到
                //一个int32值,该值说明从文件种读取的实际字节数,使你知道在传给Read的byte[]参数时,实际能传递什么值
                var readResult=stream.Read(contentBytes, 0,contentBytes.Length);
                Console.WriteLine(contentBytes.ConvertToString());
            }

            Console.ReadKey();
        }


    }
    public static class ByteExtension
    {
        public static string ConvertToString(this byte[] bytes)
        {
            return Encoding.Default.GetString(bytes);
        }
    }

关于Windows如何执行同步I/O操作的过程,代码种都由说明,但是明显同步的方式,CPU利用率很低.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-03-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档