考虑一个受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通常作为单个事物完成.步骤3/4通常使用工作线程池完成,而不是(必要)与发出I/O相同的线程.这个模型有点类似于boost :: asio提供的模型,除了boost :: asio实际上不会给你异步的基于块的(磁盘)I/O.
Linux中epoll的不同之处在于,在步骤4中,还没有I/O发生 - 它会在步骤4之后提升第1步,如果你确切知道你需要的话,那就是"向后".
编写了大量的嵌入式,桌面和服务器操作系统之后,我可以说这种异步I/O模型对于某些类型的程序来说非常自然.它还具有非常高的吞吐量和低开销.我认为这是Linux I/O模型在API级别上仍然存在的真正缺点之一.
我们有一个庞大的ASP.Net网站,它有一个失控的单一css样式表.
我正在考虑使用以下策略(取自http://www.techrepublic.com/article/developing-a-css-strategy/5437796/),这对我而言似乎合乎逻辑......
您可能有一个专门用于站点范围样式的CSS文件和用于可识别的站点页面子集的CSS文件(例如特定部门的页面或具有不同布局样式的页面).对于特定页面特有的样式,请为每个页面使用单独的CSS文件(如果样式太多而无法轻松放入文档标题中).您链接或导入每个页面的相应CSS文件,以便您加载显示该页面所需的所有样式,但很少有不必要的样式只出现在其他页面上.
这是一个很好的方法吗?有哪些替代方案?
为什么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):
本地类不应具有静态数据成员.
我正在使用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) 我正在观看来自// build /的视频,并且有几位MS开发人员在他们的C++ 11程序中使用了这样的语法:
auto foo = ref new Foo();
Run Code Online (Sandbox Code Playgroud)
我理解除了"ref"之外,这一行中所做的一切.那是什么意思?
前缀路径\??\和前缀路径之间有什么区别\\?\
在Windows 7 CMD-Line
\??\Volume{00000000-0000-0000-0000-000000000000}\ \\?\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显示隐藏的东西,以防挂载点是隐藏目录...
我已经搜遍过,但找不到这个问题的答案.据我所知,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?
我正面临一个小问题.我有一个结构,它有一个向量.请注意,向量在每次迭代时都是动态的.现在,在特定的迭代中,如何将包含大小为n的向量的结构存储到二进制文件中?
另外,在检索时,假设我知道向量的大小,如何从二进制文件中检索,包含所有存储元素的向量的struct变量?
我可以将内容存储到二进制文件中(因为我可以看到写入时大小增加),但是当我尝试检索元素时,我将向量的大小设置为零.
不幸的是,我必须使用标准STL来实现这一点,而不是使用任何第三方库.
首先阅读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,如果你停下来,请告诉我是否可以在这里剪切+粘贴解决方案代码以供参考.
在检查我的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.WindowsMobile.Status.SystemState."
第二个术语的评估CameraPresent1是因为它们都是属性(在语言层面)吗?
还有什么能解释行为上的差异吗?
c++ ×5
c# ×2
asynchronous ×1
avr ×1
batch-file ×1
binaryfiles ×1
c ×1
c++-cx ×1
c++11 ×1
casting ×1
cmd ×1
css ×1
filestream ×1
gotw ×1
linux ×1
local-class ×1
pimpl-idiom ×1
posix ×1
static ×1
struct ×1
vector ×1
winapi ×1
windows ×1