问题标签 [system-calls]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multicore - 如何控制进程在哪个核心上运行?
我可以理解如何编写一个使用多个进程或线程的程序:fork() 一个新进程并使用 IPC,或者创建多个线程并使用这些类型的通信机制。
我也理解上下文切换。也就是说,只有一个 CPU,操作系统为每个进程安排时间(并且有大量的调度算法),从而我们实现了同时运行多个进程。
现在我们有了多核处理器(或多处理器计算机),我们可以让两个进程在两个独立的内核上同时运行。
我的问题是关于最后一个场景:内核如何控制进程在哪个内核上运行?哪些系统调用(在 Linux 甚至 Windows 中)在特定内核上调度进程?
我问的原因是:我正在为学校开展一个项目,我们将在其中探索最近的计算主题——我选择了多核架构。似乎有很多关于如何在这种环境中编程(如何观察死锁或竞争条件)的材料,但关于控制单个内核本身的材料却不多。我希望能够编写一些演示程序并提供一些汇编指令或 C 代码,以达到“看,我在第二个核心上运行一个无限循环,看看那个特定核心的 CPU 利用率峰值”的效果.
任何代码示例?还是教程?
编辑:为了澄清 - 许多人说这是操作系统的目的,应该让操作系统来处理这个问题。我完全同意!但是我要问(或试图感受)操作系统实际上做了什么来做到这一点。不是调度算法,而是更多“一旦选择了一个核心,必须执行哪些指令才能让该核心开始获取指令?”
c# - 从 .NET 到单声道的系统调用
我正在尝试使用单声道进行外部系统调用。我想知道是否可以模拟下面的示例(当然我正在寻找跨平台支持)。
**更新:此代码确实适用于单声道。由于不存在对 System 命名空间的引用(不知道这是如何发生的),第一个实现不起作用,只要使用 System.Diagnostics 命名空间,此代码块就可以工作。
c - 如何使用 C 中的系统调用创建 linux 等效的“nl”命令?
我有一个练习要做,我需要用 C 编写代码,命令相当于cat和nl,只使用系统调用。给我们的系统调用是 open()、close()、read() 和 write()。
我已经完成了等效的“cat”,它似乎运行良好,现在我需要做“nl”,但我无法逐行编写。
这个想法是使用尽可能少的系统调用。
我知道我需要在缓冲区中找到“\n”,我可以做一段时间循环遍历缓冲区并找到“\n”位置(我们称之为 X),然后将 X 个字节写入标准输出。
但是循环遍历缓冲区中的所有字符以搜索行尾对我来说感觉不对,但我不知道我还能怎么做......
重要编辑:
我认为你们中的一些人错过了我的问题的重点......我不需要解释如何做到这一点,这不是我的问题。我知道该怎么做(或者有一个很好的主意,我只是还没有尝试过)。“问题”是,逐个字符地遍历缓冲区、文件或其他内容以查找行尾(无论如何)是不正确的。我并不是说这不是答案,或者我不允许这样做那样做,我只是在谈论我的想法。这样做似乎是一种奇怪的方式,仅此而已......但如果是这样的话,那就是我问题的答案。
我感谢大家的帮助:)
c - sched_setaffinity() 是如何工作的?
我试图了解 linux 系统调用 sched_setaffinity() 的工作原理。这是我的问题here的后续内容。
我有这个指南,它解释了如何使用系统调用并且有一个非常简洁(工作!)的例子。
所以我下载了 Linux 2.6.27.19内核源代码。
我对包含该系统调用的行进行了“grep”,得到了 91 个结果。没有希望。
最终,我试图了解内核如何为特定内核(或处理器)设置指令指针。
我熟悉单核单线程程序的工作原理。有人可能会发出“jmp foo”指令,这基本上将 IP 设置为“foo”标签的内存地址。但是当一个有多个内核时,必须说“在内存地址 foo 处获取下一条指令,并将指令指针设置为2 号内核开始执行”。
在汇编代码中,我们在哪里指定执行该操作的内核?
回到内核代码:这里重要的是什么?文件 'kernel/sched.c' 有一个名为 sched_setaffinity() 的函数,但返回类型“long” - 这与它的手册页不一致。那么这里重要的是什么?这些模块中的哪些显示了发出的汇编指令?什么模块正在读取“task_struct”,查看“cpus_allowed”成员,然后将其转换为指令?(我还翻阅了 glibc 源代码——但我认为它只是调用内核代码来完成这项任务。)
mmap - mmap() 内部结构
众所周知,mmap() 最重要的特性是文件映射在许多进程之间共享。但众所周知,每个进程都有自己的地址空间。
问题是内存映射文件(更具体地说,它的数据)真正保存在哪里,以及进程如何访问该内存?我的意思不是 *(pa+i) 和其他高级别的东西,而是指流程的内部。
c - 为什么我的系统调用的“cat”函数比 Linux 的“cat”慢?
我已经在 C 中使用系统调用(打开、读取和写入)来模拟 Linux 系统中的“cat”函数,它比真实的要慢...
我使用与真正的“cat”相同的缓冲区大小,并使用“strace”,我认为它进行了相同数量的系统调用。但是我的“猫”的输出比真正的“猫”要慢一点。
这是我的代码:
我正在从文件中读取(我将其作为参数传递给 main,我认为这里不需要代码),而不是使用该文件描述符调用 catPrint() 函数,输出描述符为 1,因此它打印到标准输出。
我不明白为什么它会变慢,因为我使用相同的文件进行测试,并且两者(真正的“猫”和我的)只有一个 read() 和一个 write() 用于整个文本。整个文本不应该只出现在屏幕上吗?
PS:我已将此标记为作业,尽管我在这里的问题(为什么它变慢)不是作业的一部分。我只需要使用系统调用创建一个“cat”类型的函数,就完成了。我只是对我的代码有点慢很感兴趣。
用我的愚蠢解决的问题:
我刚决定在同一个文件上调用 linux 的原始 cat 几次,一个接一个,我只是意识到它在我调用它的某些时候也很慢,就像我的一样慢自己的。我想一切都比...
很抱歉像这些人一样浪费你的时间。
c - 正确使用fork、wait、exit等
我有这个问题要解决,我不知道该怎么做,因为只有几个系统调用我们可以用来解决它,而且我看不出它们对这种情况有什么帮助。
练习:
我有一个大小为 [10][1000000] 的矩阵,其中包含整数,并且对于每一行,我使用 fork() 创建一个新进程。每个过程的想法是遍历该特定行的所有数字并找到一个特定数字,然后打印有关它的消息。这是问题的第一步,并且已经完成。第二步是按顺序打印每行中该数字的出现总数。最后,该数字出现的总数。
调用:
我可以使用的系统调用在本练习的文档中是这样描述的:
pid_t fork(void);
void exit(int status);
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
问题:
我不知道该怎么做,因为exit()
调用只允许我传递一个低于 256 的数字,如果出现的次数大于这个数字怎么办?我该如何返回这样的号码?
另一个问题:
我不完全理解两者之间的区别wait()
以及waitpid()
如何/在哪里使用另一个。除了手册页之外,是否还有更多文档可以让我查看代码示例等以便更好地理解它们?或者有人可以向我解释这些差异并提供一个证明这种差异的基本示例吗?
c - 在 C 中使用 WEXITSTATUS 宏而不是在 exit() 状态下除以 256 有什么好处?
我正在为大学做一个练习,我必须在退出时返回一个值,该值实际上是一个计数。这可能高于 255(exit() 无法处理),但老师建议使用计数永远不会超过该值的测试数据。
毕竟,我需要处理这个计数值,退出状态,我通过使用waitpid()在主进程中获取了这个值。令我惊讶的是,如果子进程返回 1,则主进程中的“真实”值是 256,2 是 512,依此类推......
我需要打印这个值,所以我简单地将它除以 256 就完成了。但是,如果我使用 WEXITSTATUS() 宏,我也会以我想要的方式获得这个值......
我查看了 C 源代码,这就是我发现的:
我知道这里发生了什么,例如,二进制的 512 是 10 0000 0000,向右移动 8 位将得到 00 0000 0010,即十进制的 2。我在这个宏中不明白的是 & 运算符以及 0xff00 似乎是一个随机数的事实(它可能不是,它来自哪里?)。这究竟是做什么的,为什么宏中有“& 0xff00”?没有它就不行吗?
这个主题的真正问题是,在我的代码中调用这个宏与除以 256 是一样的吗?
operating-system - 为什么系统调用需要切换到内核模式?
我正在为我的操作系统期末考试而学习,想知道是否有人可以告诉我为什么操作系统需要切换到系统调用的内核模式?
c - 对 mprotect 的调用过多
我正在开发一个并行应用程序(C,pthread)。我跟踪了系统调用,因为在某些时候我的并行性能很差。我的跟踪显示我的程序调用mprotect()
了很多次......足以显着减慢我的程序。
我确实分配了很多内存(使用malloc()
),但只有合理数量的调用brk()
来增加堆大小。那么为什么会有这么多电话mprotect()
呢?!