- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
编辑:ST 不允许为新手发布两个以上的链接。很抱歉缺少引用资料。
我正在尝试减少 C 应用程序中的锁定开销,其中检测全局状态的更改与性能相关。尽管我最近读了很多关于这个主题的书(例如很多来自 H. Sutter 的书,等等),但我对自己的实现没有信心。我想使用类似 CAS 的操作和 DCL 的组合来检查 Cache-Line Aligned 全局变量,从而避免错误-sharing,从多个线程之间共享的数据中更新线程本地数据。我缺乏信心主要是因为
我的问题:
Type-Attributes 文档指出:
This attribute specifies a minimum alignment (in bytes) for variables of the specified type. For example, the declarations:
(please see Type-Attributes documentation for declaration)
force the compiler to insure (as far as it can) that each variable whose type is
struct S
ormore_aligned_int
will be allocated and aligned at least on a8-byte
boundary. On a SPARC, having all variables of typestruct S
aligned to8-byte
boundaries allows the compiler to use the ldd and std (doubleword load and store) instructions when copying one variable of type struct S to another, thus improving run-time efficiency.
这是否意味着 struct S
或 more_aligned_int
的开头将始终与 8-byte
边界对齐?这并不意味着数据将被填充为正好使用 64 个字节,对吧?
假设 1. struct cache_line_aligned
的每个实例(参见下面的代码 示例 1)都在 64 字节
上对齐,这是真的边界并仅使用一个缓存行(假设缓存行的长度为 64 字节
)
使用 typedef
进行类型声明不会改变 __attribute__ ((aligned (64)))
的语义(参见代码 示例 2 下面)
如果使用 __attribute__ ...
aligned_malloc
// Example 1
struct cache_line_aligned {
int version;
char padding[60];
} __attribute__ ((aligned (64)));
// Example 2
typedef struct {
int version;
// place '__attribute__ ((aligned (64)))' after 'int version'
// or at the end of the declaration
char padding[60];
} cache_line_aligned2 __attribute__ ((aligned (64)));
最后是一个函数的草图,它使用缓存行对齐的方法来有效地检查全局状态是否已被其他线程修改:
void lazy_update_if_changed(int &t_version, char *t_data) {
// Assuming 'g_cache_line_aligned' is an instance of
// 'struct cache_line_aligned' or 'struct cache_line_aligned2'
// and variables prefixed with 't_' being thread local
if(g_cache_line_aligned.version == t_version) {
// do nothing and return
} else {
// enter critical section (acquire lock e.g. with pthread_mutex_lock)
t_version = g_cache_line_aligned.version
// read other data that requires locking where changes are notified
// by modifying 'g_cache_line_aligned.version', e.g. t_data
// leave critical section
}
}
抱歉,帖子太长了。
谢谢!
最佳答案
当您定义对齐类型时,例如,对齐到 8 字节边界,编译器应通过填充使该类型的大小成为对齐的倍数(此处为 8 字节的倍数)。
这样做的理由很简单。假设您要定义该对齐类型的数组。自然,它的每个元素也应该对齐。这就是为什么可能会有填充。
这里有一个小示范:
#include <stdio.h>
struct cache_line_aligned {
int version;
// char padding[60];
} __attribute__ ((aligned (64)));
int main(void)
{
struct cache_line_aligned s;
struct cache_line_aligned a[2];
printf("sizeof(struct cache_line_aligned) = %d\n", (int)sizeof(struct cache_line_aligned));
printf("sizeof(s) = %d\n", (int)sizeof(s));
printf("sizeof(a[0]) = %d\n", (int)sizeof(a[0]));
printf("sizeof(a) = %d\n", (int)sizeof(a));
return 0;
}
输出(ideone):
sizeof(struct cache_line_aligned) = 64
sizeof(s) = 64
sizeof(a[0]) = 64
sizeof(a) = 128
如果你非动态地创建一个 struct cache_line_aligned
实例(IOW,而不是通过 malloc()
等),就像上面的代码一样,它将是对齐。
malloc()
、calloc()
和 realloc()
的 C 标准(从 1999 年开始):
The pointer returned if the allocation succeeds is suitably aligned so that
it may be assigned to a pointer to any type of object and then used to
access such an object or an array of such objects in the space allocated
(until the space is explicitly deallocated).
any type of object
不包括像上面的结构那样人为对齐/填充的类型,因为没有像 __attribute__ ((aligned (64)))这样的东西
在 C 标准中。这是这里的 GNU 扩展。对于具有任意对齐方式的动态分配对象,您必须使用适当的内存分配函数或手动进行对齐(通过分配更多内存然后“对齐”指针值)。
关于c - 使用 Cache-Line 对齐对 C 中全局共享状态的修改进行无锁检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12592342/
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我卡在了一个点上,我无法进步,很抱歉这个愚蠢的问题。我为此进行了很多搜索,但我不知道我错过了什么。请帮助我。 我研究了 python 中的模块和类。现在我想使用 python 和 apt 进行一些操作
我在 Kong 有服务,我已经为该服务设置了代理缓存插件。 curl -X POST http://localhost:8001/plugins --data "name=proxy-cache"--
ASP.NET Core 提供内存缓存和响应缓存。 假设该应用程序是 ASP.NET Core WebAPI,它通过配置的响应缓存中间件将 SQL 数据库中的数据传送给用户。 在什么情况下也使用内存缓
我最近遇到了以下面试问题: You need to design a system to provide answers to factorials for between 1 and 100. Yo
我的 Javascript (JS) 代码遇到了一些麻烦,因为我有时需要在同一个函数中多次访问相同的 DOM 元素。还提供了一些推理here . 从性能的角度来看,是一次性创建一个 jQuery 对象
仅使用 Cache 终端,我使用或查看什么实用程序函数或 Global 来查找存在于 Cache 数据库中的所有 Globals 的列表? 再次仅在缓存终端中使用,我使用或查看什么实用程序功能或全局以
我的 Javascript (JS) 代码遇到了一些麻烦,因为有时我需要在同一个函数中多次访问同一个 DOM 元素。还提供了一些推理here . 从性能的角度来看,是先创建一个jQuery对象然后缓存
来自 RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1 no-cache If the no-cach
大多数 CDN 服务器对经常访问的内容使用缓存。 场景:假设有人上传了一张非常热门的图片,并且来自同一位置的许多用户 (1000) 试图访问该图片。 问题:假设网络服务器收到一个请求,首先检查它的缓存
我的 Javascript (JS) 代码遇到了一些麻烦,因为有时我需要在同一个函数中多次访问同一个 DOM 元素。还提供了一些推理here . 从性能的角度来看,是先创建一个jQuery对象然后缓存
如果我将服务器响应设置为:Cache-Control: private,no-cache,max-age=900 ? 如果标题是这样的,会发生什么:Cache-Control: public,no-c
我有一个类需要在缓存中存储数据。最初我在 ASP.NET 应用程序中使用它,所以我使用了 System.Web.Caching.Cache。 现在我需要在 Windows 服务中使用它。现在,据我了解
我遇到了和这个人一样的问题:X-Drupal-Cache for Drupal 7 website always hits MISS ,并且找不到出路。 我正在运行 Drupal 7 - 新闻流 和
我已将 Laravel 设置为使用 Redis 作为缓存。当我使用 Cache::('my_var', 'my_val'); 然后通过 CLI 检查 Redis 以查看 key 是否已创建时,我可以验
我在 Windows Azure 云上有一个应用程序,并且正在使用 Windows Azure 共置缓存。 有时,当我发布网站/web服务时,调用DataCacheFactory.GetCache方法
我正在阅读 documentation for Apollo server-side caching ,但看不到任何关于缓存通常如何加密的内容。 我需要的是一个以响应中包含的对象 ID 为键的缓存,而
Hibernate\Grails 中最好的缓存策略是什么?是否缓存所有实体和查询以及如何找到最佳解决方案? 这是我的 hibernate 配置。 hibernate { cache.use_sec
我收到错误 'Nuget.Proxy Cache' 的类型初始化器抛出异常 尝试连接到 Nuget 官方包源时。我在公司网络后面,但是我怀疑问题是连接性。 有任何想法吗? 最佳答案 我有同样的问题。我
我是一名优秀的程序员,十分优秀!