小编joh*_*ash的帖子

防止linux线程被调度程序中断

你如何告诉linux中的线程调度程序不会因任何原因中断你的线程?我在用户模式下编程.简单地锁定互斥锁是否可以实现这一点?我希望防止在执行某个函数时调度进程中的其他线程.它们会阻塞,我会浪费带有上下文切换的cpu周期.我希望执行该函数的任何线程能够在不中断的情况下完成执行,即使超出了线程的时间片.

linux multithreading interrupt

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

Linux共享库,它使用共享库未定义的符号

两个共享库liba.so和libb.so. liba.so使用libb.so. 所有c文件都使用-fPIC编译.链接使用-shared.当我们在liba.so上调用dlopen时,它无法在libb.so中找到符号...我们得到"未定义符号"错误.我们可以dlopen libb.so没有错误.我们知道liba正在寻找libb,因为我们没有找到找不到文件的错误.删除libb.so时,我们收到文件未找到错误.我们试过 - 但没有运气.

有任何想法吗????

哦耶.gcc 4.1.2

更新:我们在链接liba时使用rpath,因此可以找到libb.

ldd liba.so返回:

linux-gate.so.1 => (0xffffe000)  
libb.so => ./libb.so (0xf6ef9000)  <-------- LIBB 
libutil.so.1 => /lib/libutil.so.1 (0xf6ef5000)  
libdl.so.2 => /lib/libdl.so.2 (0xf6ef1000)  
libm.so.6 => /lib/libm.so.6 (0xf6ec9000)  
libpthread.so.0 => /lib/libpthread.so.0 (0xf6eb1000)  
librt.so.1 => /lib/librt.so.1 (0xf6ea8000)  
libc.so.6 => /lib/libc.so.6 (0xf6d62000)  
/lib/ld-linux.so.2 (0x007d0000)   
Run Code Online (Sandbox Code Playgroud)

在libb的末尾没有.#是有意义的吗?

linux gcc shared

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

C#比较3字节字段

编辑

未使用的cmp指令会导致NullPointerException.

什么是这些奇怪的cmp [ecx],ecx指令在我的C#代码中做什么?

原始帖子(下面有更多编辑)

我试图理解JIT编译代码的方式.

在内存中我有一个3 char字段.在c ++中比较两个这样的字段我可以这样做:

return ((*(DWORD*)p) & 0xFFFFFF00) == ((*(DWORD*)q) & 0xFFFFFF00);
Run Code Online (Sandbox Code Playgroud)

MSVC 2010将生成类似这样的内容(来自内存):

 1 mov         edx,dword ptr [rsp+8] 
 2 and         edx,0FFFFFF00h 
 3 mov         ecx,dword ptr [rsp] 
 4 and         ecx,0FFFFFF00h 
 5 cmp         edx,ecx 
Run Code Online (Sandbox Code Playgroud)

在C#中,我试图弄清楚如何尽可能地接近它.我们有很多1,2,3,4,5,6,7,8字节字段组成的记录.我已经在c#中测试了很多不同的方法来构建一个更大的结构,使用这些大小的较小结构来表示记录.我对汇编代码不满意.现在我正在玩这样的事情:

[StructLayout(LayoutKind.Sequential, Size = 3)]
public unsafe struct KLF3
{
    public fixed byte Field[3];
    public bool Equals(ref KLF3 r)
    {
        fixed (byte* p = Field, q = r.Field)
        {
            return ((*(UInt32*)p) & 0xFFFFFF00) == ((*(UInt32*)q) & 0xFFFFFF00);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我有两个问题.问题一是编译器生成了很多无用的代码:

            fixed …
Run Code Online (Sandbox Code Playgroud)

c# struct fixed visual-studio-2010

12
推荐指数
1
解决办法
370
查看次数

linux pthread_suspend

看起来linux并没有实现pthread_suspend并继续,但我真的需要它们.

我试过cond_wait,但是太慢了.正在进行线程化的工作主要在50us内执行,但偶尔会执行500ms以上.cond_wait的问题是双重的.互斥锁定与微秒执行的时间相当,我不需要锁定.其次,我有很多工作线程,当他们需要被唤醒时,我真的不想制作N个条件变量.

我确切地知道哪个线程正在等待哪个工作,并且可能只是pthread_continue该线程.一个线程知道什么时候没有更多的工作,并且可以轻松地pthread_suspend自己.这将不使用锁定,避免踩踏,并且更快.问题是......没有pthread_suspend或_continue.

有任何想法吗?

c linux pthreads

9
推荐指数
1
解决办法
5902
查看次数

将PowerShell对象输出到字符串中

此代码启动ping:

$ProcessInfo = New-Object System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = "ping.exe"
$ProcessInfo.RedirectStandardError = $true
$ProcessInfo.RedirectStandardOutput = $true
$ProcessInfo.UseShellExecute = $false
$ProcessInfo.Arguments = "localhost"
$Proc = New-Object System.Diagnostics.Process
$Proc.StartInfo = $ProcessInfo
$Proc.Start() | Out-Null
Run Code Online (Sandbox Code Playgroud)

当我在命令中输入$ Proc时,

$Proc
Run Code Online (Sandbox Code Playgroud)

我明白了:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
     27       3     1936       1852    10     0.02   6832 PING
Run Code Online (Sandbox Code Playgroud)

我想将数据行转换为字符串.

所以我尝试了这个:

$Proc | Format-table -HideTableHeaders
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

 27       3     1936       1852    10     0.02   6832 PING
Run Code Online (Sandbox Code Playgroud)

我试过这个:

$Foo = $Proc | Format-table -HideTableHeaders …
Run Code Online (Sandbox Code Playgroud)

string format powershell

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

分支预测数据存储在何处/如何存储?

我一直想知道预测数据的存储位置和方式?有限制吗?它只是最近的分支吗?我主要关心的是英特尔架构,但我对任何架构的了解都表示赞赏.

branch-prediction

9
推荐指数
1
解决办法
439
查看次数

在PowerShell管道上输出二进制数据

我需要将一些数据传递给程序的stdin.

  1. 前4个字节是32位无符号整数,表示数据的长度.这4个字节与C在内存中存储unsigned int完全相同.我将其称为二进制数据.
  2. 剩余的字节是数据.

在c中,这是微不足道的:

WriteFile(h, &cb, 4);  // cb is a 4 byte integer
WriteFile(h, pData, cb);
Run Code Online (Sandbox Code Playgroud)

要么

fwrite(&cb, sizeof(cb), 1, pFile);
fwrite(pData, cb, 1, pFile);
Run Code Online (Sandbox Code Playgroud)

或者c#你会使用BinaryWriter(我认为这段代码是对的,我现在没有c#,...)

Bw.Write((int)Data.Length);
Bw.Write(Data, 0, Data.Length);
Run Code Online (Sandbox Code Playgroud)

在PowerShell中我确信它是可能的,但这是我能得到的尽可能接近.这显然是将4个字节的大小打印为4个人类可读数字:

$file = "c:\test.txt"
Set-content $file "test data" -encoding ascii
[int]$size = (Get-ChildItem $file).Length
$bytes = [System.BitConverter]::GetBytes($size)
$data = Get-content $file
$bytes
$data

11
0
0
0
test data
Run Code Online (Sandbox Code Playgroud)

我需要在管道上发送的二进制数据看起来像这样(\ xA是不可打印字符的转义表示,我不想在输出中使用'\',我想要'\ xA'表示的BYTE输出) :

\xA\x0\x0\0test data
Run Code Online (Sandbox Code Playgroud)

我不知道如何以二进制格式写出管道中的字节数组.我也不知道如何摆脱回车.

编辑: 我发现我可以这样做:

$file = "c:\test.txt"
Set-content $file "test data" -encoding ascii
"File: …
Run Code Online (Sandbox Code Playgroud)

binary powershell pipeline

8
推荐指数
2
解决办法
9851
查看次数

linux线程同步

我是linux和linux线程的新手.我花了一些时间谷歌搜索试图理解可用于线程同步的所有函数之间的差异.我还有一些问题.

我找到了所有这些不同类型的同步,每个同步都有许多锁定,解锁,测试锁等功能.

  • gcc原子操作
  • futexes的
  • 互斥
  • 自旋锁
  • seqlocks
  • rculocks
  • 条件
  • 信号灯

我当前(但可能有缺陷)的理解是这样的:

信号量是进程范围的,涉及文件系统(实际上我假设),并且可能是最慢的.

Futexes可能是互斥锁,自旋锁,seqlocks和rculocks使用的基本锁定机制.Futexes可能比基于它们的锁定机制更快.

自旋锁不会阻塞,从而避免上下文波动.然而,它们避免了上下文切换,代价是消耗CPU上的所有循环,直到释放锁定(旋转).出于显而易见的原因,它们应仅应用于多处理器系统.永远不要睡在螺旋锁中.

如果作者更改了工作所基于的数据,seq锁只会告诉您何时完成工作.在这种情况下,您必须返回并重复工作.

原子操作是最快的同步调用,并且可能在所有上述锁定机制中使用.您不希望对共享数据中的所有字段使用原子操作.当您访问多个数据字段时,您希望在锁定标志上使用锁(互斥锁,futex,旋转,seq,rcu)或单个原子操作.

我的问题是这样的:

  1. 到目前为止我对我的假设是否正确?

  2. 有谁知道各种选项的cpu周期成本? 我正在为应用添加并行性,因此我们可以获得更好的响应时间,但每个盒子运行的应用实例更少.表演是最重要的考虑因素.我不想使用上下文切换,旋转或许多额外的CPU周期来读取和写入共享内存.我绝对关心消耗的cpu周期数.

  3. 哪个(如果有的话)锁可以防止调度程序中断线程或中断...或者我只是一个白痴,所有同步机制都会这样做.什么样的中断被阻止?我可以阻止锁定线程的CPU上的所有线程或线程吗? 这个问题源于我担心中断一个线程,该线程持有一个非常常用的函数.我希望调度程序可能会调度任何可能会遇到此函数的其他工作者,然后因为它被锁定而阻塞.在带有锁的线程被重新安排并完成之前,将浪费大量上下文切换.我可以重新编写这个函数以最小化锁定时间,但它通常被称为我想使用锁来防止中断...跨所有处理器.

  4. 我正在编写用户代码...所以我得到软件中断,而不是硬件中断......对吗?我应该远离任何带有"irq"字样的功能(旋转/ seq锁).

  5. 哪些锁用于编写内核或驱动程序代码,哪些用于用户模式?

  6. 有没有人认为使用原子操作让多个线程通过链表移动是疯了? 我想通过原子方式将当前项指针更改为列表中的下一个项.如果尝试有效,则线程可以安全地使用当前项在移动之前指向的数据.现在,其他线程将沿列表移动.

  7. futexes的?有没有理由使用它们而不是互斥体?

  8. 当没有工作时,是否有比使用条件睡眠线程更好的方法?

  9. 当使用gcc原子操作,特别是test_and_set时,我可以通过先进行非原子测试然后使用test_and_set来确认来提高性能吗? 我知道这将是特定于案例的,所以情况就是如此.有数以千计的工作项目.每个工作项都有一个初始化为0的标志.当一个线程具有对工作项的独占访问权时,该标志将为1.会有很多工作线程.一旦线程正在寻找工作,他们就可以非原子地测试1.如果他们读取1,我们肯定知道工作不可用.如果他们读零,他们需要执行原子test_and_set来确认.因此,如果原子test_and_set是500个cpu周期,因为它禁用流水线操作,导致cpu通信和L2缓存刷新/填充....并且一个简单的测试是1个周期....然后只要我有一个更好的比率当它磕磕绊绊已经完成的工作项目时,500比1 ......这将是一场胜利.

我希望使用互斥锁或自旋锁来保护代码段,我希望一次只能访问SYSTEM(而不是CPU)上的一个线程.我希望谨慎地使用gcc原子操作来选择工作并尽量减少互斥锁和自旋锁的使用.例如:可以检查工作项中的标志以查看线程是否已经工作(0 =否,1 =是或正在进行中).一个简单的test_and_set告诉线程它是否有效或需要继续.我希望在工作时使用条件唤醒线程.

谢谢!

linux performance multithreading synchronization locking

5
推荐指数
1
解决办法
4985
查看次数

dladdr不返回函数名称

我正在尝试使用dladdr。它可以正确找到该库,但是找不到函数名称。我可以调用objdump,做一些数学运算,然后获取传递dladdr的函数的地址。如果objdump可以看到它,为什么不能dladdr?

这是我的功能:

const char *FuncName(const void *pFunc)
{
Dl_info  DlInfo;
int  nRet;

    // Lookup the name of the function given the function pointer
    if ((nRet = dladdr(pFunc, &DlInfo)) != 0)
        return DlInfo.dli_sname;
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

这是显示我得到的gdb成绩单。

Program received signal SIGINT, Interrupt.
[Switching to Thread 0xf7f4c6c0 (LWP 28365)]
0xffffe410 in __kernel_vsyscall ()
(gdb) p MatchRec8Cmp
$2 = {void (TCmp *, TWork *, TThread *)} 0xf1b62e73 <MatchRec8Cmp>
(gdb) call FuncName(MatchRec8Cmp)
$3 = 0x0
(gdb) call FuncName(0xf1b62e73)
$4 = 0x0
(gdb) b FuncName …
Run Code Online (Sandbox Code Playgroud)

c linux elf

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

如何在Windows中利用RDMA

如何使用RDMA在Windows下将一块内存从一台服务器复制到另一台服务器?我们没有infiniband,但我们有10GB的网络交换机.我需要的只是一个例子,但我对谷歌没有太多运气.

编辑:

到目前为止,还没有人回答我的问题.我只需要一个示例的链接,或一些函数的名称.到目前为止,我所阅读的所有内容似乎都在驱动程序SDK或套接字中.我想在我们的软件中使用RDMA来更新主服务器的本地数据副本.数据大小高达10GB.大多数情况下更新大约为1GB,但如果服务器必须重新启动,则整个压缩数据集为10GB.我想几乎连续更新一些数据,RDMA似乎是要采取的路线.

windows rdma

5
推荐指数
1
解决办法
3216
查看次数