- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想知道是否有可能在 Linux 用户空间的单个进程中实现 native 代码的抢占式多任务处理。 (也就是说,在外部暂停一些正在运行的 native 代码,保存上下文,在不同的上下文中交换,然后恢复执行,所有这些都由用户空间编排但使用可能进入内核的调用。)我认为这可以使用信号来完成SIGALRM
和 *context()
系列的处理程序,但事实证明整个 *context()
系列是 async-signal-unsafe所以这种方法不能保证有效。我确实找到了 gist它实现了这个想法,所以显然它确实碰巧在 Linux 上工作,至少有时是这样,即使 POSIX 不需要它工作。要点将其安装为 SIGALRM
上的信号处理程序,这会进行多次 *context()
调用:
void
timer_interrupt(int j, siginfo_t *si, void *old_context)
{
/* Create new scheduler context */
getcontext(&signal_context);
signal_context.uc_stack.ss_sp = signal_stack;
signal_context.uc_stack.ss_size = STACKSIZE;
signal_context.uc_stack.ss_flags = 0;
sigemptyset(&signal_context.uc_sigmask);
makecontext(&signal_context, scheduler, 1);
/* save running thread, jump to scheduler */
swapcontext(cur_context,&signal_context);
}
Linux 是否提供使这种方法正确的任何保证?有没有办法使这个正确?是否有完全不同的方法来正确执行此操作?
(“在用户空间实现”并不是说我们永远不会进入内核。我的意思是与内核实现的抢占式多任务处理形成对比。)
最佳答案
您无法可靠地更改信号处理程序中的上下文。 (如果您从某个信号处理程序执行此操作,它通常在实践中会起作用,但并非总是如此,因此它是 undefined behavior )。
您可以在信号处理程序(参见 sig_atomic_t
、signal(7)、signal-safety(7) ...)中设置一些 volatile sig_atomic_t
标志(阅读 sigreturn(2))并检查该标志 < em>定期(例如,至少每几毫秒一次)在您的代码中,例如在大多数调用之前,或在您的 event loop 中如果你有一个,等等......所以它变成了合作用户空间调度。
如果您可以更改代码,则更容易做到,例如当您设计一些发出 C 代码(common practice)的编译器时,或者如果您破解您的 C 编译器以发出此类测试。然后,您将更改代码生成器,有时会在生成的代码中发出这样的测试。
您可能希望禁止阻塞 系统调用并将它们替换为non-blocking变体或包装器。另见 poll(2) , fcntl(2)使用 F_SETFL
和 O_NONBLOCK
等...
您可能希望代码生成器避免大的调用堆栈,例如像 GCC 的 -fsplit-stack
instrumentation option确实(阅读 GCC 中的 splitstacks)。
如果您生成(或编写一些)汇编程序,您可以使用这些技巧。据我所知,Go 编译器为其 goroutines 使用了类似的东西。研究你的ABI ,例如来自 here .
但是,内核启动的抢占式调度更可取(在 Linux 上仍会在进程或内核任务之间发生,请参阅 clone(2))。
附言。如果您对使用类似技巧的垃圾收集技术感兴趣,请查看 MPS和 Cheney on the MTA (例如进入 Chicken Scheme )。
关于可以在 Linux 的用户空间中实现 native 代码的抢占式多任务处理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48123215/
希望是一个简单的问题,但我没有 iOS3/不支持设备多任务处理。 我的应用程序现在设置为在后台运行(播放音频),我有一个正在运行的动画,我通过 applicationDidEnterBackgroun
在 Android 中,我有一个带有设置菜单的屏幕,当加载屏幕时,我使用 ProgressDialog 显示消息“请等待。屏幕加载时”,直到搜索完成。 我想在搜索当前打开并且 ProgressDial
我想每 5 分钟拍一张照片,但应用程序必须在后台运行。出于完全合法的原因。 这可能吗? 我愿意去天涯海角去实现我的目标,如果一个公众不能实现这个目标,一个企业实体是否可以实现这个目标。 app设计有a
我正在以编程方式创建一些 UI,其中涉及一些繁重的处理。基本上我想要的是在我的 UI 正在构建/添加到窗口时运行加载器动画。添加的 UI 是一些网格和正在加载到其中的一些图像。 到目前为止,我已经尝试
我正在编写一个录制音频的应用程序。我正在研究在进行录音(在后台)时支持多任务处理的可行性。 从我目前所读的内容来看,答案似乎是否,特别是因为该程序旨在释放在关闭时正在使用的任何系统资源。 所以我想知道
在 PHP 中,我们通常在不考虑服务器功能的情况下进行编码。现在甚至 PC 也有多个内核并处理 64 位数据。据我所知,PHP 引擎本身经过优化以利用多核。我们程序员如何才能进一步优化代码以利用多核。
我正在尝试使用 iPhone OS 4.0 的多任务处理功能。我尝试在后台播放音频但没有成功。我在 info.plist 中添加了 UIBackgroundModes 属性,并提到需要在后台播放音频。
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
当我的应用程序成为焦点应用程序时,它会收到 UIKeyboardDidShowNotification 和相关通知。但是,如果另一个应用程序专注于拆分的多任务 View ,它就不再接收它。我在模拟器中
我想知道 Lua 是否内置了抢占式多任务处理功能。我希望在我的多核系统上使用并发线程。 我研究了协程(参见 lua-users.org/wiki/CoroutinesTutorial 和 stacko
有没有办法选择加入 iOS 9 并排多任务而不选择滑入? 背景是我们的应用程序 UI 在并排模式下处理得很好,但在狭窄的滑过模式下根本无法正常工作。该应用程序主要是一个 PDF 注释器,因此从用户体验
我有一个带有 Adafruit Motor Shield 的 Arduino 作为我的机器人的一部分。我想在运行电机的同时在压电元件上播放音调。 问题是我不太清楚如何在我的代码中伪造/模拟多任务处理。
我想将 app 作为我在 ios 7 上的硕士论文,但我需要知道是否可以在后台运行相机。我需要在用户按下主页按钮后录制视频(当用户使用另一个应用程序时,它应该是汽车的交通摄像头,例如导航)。我知道这在
在我的应用程序中,我尝试获取新内容并使其保持最新,即使我的应用程序处于待机模式也是如此。为此,我想使用新的多任务处理 iOS 7 功能。 首先,我通过将 key fetch 添加到 Info.plis
在 iOS 4 中,当用户按下主页按钮时,正在运行的应用程序将保存当前状态并转到后台。但是我正在开发一个应用程序,我不希望它进入后台。我希望它自杀,就像在 iOS 3 及之前的版本中一样。我该怎么做?
我正在开发一个 iPhone 应用程序,它使用背景音频(无限循环)在应用程序进入后台后继续播放。 我的问题是我想实现一个“ sleep 定时器”,它会在指定时间后停止播放。 这可能吗?我花了一个小时寻
有谁知道在应用程序失去焦点(按下主页按钮时)后如何让音频流播放(从 AVPlayer 组件中的 webview 或)?在 iOS 4.2 中。我知道我必须阅读有关多任务处理的内容,但如果您能针对该特定
以前,如果一个人在自己的应用程序上显示一个键盘,那么他会将所有内容嵌入到 UIScrollView 中。并调整 contentInset以防止内容被键盘遮挡。 现在有了 iOS 9 上的 Split
我正在使用 Cordova 创建一个应用程序,我希望我的 iPad 应用程序能够使用这个名为“Split View”又名“Apps Side by Side”或“multitasking”的很酷的功能
我看过 WWDC 2010 关于采用多任务处理的讨论,并且我已经开始启用我们的应用程序,但是我对释放不可见 View 有疑问。 根据演讲(第 105 节 - 在 iPhone 操作系统上采用多任务处理
我是一名优秀的程序员,十分优秀!