- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 C++ 将内核模拟作为我的 DSA(数据结构和算法)项目。其中会有不同的模块(进程管理器、内存管理器等)。现在我必须制作一个流程管理器,我对此只有一点点想法(比如,我可以使用队列)。任何人都可以帮助我如何在 C++ 中创建进程管理器。
最佳答案
首先制作一个调度程序(除非您将“进程管理器”理解为通常所说的“调度程序”。)您必须决定多任务处理模型,合作还是抢占。抢先可能很困难 - 使用某种中断等等......对于学校项目来说可能不必要地复杂。
如果您不知道选择哪种模式,我强烈建议合作多任务处理。这是每个进程花费一定的一小段时间,然后自行将控制权返回给调度程序的地方 - 比如说,在经历其“主循环”的一次迭代之后。通常由主循环调用进程类的某种“task()”函数来完成,task() 以“return”结束,没有正在进行的长循环。
从“任务/流程”模型开始。它应该是可加载的(比如,作为共享对象文件),还是在启动时预定义(一个类)。入口点、持久状态存储、带有有限状态机的“主循环”例程(通常实现为在各种状态之间移动的开关)。该任务通过重复启动“入口点”例程来工作。
要实现的状态可能是:
完成后,准备一个此类任务的动态队列。添加、删除、迭代、提升优先级 = 乱序调用,等等。 “调度程序”遍历所有任务并启动每个任务的“启动例程”。
准备就绪后,您可以编写通常称为“任务管理器”的程序 - 一个编辑列表的程序。从队列中删除节目、添加新节目、更改优先级、暂停等。
为了帮助您想象,您目前通常会这样写:
int main()
{
do_something1();
do_something2();
}
void do_something1()
{
//initialize
...perform stuff
int x=0;
//main loop
do {
if(condition...) {
...perform stuff
} else {
...perform other stuff
blargh(x);
x++;
}
} while(!end);
//ending
//finish...
...mop up.
}
你需要写什么:
int main()
{
//main loop
do {
do_something1();
do_something2();
} while(!global_end);
}
void do_something1()
{
static state_enum state = STATE_INI;
static int x=0;
switch(state)
{
case STATE_INI:
//initialize
...perform stuff
state = STATE_WORK1;
x=0;
break;
case STATE_WORK1:
//main loop, mode 1
...perform stuff
if(condition) state = STATE_WORK2;
if(condition2) state = STATE_END;
if(condition4) state = STATE_IDLE;
break;
case STATE_WORK2:
//main loop, mode 2
...perform stuff
blargh(x);
x++;
if(condition3) state = STATE_WORK1;
if(condition4) state = STATE_IDLE;
break;
case STATE_IDLE:
//do nothing
//don't do any stuff.
if(any_condition) state = STATE_WORK1;
break;
case STATE_END:
//finish...
...mop up.
break;
}
return;
}
...您的流程管理器将替换构成对
的静态调用的内容 do_something1();
do_something2();
带有要调用的函数的动态列表。
仅供引用,为抢占式调度系统编写应用程序要容易得多,您只需像在第一个版本中那样编写它们,而不必担心在调用之间保留状态 (static
),或返回控制权,或保留每个case 语句简短而甜美,内部有非常短的循环,展开更大的循环。但是编写调度程序本身、中断程序并保存其状态、然后恢复它并从中断的地方恢复要困难得多。
关于c++ - 流程经理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4725819/
我一直在我的观点上得到这个错误。我无法解决,因为代码类似于djangos教程,只是更改了对象名称。这是我的views.py的代码: from django.http import HttpRespon
我正在尝试做一个简单的查询,但我得到了 'Manager' object is not iterable error. 我的代码(相关部分): def sort(request): sort_
我是第一次构建 spring 应用程序。我遇到了很多并发问题,我怀疑我管理后端的方式有问题。我看到的后端代码和我见过的示例之间的唯一区别是管理器类。 在我的代码中,我有我的模型(由 hibernate
在我遇到不好的例子之前总结一下,et al:我正在尝试制作一个应用程序,我不必在所有模型中编写代码来限制对当前登录帐户的选择(I' m 不使用身份验证或帐户或登录的内置功能)。 即,我不想必须做这样的
我目前正在设计一个需要管理特定硬件设置的软件。 硬件设置如下: 系统 - 系统包含两个相同的设备,并具有相对于整个系统的某些功能。 设备 - 每个设备包含两个相同的子设备,并且具有与两个子设备相关的特
我在我的 Android 应用程序中使用 RoboGuice 3.0.1 和 RoboBlender。我想要一个全局事件管理器,并注意到 RG3.0 已经有了它,如下所述: https://githu
我正在尝试创建一个多态成像系统,它允许各种对象具有封面图像和附加图像。使用 belongs_to :imageable 创建 Image 模型是否正确?或者,我是否应该分离我的逻辑,以便为每个将继承图
我刚刚在运行 rvm get 时收到此消息 RVM can not be run with `set -o posix`, please turn it off and try again. 这也可能
我正在尝试使用 SocialAuth,并根据本指南进行设置: https://github.com/3pillarlabs/socialauth/wiki/Getting-Started-with-i
我正在尝试使用自定义用户模型和自定义用户管理器来构建 super 用户。我做了与 django 文档关于 create_superuser 方法完全相同的事情,并且在我的 shell 中,我能够使用电
我正在尝试使用 AVD 管理器启动虚拟设备,我注意到问题出现在 Android 操作系统早于 Android 6.0 (API 23) 的设备上。 我正在使用 Xamarin.Android C# (
我有两台装有 CentOS 6.5 的 PC client86-101.aihs.net 80.94.86.101 client86-103.aihs.net 80.94.86.103 clouder
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我正在使用 Terraform 代码在 AWS 中创建 Secret。我的 Jenkins 管道将每 2 小时创建一次基础设施并销毁它。 2 小时后重新创建基础设施后,AWS Secrets 不允许我
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 2年前关闭。 Improve this qu
我正在研究 GPS 功能。 我已推迟更新设置,并且正在相应 GPS 委托(delegate)内处理事件 func locationManager(manager: CLLocationManager,
我是一名优秀的程序员,十分优秀!