小编Ben*_*igt的帖子

Linux上真的没有异步块I/O吗?

考虑一个受CPU限制的应用程序,但也具有高性能I/O要求.

我正在将Linux文件I/O与Windows进行比较,我看不出epoll将如何帮助Linux程序.内核会告诉我文件描述符"准备好读取",但是我仍然需要调用阻塞read()来获取我的数据,如果我想读取兆字节,那么很明显它会阻塞.

在Windows上,我可以创建一个设置了OVERLAPPED的文件句柄,然后使用非阻塞I/O,并在I/O完成时收到通知,并使用该完成函数中的数据.我需要不花费应用程序级别的挂钟时间等待数据,这意味着我可以精确地将我的线程数调整为我的内核数量,并获得100%的高效CPU利用率.

如果我必须在Linux上模拟异步I/O,那么我必须分配一些线程来执行此操作,并且这些线程将花费一些时间来处理CPU事务,并且大量时间阻塞I/O,此外,在这些线程的消息传递中会有开销.因此,我将过度订阅或利用我的CPU核心.

我把mmap()+ madvise()(WILLNEED)视为"穷人的异步I/O",但它仍然没有完全通过那里,因为当它完成时我无法得到通知 - 我有"猜测",如果我猜"错误",我将最终阻止内存访问,等待数据来自磁盘.

Linux似乎在io_submit中启动了异步I/O,它似乎也有一个用户空间POSIX aio实现,但它已经有一段时间了,我知道没有人会担保这些系统的关键,高性能的应用程序.

Windows模型的工作方式大致如下:

  1. 发出异步操作.
  2. 将异步操作绑定到特定的I/O完成端口.
  3. 等待该端口上的操作完成
  4. 当I/O完成时,等待端口的线程解除阻塞,并返回对挂起的I/O操作的引用.

步骤1/2通常作为单个事物完成.步骤3/4通常使用工作线程池完成,而不是(必要)与发出I/O相同的线程.这个模型有点类似于boost :: asio提供的模型,除了boost :: asio实际上不会给你异步的基于块的(磁盘)I/O.

Linux中epoll的不同之处在于,在步骤4中,还没有I/O发生 - 它会在步骤4之后提升第1步,如果你确切知道你需要的话,那就是"向后".

编写了大量的嵌入式,桌面和服务器操作系统之后,我可以说这种异步I/O模型对于某些类型的程序来说非常自然.它还具有非常高的吞吐量和低开销.我认为这是Linux I/O模型在API级别上仍然存在的真正缺点之一.

linux posix asynchronous overlapped-io

25
推荐指数
3
解决办法
1万
查看次数

什么是好的CSS策略?

我们有一个庞大的ASP.Net网站,它有一个失控的单一css样式表.

我正在考虑使用以下策略(取自http://www.techrepublic.com/article/developing-a-css-strategy/5437796/),这对我而言似乎合乎逻辑......

您可能有一个专门用于站点范围样式的CSS文件和用于可识别的站点页面子集的CSS文件(例如特定部门的页面或具有不同布局样式的页面).对于特定页面特有的样式,请为每个页面使用单独的CSS文件(如果样式太多而无法轻松放入文档标题中).您链接或导入每个页面的相应CSS文件,以便您加载显示该页面所需的所有样式,但很少有不必要的样式只出现在其他页面上.

这是一个很好的方法吗?有哪些替代方案?

css

24
推荐指数
3
解决办法
6339
查看次数

为什么本地类中不允许使用静态数据成员?

为什么static const成员不能在本地课程中存在的原因是什么?这似乎是一个相当愚蠢的限制.

例:

void foo() {
  struct bar {
    int baz() { return 0; }   // allowed
    static const int qux = 0; // not allowed?!?
  };
}

struct non_local_bar {
  int baz() { return 0; }   // allowed
  static const int qux = 0; // allowed
};
Run Code Online (Sandbox Code Playgroud)

从标准报价(9.8.4):

本地类不应具有静态数据成员.

c++ static static-members local-class

24
推荐指数
2
解决办法
7203
查看次数

在没有双精度类型的C编译器上解析双精度IEEE浮点

我正在使用8位AVR芯片.64位double没有数据类型(double只映射到32位float).但是,我将通过Serial接收64位双精度数,并且需要在Serial上输出64位双精度数.

如何在不进行转换的情况下将64位双精度转换为32位浮点数并再次返回?32位和64位的格式都遵循IEEE 754.当然,我假设转换为32位浮点时精度会下降.

为了从64位转换为32位浮点数,我正在尝试这样做:

// Script originally from http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1281990303
float convert(uint8_t *in) {
  union {
    float real;
    uint8_t base[4];
  } u;
  uint16_t expd = ((in[7] & 127) << 4) + ((in[6] & 240) >> 4);
  uint16_t expf = expd ? (expd - 1024) + 128 : 0;
  u.base[3] = (in[7] & 128) + (expf >> 1);
  u.base[2] = ((expf & 1) << 7) + ((in[6] & 15) << 3) + ((in[5] & 0xe0) >> 5);
  u.base[1] = ((in[5] & …
Run Code Online (Sandbox Code Playgroud)

c c++ casting avr

23
推荐指数
1
解决办法
2341
查看次数

auto foo = ref new Foo(); 什么是"参考"?

我正在观看来自// build /的视频,并且有几位MS开发人员在他们的C++ 11程序中使用了这样的语法:

auto foo = ref new Foo();
Run Code Online (Sandbox Code Playgroud)

我理解除了"ref"之外,这一行中所做的一切.那是什么意思?

c++ windows-runtime c++-cx

23
推荐指数
2
解决办法
5952
查看次数

路径前缀\ ?? \和\\?\

前缀路径\??\和前缀路径之间有什么区别\\?\

在Windows 7 CMD-Line

  • DIR给出: \??\Volume{00000000-0000-0000-0000-000000000000}\
  • WMIC VOLUME LIST给出 \\?\Volume{00000000-0000-0000-0000-000000000000}\

谢谢

附加信息:
我在系统驱动器上创建了一个目录,我将所有挂载点放入其中.所以我做了MD C:\HDDs第一个,然后是a MD C:\HDD\Drive1,MD C:\HDD\Drive2...为我所有的驱动器.在这些空目录上安装驱动器后,我可以通过切换到该目录CD /D C:\HDDs并发出DIR命令来查看GUID .也许我必须发出一个DIR /ah显示隐藏的东西,以防挂载点是隐藏目录...

windows winapi cmd batch-file

22
推荐指数
1
解决办法
3675
查看次数

System.IO.FileStream FileAccess vs FileShare

我已经搜遍过,但找不到这个问题的答案.据我所知,FileAccess处理机器上的文件访问,FileShare处理共享,但我无法找到它是如何组合以及它们如何相互影响的解释.

例如,如果我有

using ( FileStream fs = new FileStream( pathName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) )
Run Code Online (Sandbox Code Playgroud)

这是否意味着机器上的用户只能读取文件,而远程访问该文件夹的用户可以读取和写入文件?此外,使用会产生什么影响

using ( FileStream fs = new FileStream( pathName, FileMode.Open, FileAccess.Read ) )
Run Code Online (Sandbox Code Playgroud)

我还没有指定FileShare?

c# filestream

22
推荐指数
1
解决办法
1万
查看次数

如何读取/写入二进制文件中的结构?

我正面临一个小问题.我有一个结构,它有一个向量.请注意,向量在每次迭代时都是动态的.现在,在特定的迭代中,如何将包含大小为n的向量的结构存储到二进制文件中?

另外,在检索时,假设我知道向量的大小,如何从二进制文件中检索,包含所有存储元素的向量的struct变量?

我可以将内容存储到二进制文件中(因为我可以看到写入时大小增加),但是当我尝试检索元素时,我将向量的大小设置为零.

不幸的是,我必须使用标准STL来实现这一点,而不是使用任何第三方库.

c++ struct binaryfiles vector

21
推荐指数
2
解决办法
6万
查看次数

GotW#101"解决方案"实际上解决了什么问题吗?

首先阅读Herb's Sutters GotW关于C++ 11中pimpl的帖子:

我在理解GotW#101中提出的解决方案时遇到了一些麻烦.据我所知,在GotW#100中辛苦解决的所有问题都复仇了:

  • pimpl成员是外的线的模板,并且定义并不在使用点可见(在class widget的类定义和隐式生成的特殊成员函数widget).也没有任何明确的实例化.这将导致链接期间未解决的外部错误.

  • widget::impl实例化定义的点上仍然是不完整的(我认为它实际上根本没有pimpl<widget::impl>::~pimpl()实例化,只是被引用).因此std::unique_ptr<widget::impl>::~unique_ptr()调用delete指向不完整类型的指针,如果widget::impl有一个非平凡的析构函数,则会产生未定义的行为.

请解释是什么迫使编译器在widget::impl完成的上下文中生成特殊成员.因为我看不出它是如何工作的.


如果GotW#101仍然需要widget::~widget()在实现文件中明确定义,哪里widget::impl完成,那么请解释"更健壮"的评论(@sehe在他的答案中引用).

我看的GotW#101的核心要求是,包装"消除样板的一些作品",这在我看来(基于该段的其余部分)来表示的widget::~widget()声明和定义.所以请不要依赖于你的答案,在GotW#101中,那已经消失了!


Herb,如果你停下来,请告诉我是否可以在这里剪切+粘贴解决方案代码以供参考.

c++ pimpl-idiom incomplete-type c++11 gotw

21
推荐指数
2
解决办法
1856
查看次数

为什么短路不能阻止与逻辑AND(&&)的不可达分支相关的MissingMethodException?

在检查我的Windows移动设备上是否有摄像头并启用时,我遇到了一些我不理解的东西.

代码如下所示:

    public static bool CameraP(){

        return Microsoft.WindowsMobile.Status.SystemState.CameraPresent;
    }

    public static bool CameraE()
    {
        return Microsoft.WindowsMobile.Status.SystemState.CameraEnabled;
    }

    public static bool CameraPresent1()
    {
        return Microsoft.WindowsMobile.Status.SystemState.CameraPresent
              && Microsoft.WindowsMobile.Status.SystemState.CameraEnabled;
    }

    public static bool CameraPresent2()
    {
        return CameraP() && CameraE();
    }
Run Code Online (Sandbox Code Playgroud)

当我调用CameraPresent2()它时返回false(没有相机存在).但是,当我打电话给CameraPresent1()我收到一个MissingMethodException并注释"找不到方法:get_CameraEnabled Microsoft.WindowsMo​​bile.Status.SystemState."

第二个术语的评估CameraPresent1是因为它们都是属性(在语言层面)吗?

还有什么能解释行为上的差异吗?

c# compact-framework short-circuiting

20
推荐指数
3
解决办法
793
查看次数