我已经读过每个进程都有一组与之关联的语言环境变量.例如,这些是与bash我系统上的进程关联的语言环境变量:
$ locale
LANG="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_CTYPE="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)
我想知道谁实际使用这些语言环境变量.
C标准函数(例如:) fwrite()和Linux系统调用是否使用它们?某些C标准函数或某些Linux系统调用的行为是否因某些语言环境变量的值而异?
或者只是某些程序可以使用这些区域设置变量?例如,我可以编写一个程序,根据LANGlocale变量的值,以不同的语言向用户显示消息.
我已经读过一些CPU重新排序指令,但这对于单线程程序来说不是问题(指令仍会在单线程程序中重新排序,但看起来好像指令是按顺序执行的),这只是一个问题用于多线程程序.
为了解决指令重新排序的问题,我们可以在代码中的适当位置插入内存屏障.
但x86 CPU是否重新排序指令?如果没有,那么就没有必要使用内存屏障了吧?
x86 assembly multithreading cpu-architecture memory-barriers
在 x86 中,当您想要访问内存地址时,您将指定一个地址,该地址将通过两个阶段转换为内存地址:分段和分页:
但是在 x64 中也使用分段吗?(我认为它没有被使用,但我不确定它是不是在所有情况下都使用,或者在某些情况下使用它)。
我已经读过操作系统使用以下方法实现调度:
我的问题是:我刚才描述的方法是实现调度的唯一方法吗?
我已经发现,在x86 CPU有以下内存屏障指令:mfence,lfence,和sfence。
x86 CPU是否仅具有这三个内存屏障指令,或者还有更多指令?
我读过有关内存屏障如何工作的不同内容。
例如,用户Johan在这个问题中的回答说,内存屏障是 CPU 执行的指令。
虽然用户Peter Cordes在这个问题中的评论说了以下关于 CPU 如何重新排序指令的内容:
它的读取速度比执行速度快,因此它可以看到即将到来的指令的窗口。有关详细信息,请参阅 x86 标签 wiki 中的一些链接,例如 Agner Fog 的 microarch pdf,以及 David Kanter 对 Intel Haswell 设计的文章。当然,如果您只是用谷歌搜索“乱序执行”,您会找到您应该阅读的维基百科文章。
所以我根据上面的评论猜测,如果指令之间存在内存屏障,CPU将看到这个内存屏障,这导致CPU不会对指令重新排序,所以这意味着内存屏障是一个“标记”让CPU看到而不是执行。
现在我的猜测是,内存屏障既充当标记又充当 CPU 执行的指令。
对于标记部分,CPU 看到指令之间存在内存屏障,这导致 CPU 不会对指令进行重新排序。
至于指令部分,CPU会执行内存屏障指令,这会导致CPU做一些诸如刷新存储缓冲区之类的事情,然后CPU会继续执行内存屏障之后的指令。
我对么?
x86 assembly instruction-set cpu-architecture memory-barriers
有些教程说EFLAGS寄存器是通用寄存器,而其他教程说它不是通用寄存器。
那么是哪一个呢?!