我目前正在尝试编写一个程序,该程序将能够创建稳定的 TCP 连接并完全控制 ISN 编号。我一直在用 C 语言写作,现在我非常有限的知识已经达到了极限,我想知道是否有更好的方法来做到这一点。
我尝试的是手动构建标头,使用原始套接字发送和接收数据包,而不会受到内核干扰,这是一个挑战。
因此,无论使用哪种语言,您认为操纵 ISN 最有效、最简单的方法是什么?
考虑以下取自维基百科的示例,稍作修改,其中程序的步骤对应于各个处理器指令:
x = 0;
f = 0;
Thread #1:
while (f == 0);
print x;
Thread #2:
x = 42;
f = 1;
Run Code Online (Sandbox Code Playgroud)
我知道,print由于乱序执行,当线程在两个不同的物理内核/处理器上运行时,该语句可能会打印不同的值(42 或 0)。
但是我不明白为什么这在单核机器上不是问题,这两个线程运行在同一个核心上(通过抢占)。根据维基百科:
当程序在单 CPU 机器上运行时,硬件执行必要的簿记以确保程序执行时好像所有内存操作都按照程序员指定的顺序(程序顺序)执行,因此不需要内存屏障。
据我所知,单核 CPU 也会对内存访问重新排序(如果它们的内存模型很弱),那么是什么确保程序顺序被保留呢?
multithreading synchronization cpu-architecture low-level memory-barriers
官方文档以及互联网上的大量文章都说这'some string'是一个原始值,这意味着每次我们将其分配给变量时它都会创建一个副本。
然而,这个问题(及其答案)How to Force JavaScript to Deep Copy a string? 证明实际上 V8 即使在方法上也不会复制字符串substr。
每次将字符串传递给函数时都复制字符串也是疯狂的,而且没有意义。在 C#、Java 或 Python 等语言中,字符串数据类型绝对是引用类型。
此外,这个链接显示了层次结构,我们毕竟可以看到HeapObject。
https://thlorenz.com/v8-dox/build/v8-3.25.30/html/d7/da4/classv8_1_1internal_1_1_sliced_string.html

最后,经过检查
let copy = someStringInitializedAbove
Run Code Online (Sandbox Code Playgroud)
在Devtools中,很明显尚未创建该字符串的新副本!
所以我很确定字符串在赋值时不会被复制。但我还是不明白为什么那么多像JS Primitives vs Reference这样的文章都这么说。
javascript language-design value-type reference-type low-level
当我们运行代码时,编译器在编译后“检测”必要的堆栈内存量?这样,每个程序都有自己的堆栈内存“块”。
或者每个程序的堆栈内存是由操作系统定义的?
谁定义了每个运行的应用程序的堆栈内存量?
或者我们没有这个,每个程序都可以根据需要使用所有堆栈内存?
我对性能计算的C语言感兴趣.您能推荐一些具有以下属性的替代编程语言:
我主要对鲜为人知的语言感兴趣.
内存中的返回值存储在内存中?
考虑以下代码:
int add(int a, int b) {
int result = a+b;
return result;
}
void main() {
int sum = add(2, 3);
}
Run Code Online (Sandbox Code Playgroud)
当add(2, 3)被调用时,2个函数参数压入堆栈中,堆栈帧指针被压入堆栈,和一个返回地址被压入堆栈.然后执行流程跳转到add(...),并且该函数中的局部变量也存储在堆栈中.
何时add(...)完成,并执行return指令...返回值存储在哪里?[result]最终怎么样[sum]?
有没有关于Git索引文件内部结构的文档?从各种书中我知道它是二进制的,它包含分阶段文件的SHA,我知道Git'plumbing'命令有助于揭示索引内容......
但是,如何使用C#自己读取索引呢?
我知道有这个功能的几个实现,所以可以研究代码:
所有这些选项都有点复杂,因为需要破解其他代码.我更愿意使用数据格式解释从头开发.如果有可能的原因.
非常感谢你的帮助!
哪个版本更快?
x * 0.5
or
x / 2
我不久前在大学开了一门叫做计算机系统的课程.从那时起,我记得用相对"简单"的逻辑门可以实现两个值的乘法,但是除法不是"本机"操作,并且需要一个在除数中增加的并且与被除数相比的和的寄存器.
现在我必须优化一个有很多划分的算法.不幸的是,它不仅仅是除以二,所以二元移位是没有选择的.将所有分区改为乘法会有所不同吗?
更新:
我已经改变了我的代码而没有发现任何差异.你可能正确的编译器优化.由于所有的答案都非常好,所以我对它们进行了全面的投票.我选择rahul的答案是因为它有很好的联系.
我正在抛出一些C代码,我需要将32位int 32位移位.当我使用参数n = 0运行此代码时,不会发生移位.
int x = 0xFFFFFFFF;
int y = x << (32 - n);
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
如果一个64字节的缓冲区被大量读/写,那么它很可能会被保存在L1中; 但有没有办法强迫这种行为?
同样,给一个核心独占访问这64个字节,并告诉它不要将数据与其他核心和内存控制器同步,这样这些64个字节总是存在于一个核心的L1中,无论CPU是否认为它经常被使用.
low-level ×10
c ×3
performance ×2
assembly ×1
bit-shift ×1
bits ×1
c# ×1
cpu ×1
cpu-cache ×1
git ×1
header ×1
javascript ×1
stack-memory ×1
tcp ×1
value-type ×1
x86 ×1