小编Hon*_*gli的帖子

scrypt比bcrypt有什么好处?

我正在寻找安全存储密码的方法.有些人声称scrypt比bcrypt"更好",到目前为止,我看到没有人声称反之亦然,或者scrypt是不安全的,尽管有些人称之为"更有信誉".

scrypt比bcrypt有什么好处?根据scrypt网站的说法,"针对scrypt的硬件暴力攻击的成本大约是针对bcrypt的类似攻击的成本的4000倍".如果这是唯一的优势,那么我不能只使用更多轮次的bcrypt?

security bcrypt

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

一种确定进程"真实"内存使用情况的方法,即私有脏RSS?

像'ps'和'top'这样的工具会报告各种内存使用情况,例如VM大小和Resident Set Size.但是,这些都不是"真正的"内存使用情况:

  • 程序代码在同一程序的多个实例之间共享.
  • 共享库程序代码在使用该库的所有进程之间共享.
  • 一些应用程序分离进程并与它们共享内存(例如,通过共享内存段).
  • 虚拟内存系统使VM大小报告几乎无用.
  • 当一个进程被换出时,RSS为0,这使得它不是很有用.
  • 等等

我发现Linux报告的私有脏RSS是最接近"真实"内存使用的东西.这可以通过对所有Private_Dirty值求和来获得/proc/somepid/smaps.

但是,其他操作系统是否提供类似功能?如果没有,有哪些替代方案?特别是,我对FreeBSD和OS X感兴趣.

linux memory macos memory-management freebsd

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

读取一个没有锁定同时修改的整数变量是否安全?

假设我在类中有一个整数变量,并且该变量可能被其他线程同时修改.写入受互斥锁保护.我是否也需要保护读取?我听说有一些硬件架构,如果一个线程修改一个变量,另一个线程读取它,那么读取结果将是垃圾; 在这种情况下,我确实需要保护读取.我从未见过这样的架构.

这个问题假设单个事务只包含更新单个整数变量,因此我不担心可能也涉及事务的任何其他变量的状态.

c++ concurrency multithreading

46
推荐指数
4
解决办法
2万
查看次数

'ab'程序在收到大量请求后会冻结,为什么?

每当我使用'ab'对Web服务器进行基准测试时,它会在发送大量请求后冻结一段时间,但仅在20秒左右后继续.

考虑以下用Ruby编写的HTTP服务器模拟器:

require 'socket'

RESPONSE = "HTTP/1.1 200 OK\r\n" +
           "Connection: close\r\n" +
           "\r\n" +
           "\r\n"

buffer = ""
server = TCPServer.new("127.0.0.1", 3000)  # Create TCP server at port 3000.
server.listen(1024)                        # Set backlog to 1024.
while true
    client = server.accept             # Accept new client.
    client.write(RESPONSE)             # Write a stock "HTTP" response.
    client.close_write                 # Shutdown write part of the socket.
    client.read(nil, buffer)           # Read all data from the socket.  
    client.close                       # Close it.
end
Run Code Online (Sandbox Code Playgroud)

然后我按如下方式运行ab:

ab -n 45000 -c 10 …
Run Code Online (Sandbox Code Playgroud)

sockets debugging networking throttling apachebench

37
推荐指数
2
解决办法
7457
查看次数

我的自旋锁实现是否正确且最佳?

我正在使用旋转锁来保护非常小的关键部分.争用情况非常罕见所以自旋锁是比常规的互斥体更合适.

我目前的代码如下,并假设x86和GCC:

volatile int exclusion = 0;

void lock() {
    while (__sync_lock_test_and_set(&exclusion, 1)) {
        // Do nothing. This GCC builtin instruction
        // ensures memory barrier.
    }
}

void unlock() {
    __sync_synchronize(); // Memory barrier.
    exclusion = 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道:

  • 这段代码是否正确?它是否正确地确保互斥?
  • 它适用于所有x86操作系统吗?
  • 它也适用于x86_64吗?在所有操作系统上?
  • 它是最佳的吗?
    • 我已经看到使用比较和交换的自旋锁实现,但我不确定哪个更好.
    • 根据GCC原子内置文档(http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html),还有__sync_lock_release.我不是记忆障碍的专家,所以我不确定我是否可以使用它而不是__sync_synchronize.
    • 我正在针对没有争用的情况进行优化.

我不在乎在所有有关争.有可能是1,也许2其他线程试图每过一次锁自旋锁.

c concurrency multithreading mutual-exclusion spinlock

37
推荐指数
2
解决办法
4万
查看次数

在C或C++中是否有轻量级的multipart/form-data解析器?

我正在考虑在Web服务器模块中集成多部分表单数据解析,这样我就可以解除后端Web应用程序(通常用动态语言编写)来解析多部分数据本身.多部分语法(RFC 2046)看起来并不重要,如果我手工实现它,很多事情都可能出错.是否已经有一个用C或C++编写的好的,轻量级的multipart/form-data解析器?我正在寻找除C或C++标准库之外没有外部依赖关系的那个.我不需要电子邮件附件处理或缓冲的I/O类或可移植性运行时或其他任何东西,只需要多部分/表单数据解析.

我考虑过的事情:

  • GMime - 取决于滑稽,所以不要去.
  • libapreq - 太大,取决于APR,记录严重,没有单元测试.

我还看过用Ragel编写一个解析器,但我无法弄清楚如何做到这一点,因为语法不是静态的:边界可以任意改变.

c c++ parsing multipartform-data multipart

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

ECONNRESET在AF_LOCAL套接字的上下文中意味着什么?

据我所知,对于TCP套接字,ECONNRESET与RST数据包有关.但是我在read()和write()调用上也看到了AF_LOCAL套接字的ECONNRESET错误.这是什么意思?ECONNRESET与read()返回0或write()抛出EPIPE有什么不同?

sockets posix

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

如何编写与Python 2和Python 3兼容的异常重新加载代码?

我正在尝试使我的WSGI服务器实现与Python 2和Python 3兼容.我有这样的代码:

def start_response(status, response_headers, exc_info = None):
    if exc_info:
        try:
            if headers_sent:
                # Re-raise original exception if headers sent.
                raise exc_info[0], exc_info[1], exc_info[2]
        finally:
            # Avoid dangling circular ref.
            exc_info = None
    elif headers_set:
        raise AssertionError("Headers already set!")

    headers_set[:] = [status, response_headers]
    return write
Run Code Online (Sandbox Code Playgroud)

......相关部分是:

# Re-raise original exception if headers sent.
raise exc_info[0], exc_info[1], exc_info[2]
Run Code Online (Sandbox Code Playgroud)

Python 3不再支持该语法,因此必须将其翻译为:

raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
Run Code Online (Sandbox Code Playgroud)

问题:Python 2语法在Python 3中生成解析错误.如何编写可由Python 2和Python 3解析的代码?我尝试了以下,但这不起作用:

if sys.version_info[0] >= 3:
    raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
else:
    eval("raise exc_info[0], exc_info[1], exc_info[2]; …
Run Code Online (Sandbox Code Playgroud)

python python-2.x python-3.x

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

哪个是x86上更好的写屏障:lock + addl还是xchgl?

Linux内核lock; addl $0,0(%%esp)用作写屏障,而RE2库xchgl (%0),%0用作写屏障.有什么区别,哪个更好?

x86还需要读屏障指令吗?RE2将其读屏障功能定义为x86上的无操作,而Linux lfence根据SSE2是否可用将其定义为无操作或无操作.什么时候lfence需要?

x86 assembly memory-barriers

23
推荐指数
4
解决办法
7771
查看次数

什么原因导致ENOTCONN错误?

我目前正在维护一些Web服务器软件,我需要执行大量的I/O操作.的read(),write(),close()shutdown()电话,一个插座上使用时,有时可能会引发ENOTCONN错误.这个错误究竟是什么意思?触发它的条件是什么?我似乎永远不会在本地重现它,但有用户可以.

现在我只是忽略ENOTCONNclose(),shutdown()因为它似乎无害,但我不完全确定.

编辑:

  • 我绝对相信这个connect()电话成功了.我检查它的返回值.
  • ENOTCONN通常由close()和提出shutdown().我很少见到read()write()提高ENOTCONN.

sockets

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