问题标签 [systems-programming]
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.
linux - glibc 文档和字节序
glibc 关于进程完成状态的文档指出宏 WEXITSTATUS 返回完成状态的低位 8 字节。
宏:int WEXITSTATUS (int status)
如果 WIFEXITED 的状态为真,则该宏从子进程返回退出状态值的低 8 位。
然而,/usr/include/sys/wait.h
说:
并且,/usr/include/bits/waitstatus.h
提到:
除非我的字节序概念都搞砸了,否则低8 位是怎么回事?还是 libc 假设数据以小端方式保存?
unix - 无法进入系统调用源码
我已经用 -g 选项编译了我的 freebsd libc 源代码,所以现在我可以进入 libc 函数。
但是我无法进入系统调用代码。我已经用-g编译了freebsd内核源代码。在设置断点时,gdb 会通知 .S 文件上的断点。在遇到断点时,gdb 无法进入系统调用源代码。
另外,我试过:gdb$catch syscall open
但这也行不通。
你能建议点什么吗?
谢谢。
c - 为什么使用 mmap 和 madvise 顺序逐行读取大文件比 fgets 慢?
概述
我有一个受 IO 显着限制的程序,并试图加快它的速度。使用 mmap 似乎是一个好主意,但与仅使用一系列 fgets 调用相比,它实际上会降低性能。
一些演示代码
我已经将演示压缩到了最基本的部分,针对大约 350 万行的 800mb 文件进行了测试:
使用 fgets:
800mb 文件的运行时:
地图版本:
运行时变化很大,但永远不会比 fgets 快:
其他注意事项
- 观察进程在顶部运行,memmapped 版本在此过程中产生了数千个页面错误。
- fgets 版本的 CPU 和内存使用率都非常低。
问题
- 为什么会这样?仅仅是因为 fopen/fgets 实现的缓冲文件访问比使用 madvise POSIX_MADV_SEQUENTIAL 积极预取该 mmap 更好吗?
- 是否有可能使这更快的替代方法(除了动态压缩/解压缩以将 IO 负载转移到处理器)?查看同一文件上“wc -l”的运行时,我猜可能并非如此。
c - vfork() 系统调用
我读到使用 vfork() 系统调用创建的新进程作为父地址空间中的线程执行,直到子线程不调用 exit() 或 exec() 系统调用,父进程才会被阻塞。所以我用 vfork() 系统调用写了一个程序
我得到的输出如下:
我假设 return 语句必须在内部调用 exit() 系统调用,所以我只期望输出
有人可以解释一下为什么它实际上并没有停止并连续打印无限循环。
c - c fork,exec,getpid 问题
我是 C 语言和 Linux 的新手。我有一个与 fork()、getpid() 和 exec() 函数相关的问题。我使用 fork() 编写了 ac 程序,调用我的程序的代码如下“代码:
该程序的输出如下:
子进程被创建
这是子进程的试验
子进程被创建
这是子进程的试验
现在我的问题如下:
- 为什么程序的输出显示相同的东西两次?输出应该是“创建子进程,这是子进程的试验”
- 为什么输出不符合代码?
- 我们可以有一个程序,它有 4 个进程并且所有进程执行不同的任务,例如一个进程打印“我的名字”。一个进程打印“我的年龄”,另一个进程打印“我的地址?
- 如何在主函数中创建多个进程?
- 如何控制多个进程的执行?
- 该
exec()
功能有什么作用?任何人都可以用源代码解释我的工作exec()
原理吗?fork()
getpid()
请帮助这个新手。
c - c语言中fork的工作
现在我在理解fork()
系统调用的工作时遇到了问题。我编写了以下代码:
此代码的输出如下:
现在我不明白为什么输出是这样的?
之后,我只需在我的代码中添加一行,输出就完全不同了。我的代码如下:
当我运行代码时,输出如下 2389my name is manish
现在我对fork()
呼叫的工作完全感到困惑。
我的问题如下:
- 如何
fork()
运作? - 通话后控制在哪里
fork()
? - 任何机构都可以解释为什么编写的代码输出有问题吗?
- 为什么
b
在不同地方发生的输出意味着在第一个代码中的输出b = 2260
就在输出之前,b = 0
而 的值b = 2389
不就在 之前b = 0
?
请解释我在问题中编写的代码中 fork 的工作,以便我可以正确学习它。
operating-system - 使用信号量实现 N 个进程屏障
我目前正在为之前迭代的操作系统考试进行培训,我遇到了这个问题:
实施“N 个进程屏障”,即确保一组进程中的每个进程在其各自执行的某个时间点等待其他进程到达它们的给定点。
您有以下可用操作:
init(sem,value), wait(sem) and signal(sem)
N 是任意数。我可以使它适用于给定数量的进程,但不适用于任何数量。
有任何想法吗?用伪代码回复就可以了,这不是作业,只是个人学习。
windows - 视窗系统编程
我真的很高兴能在 windows 平台上学习系统编程。我刚开始阅读“Programming Windows Fifth Edition”,我注意到它主要是面向 GUI 的。
请原谅我问了一个可能很愚蠢的问题,但不是所有这些都可以在 IDE 中使用,而不是编写数十行代码来编写 windows 窗体或下拉菜单吗?
有没有办法避免这一切并直接解决系统编程问题?
c++ - 是否可以用 C 或 C++ 实现小型磁盘操作系统?
我不想做任何这样的事情,但出于好奇,我想知道是否可以在 C 中实现“整个操作系统”(不一定像 Linux 或 Microsoft Windows 那样大,但更像是类似 DOS 的小型操作系统)和/或 C++ 不使用或使用很少的程序集。
通过实现一个操作系统,我的意思是从头开始制作一个操作系统,启动引导加载程序和内核,再到 C 或 C++ 中的图形驱动程序(以及可选的 GUI)。我已经看到通过编译器访问低级功能在 C++ 中完成了一些低级的事情。这可以为整个操作系统完成吗?
我不是在问这是否是一个好主意,我只是在问它是否有可能?
c++ - boost::thread 数据结构的大小在荒谬的一边?
编译器:linux上的clang++ x86-64。
自从我编写任何复杂的低级系统代码以来已经有一段时间了,我通常针对系统原语(windows 和 pthreads/posix)进行编程。所以,in#s和out的已经从我的记忆中溜走了。我正在boost::asio
和现在一起工作boost::thread
。
为了模拟针对异步函数执行器的同步 RPC(在请求被 ed 的地方boost::io_service
使用多个线程),我使用了 boost 同步原语。出于好奇,我决定使用原语。这就是我看到的。io::service::run
io_serviced::post
sizeof
输出:
一个互斥体 40 个字节???? ? 哇!条件变量为 88 !!! 请记住,我对这种臃肿的尺寸感到厌恶,因为我正在考虑一个可以创建数百个notification_object
's的应用程序
这种可移植性的开销水平似乎很荒谬,有人可以证明这一点吗?据我所知,这些原语应该是 4 或 8 字节宽,具体取决于 CPU 的内存模型。