当一个进程执行时,PCB的内容(在内核内存空间?)被加载到CPU寄存器,状态寄存器,内核堆栈指针,用户堆栈指针等.
当存在上下文切换到另一个进程时,当前的"上下文"被存储回PCB并且切换到新PCB.
现在,当内核想要将这块PCB带回"上下文"时,它如何找到这块现在在内存中的PCB呢?什么信息可以帮助内核找到内存中的PCB?
在一些文章中,他们建议使用fistp指令以快速方式转换float-> integer.这取决于CPU的当前舍入模式,因此您必须进行设置.
但是这个舍入模式是否可以在程序运行期间被其他程序更改?通过操作系统?
更糟糕的是,这是一种可能的情况(伪代码)吗?
set_rounding_mode(ROUND_TRUNCATE);
/* process gets switched out and other process sets the rounding mode to round */
int x = round_with_fistp(0.6);
printf("%d\n", x); // prints 1
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的程序中测试一个相当线程敏感的区域,并且想知道是否有一种方法可以强制gcc在每次发出的指令后插入一个调用,以便我可以手动屈服于另一个线程?
谢谢,罗伯特
在具有2个物理x86/amd64处理器(P0 + P1)的Windows操作系统中,运行2个进程(A + B),每个进程有两个线程(T0 + T1),是否可能(甚至常见)看到以下内容:
P0:A:T0 在同一时间运行 P1:B:T0
然后,1(或是2?)上下文切换(es?)
P0:B:T1 在同一时间运行 P1:A:T1
简而言之,我想知道 - 在多处理器机器上 - 操作系统是否可以随时从任何进程调度任何线程,无论其他进程的其他线程是否已在运行.
编辑: 为了澄清愚蠢的例子,假设进程A的线程A:T0与处理器P0(和A:T1到P1)具有亲和性,而进程B的线程B:T0与处理器P1具有亲和性(和B:T1到P0) ).这些处理器是核心还是套接字可能无关紧要.
是否存在流程上下文切换的一流概念?Perfmon在Thread对象下显示上下文切换,但在Process对象下没有任何内容.
-是否有是一个模式开关即从user mode以kernel mode为了被称为一个动作context switch?
当我这样做时$(time sleep 1),我得到了:
real 0m1.001s
user 0m0.000s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
我不确定为什么sys时间是0,所以nanosleep从用户空间调用?
此外,实时是否等于上下文切换时间+实际睡眠时间(1s)?
CPU何时以及如何从内核模式切换到用户模式在X86上:它到底是做什么用的?它是如何实现这种转变的?
RTOS是否起主要作用或处理器在确定上下文切换时间方面起主要作用?在确定上下文切换时间时,这两个主要参与者之间的份额百分比是多少.
任何人都可以告诉uC/OS-II RTOS吗?
在子例程调用中,我们保存了PC的内容,以便重新启动我们的调用例程。但是,如果被调用的子例程更改了通用寄存器的值,会发生什么?如果必须访问存储在寄存器中的旧值,它不会对调用子例程造成任何问题吗?
我对上下文切换很开心.我已将示例代码复制到文件 http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html
我为OSX定义了宏_XOPEN_SOURCE.
#define _XOPEN_SOURCE
#include <stdio.h>
#include <ucontext.h>
static ucontext_t ctx[3];
static void
f1 (void)
{
puts("start f1");
swapcontext(&ctx[1], &ctx[2]);
puts("finish f1");
}
static void
f2 (void)
{
puts("start f2");
swapcontext(&ctx[2], &ctx[1]);
puts("finish f2");
}
int
main (void)
{
char st1[8192];
char st2[8192];
getcontext(&ctx[1]);
ctx[1].uc_stack.ss_sp = st1;
ctx[1].uc_stack.ss_size = sizeof st1;
ctx[1].uc_link = &ctx[0];
makecontext(&ctx[1], f1, 0);
getcontext(&ctx[2]);
ctx[2].uc_stack.ss_sp = st2;
ctx[2].uc_stack.ss_size = sizeof st2;
ctx[2].uc_link = &ctx[1];
makecontext(&ctx[2], f2, 0);
swapcontext(&ctx[0], &ctx[2]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我建造它
gcc -o …
context-switch ×10
c ×3
process ×2
assembly ×1
call ×1
embedded ×1
gcc ×1
kernel ×1
linux ×1
linux-kernel ×1
macos ×1
multitasking ×1
rtos ×1
scheduling ×1
sleep ×1
subroutine ×1
time ×1
ucontext ×1
windows ×1
x86 ×1