Articles of locking

在使用读写锁的pthread散列表中读取性能差

我已经把一个简单的关键值存储放在一起,它说的是Redis协议的一个子集。 它使用Linux上的pthreads来共享哈希表; 我使用pthreads rwlocks来pipe理对这个表的访问。 我一直在使用Redis基准testing工具testingKV商店。 有了一个客户端,我可以每秒做大约2500次SET操作。 但是,它只能做到每秒25个GET。 我期望别的方法,所以这让我感到惊讶。 它在某种程度上可以扩展,所以如果我扔10个客户端,我会得到每秒近9000个SET和每秒250个GET。 我的GET代码很简单, 我locking表,find合适的散列表位置,并检查链接列表中的匹配键。 对于GET,当我完成时,我使用pthread_rwlock_rdlock和pthread_rwlock_unlock 。 对于SET,我使用pthread_rwlock_wrlock和pthread_rwlock_unlock 。 SET比GET复杂得多。 我还使用共享内存进程和自己的读/写锁实现了Plan 9的代码。 在那里,GET几乎和SET一样快,而不是慢100倍。 这让我觉得我的哈希表代码可能是好的; 我使用两个操作系统完全相同的哈希表代码,我只是使用#defines为每个操作系统select合适的锁(在两种情况下,接口是相同的,幸运的!)。 我对pthreads不是很有经验。 谁能帮我弄清楚为什么我的performance太糟糕了? (注意:这不是一个高性能的KV商店,它是一个天真的书面testing应用程序/基准testing程序,通过为每个客户端分离一个新的线程,以最简单的方法处理请求)

同时访问文件。 奇怪的locking行为

我无法理解我的程序行为。 int MyOpenWrite(char *name,int flags) { int fd; unsigned long tm; unsigned long t; tm=time(0)+5; //5 seconds for (;;) { fd = open(name,flags,S_IREAD|S_IWRITE|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); if (fd>0) break; if (time(0)>=tm) return -1; } //1111111111111111111 LockFile(fd); DelayInSeconds(60); //2222222222222222222222 return fd; } int LockFile(int fd) //return 0 – OK; -1 – Error { struct flock lock; lock.l_type = F_WRLCK; […]

内核模块的安全卸载

我必须编写LKM,拦截一些系统调用。 解决scheme是: 查找sys_call_table符号的地址,检查地址是否正确(例如检查sys_call_table [__ NR_close]指向sys_close的地址) 禁用中断 禁用CR0中的WP位 将sys_call_table [__ NR_close]更改为我自己的函数 启用WP位 启用中断。 加载模块正常工作。 但是,模块的安全卸载呢? 考虑当我将sys_call_table恢复到原始状态并卸载模块时的情况 – 如果内核仍然在其他CPU上的其他进程的系统调用的上下文中执行代码,该怎么办? 我将在内核模式下得到页面错误(因为模块代码段的页面不可用,因为模块被卸载)。 共享资源是sys_call_table中的条目。 如果我可以访问这个由锁保护的条目 – 那么我可以安全地卸载我的模块。 但是,由于内核系统调用处理程序没有任何这种锁(egarch / x86 / kernel / entry_32.S) – 这意味着没有安全的方式卸载我的模块? 这是真的吗? UPDATE1 我需要从2.4内核版本开始,获取旧内核(fanotify(2)不可用)的文件访问信息。 我需要这些信息来执行通过防病毒引擎的访问扫描。

如何为独特的守护进程和多个用户发布Linuxlocking文件

我有一个deamon,一次只能运行一个实例。 守护进程是更大的应用程序的一部分。 我是这样做的: 用O_CREAT | O_RDWR open() /tmp/prog.pid O_CREAT | O_RDWR ,权限0666.权限实际上变成了0664,可能是因为umask(?) flock()在由open()返回的文件描述符上,用LOCK_EX | LOCK_NB LOCK_EX | LOCK_NB 这是我所有的第一。 我的守护进程在SIGTERM和SIGINT上退出,但事实certificate,退出时锁没有被释放。 我在man 1 flock帮助下实现了(奇怪的是不是在第二man 2 flock ),如果“所附的指挥小组可能已经分派了一个不应该持有锁的后台进程”,则可能需要手动解锁。 这是因为我正在开发一个守护进程,所以我现在在退出时手动解锁。 现在到我的问题:有几个用户可能正在运行守护进程。 如果user1正在运行守护进程,我希望user2能够杀死它并以自己的身份重新启动它。 locking的文件/tmp/prog.pid拥有权限/tmp/prog.pid ,所有者user1,组user1。 停止脚本prog_stop杀死了应用程序中涉及的所有进程(它需要超级用户权限,我确定)。 它也杀死守护进程。 当user2运行prog_stop ,锁被释放(我相信),但是user2 不能启动它自己的守护进程 ,因为它既不是锁文件的所有者,也不是它的组。 几种可能的解决方 使锁文件0666,可写入所有。 危险的。 创build一个用户需要运行该应用程序的组。 这要求所有的用户都使用这个组来启动应用程序,可能需要使用newgrp 。 容易忘记,不容易执行,人们这样做。 可能在用于启动应用程序的脚本中设置当前组? 完全删除prog_stop的locking文件。 缺点:我从C文件中打开文件,其中定义了pathstring。 我需要在停止脚本中写入(并保持!)与path完全相同的文件名。 守护进程的locking文件必须非常普遍。 处理这个问题的标准方法是什么?

基于互斥体的locking机制

有人可以告诉我一个基于futex的locking机制的例子吗? (对于x86 CPU,CentOS)

在自定义的linux内核系统调用中强制执行代码段

我一直在试图实施一个linux system_call一直给我的问题,我怀疑这是因为没有locking(或可能抢占)与我的代码进行。 我有一个非常频繁调用的函数(每次调用system_call时会调用此自定义函数)中的一个关键部分,并且它也由system_calls启动/停止。 有什么方法可以确保每次在Linux内核中进行系统调用时发生的这个关键段都是不可抢占的,并且必须在发生其他任何事情之前完成执行?

如何打开(如果不存在则创build)一个文件,同时获得独占locking避免比赛

在Python 2.7中,是否有可能(以及如何)在单个primefaces(无竞争)操作中: 打开一个文件 如果不存在,创build然后打开它。 获取文件上的排他锁(没有其他进程可以打开或删除文件) 上下文 :我有一个单一的python程序,将提取URL / md5列表中的文件; 如果列表文件存在并且与md5匹配,则会跳过该文件。 如果没有,将被下载。 现在,这个程序可能有多个实例处理可能重叠的不同列表。 这个问题几乎是我需要做的,但在我的情况下,我需要locking文件,以检查它的MD5,同时防止别人这样做。 另外,在操作之前我不需要知道文件是否存在, 如果刚刚创build的文件将是空的,它的MD5将不匹配,所以它将被下载无论如何。 我特别在Linux上使用这个程序,但是欢迎使用跨平台的解决scheme。 编辑:最后,我已经解决了我的问题: 以+ b模式打开文件(不是primefaces的,如果不存在则创build)。 尝试专门locking文件(build议): 如果成功,请上档案。 如果失败,则假定其他人正在处理文件并跳到下一个文件。 没有更多的文件处理后,回来检查是否谁locking文件做了正确的工作。 就目前而言,所需的操作在单个primefaces步骤中不被支持,但是也不需要。

如何跨进程locking/解锁文件?

使用C#在单声道Linux上运行,请注意,下面的代码在Windows上可以locking一个文件,而不是在Linux上通过单声道(ubuntu 14.04) new FileStream("myfile.lock",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None); 从互联网的研究,我应该能够做到这一点与咨询锁 FileStream.Lock 但是,它没有工作。 在ubuntu 14.04上testing两个进程,他们都可以执行“FileStream.Lock(0,int.MaxValue)”。 我希望后面的一个将失败,每个源代码exception。 任何人知道有没有解决scheme?

错误地写入同步进程的文件输出顺序?

我有以下问题。 我有两个正在与信号量同步的进程,这个想法是这样的: 进程1向txt文件写入内容 进程2写入一些txt文件 进程1写入testing文件 我已经包含了这个示例代码来演示这个问题: // semaphore names #define NAME1 "/s1" #define NAME2 "/s2" int main() { /* semaphores for process synchronization */ sem_t *sm1; sm1 = sem_open( NAME1, O_CREAT, 0666, 0); sem_t *sm2; sm2 = sem_open(NAME2, O_CREAT, 0666, 0); /* processes*/ int proc1; int proc2; /* file lock struct */ struct flock fl […]

C和Python之间的文件locking(flock)兼容性

Python的python实现是否可以与标准C库一起透明地工作? 如果我有两个程序,一个在Python中,另一个在C中,尝试获取单个文件的locking是否可行? 快速链接: Python群: https : //docs.python.org/2/library/fcntl.html Linux群: http : //linux.die.net/man/2/flock