问题标签 [ucontext]
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.
c - 上下文切换两次执行相同的语句
我正在尝试了解上下文切换的工作原理以及如何在接收到特定信号后使您的进程切换上下文。这是我的代码
现在我从终端发出命令'kill -s SIGUSR1'。该进程在收到此信号后切换上下文,但问题是它两次打印“调用线程为 %d 时间” 。
例如,如果线程 1 打印“第三次调用线程1 ”并进入睡眠状态,如果我发送信号切换上下文,线程 1 正在睡眠,线程 2 开始执行,现在如果我再次发送信号切换上下文,那么线程 1 再次打印“调用线程 1第三次”。理想情况下,它应该从睡眠中醒来并增加 a 的值,对吗?为什么两次打印相同的值?
这是代码打印的输出:
接收信号 10
从线程2切换到线程1
调用thread2 1次
接收信号 10
从线程1切换到线程2
调用thread1 1次
接收信号 10
从线程2切换到线程1
调用thread2 1次
接收信号 10
从线程1切换到线程2
调用thread1 1次
请帮我解决一下这个。
linux - Linux 上下文切换内部:当进程在定时器中断之前退出时会发生什么?
当进程在定时器中断之前退出时如何在linux内核中进行上下文切换?
我知道如果进程正在运行并且发生定时器中断,那么schedule
如果设置了标志,则会自动调用函数,调度函数然后选择下一个要运行的进程。基本上在这种情况下,调度函数在当前进程的上下文中运行,但是当进程退出甚至在定时器中断之前会发生什么?在这种情况下谁调用schedule
函数?它在什么情况下运行?
c - 上下文切换 - makecontext 和 swapcontext 在这里工作(OSX)
我在上下文切换中获得了一些乐趣。我已将示例代码复制到文件 http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html
我为 OSX 定义了宏 _XOPEN_SOURCE。
我建造它
gcc -o 上下文上下文.c -g
关于获取、制作、交换上下文被弃用的问题。嗯。
当我运行它时,它只是挂起。它似乎没有崩溃。它只是挂起。
我尝试使用 gdb,但是一旦我进入交换上下文,它就是空白的。它不会跳入 f1。我只是一直按回车键,它只会将光标移动到控制台上的新行吗?
知道发生了什么吗?与使用 Mac/弃用方法有关吗?
谢谢
linux - 在信号处理程序中读取 SSE 寄存器(XMM、YMM)
我有一个 x86_64 指令"vgatherqpd %ymm7,(%r9,%ymm1,8),%ymm3"
,我需要在 Linux 的信号处理程序中在运行时构造内存地址。信号处理程序 ucontextuc_mcontext.gregs[XED_REG_R9]
给了我包含在%r9
.
但是,如何获取包含的值%ymm1
?Linux 似乎有一个 sys/ucontext.h 文件,其中包含 struct _libc_fpxreg
和_libc_xmmreg
字段,但我不确定如何理解它们。此外,没有 reg_ymm。
感谢帮助解决这个问题。
c - setcontext() 正常运行中的分段错误,但在 gdb 下运行良好
我正在尝试构建一个操作系统项目,该项目获取当前线程的上下文并进行序列化,通过网络将其发送到另一台机器,然后从线程停止的地方继续执行。(所谓的线程迁移器)。
我设法在 Linux 中完成了它,但是当我在真实环境中运行时,我总是遇到分段错误,但它在 gdb 下工作。
这可能是由于地址随机化问题,因为当我在 gdb 中打开随机化时,它显示 setcontext() 中存在分段错误。
但我只是不明白,因为文本部分不会随机化(我检查了 ucontext.mcontext.greps 中的 REG_RIP 值,它们每次都相同)。那么地址随机化崩溃的可能原因是什么?堆栈将由 ucontext 直接设置,我认为随机化不会成为问题。
我的服务器代码如下所示。
c++ - 为什么当我发出信号时会出现分段错误
处理信号时出现分段错误SIGALARM
。
这是我的代码。
这就是类定义的内容。如果我调用两个以上的函数,它将出现分段错误。
这是函数调用
如果我在主函数中删除一个t.create_thread(f3,NULL);
,它将成功运行而不会出错。但是如果我t.create_thread(func,NULL);
在主函数中添加两个,它会在swapcontext(thread_list[last_id],thread_list[current_id]);
完成后出现分段错误。
lua - 让两个 lua 线程在同一个 lua 状态下并行运行而不并发执行是否安全?
我们正在使用 lua 开发游戏服务器。
服务器是单线程的,我们将从 C++ 调用 lua。
每个 C++ 服务都会从全局 lua 状态创建一个 lua 线程,该状态由所有服务共享。
lua 线程执行的 lua 脚本将调用 ac api,后者将对远程服务器进行 rpc 调用。
然后lua线程被挂起,因为它的c函数永远不会返回。
当 rpc 响应返回时,我们将继续 c 代码,这将返回到 lua 脚本。
因此,我们将有多个 lua 线程在同一个全局 lua 状态上并行执行,但它们永远不会同时运行。而suspend不是引起的而是lua的yield函数,而是来自c端。
做这样的事情安全吗?
c - 如何通知编译器`getcontext` 可以返回多次?
getcontext
可以多次返回。例如,我绘制了一个类似于此处演示的 C 程序:
编译并运行它
没有给出预期1 2 3
,因为编译器认为只有在分配给时i
才能相等。1
comm->return_value
我可以通过定义i
volatile
来解决这个问题,但是我想要一个更规范的方法来解决这个问题。
c - makecontext 没有足够的存储空间用于堆栈
我尝试在 C 中创建一个头文件,虚拟化来自ucontext.h库的所有函数调用。
一切正常,除了函数makecontext()当我尝试调用my_makecontext()时,我收到以下消息:
但是当我使用makecontext而不是我的函数时,一切正常。
我正在努力解决它。
我的代码片段是:
test_file_for_my_funcs.c
mycoroutines.h
c - 为什么在处理ucontext时打印到stderr会导致分段错误?
我正在为操作系统课程做一个项目。任务是实现一个用于处理线程的库,类似于pthreads
,但要简单得多。它的目的是练习调度算法。最终产品是一个.a
文件。课程结束了,一切正常(就功能而言)。
不过,我对我遇到的一个问题感到好奇。在我的源文件的三个不同函数上,如果我添加以下行,例如:
我得到一个分段错误。stdout
如果改为使用,或者格式不包含任何变量,则不会发生同样的情况。
这给我留下了两个主要问题:
为什么它只发生在我的代码的三个函数中,而不是其他函数?
getcontext()
是否可以使用and创建上下文,或者使用标准文件描述符makecontext()
更改上下文?setcontext()
swapcontext()
我的直觉说这些功能可能是造成这种情况的原因。考虑到发生这种情况的代码的三个函数是具有代码其他部分切换到的上下文的函数,甚至更多。通常 bysetcontext()
用于swapcontext()
进入调度程序,用于选择另一个线程来执行。
此外,如果是这种情况,那么:
- 使用这些函数创建线程的正确方法是什么?
我目前正在执行以下操作:
这段代码可能稍作修改,但它最初是一个关于如何使用 u_context 的在线示例。