维基百科说:
在计算中,抢占是暂时中断计算机系统正在执行的任务的行为,不需要它的合作,并打算在以后恢复任务。
其他消息来源说:
[...] 抢占意味着从一个进程中强行夺走处理器并将其分配给另一个进程。[操作系统 (Self Edition 1.1), Sibsankar Haldar ]
当程序在执行过程中出现中断并且调度程序选择一些其他程序执行时,就会发生程序的抢占。[操作系统:基于概念的方法,2E,DM Dhamdhere ]
所以,我的理解是,如果进程被中断(通过硬件中断,即 I/O 中断或定时器中断),并且在处理中断后调用的调度程序选择另一个进程运行(根据CPU调度算法)。如果调度器选择了被中断的进程,我们就没有进程抢占(中断不一定会导致抢占)。
但我发现许多其他来源以下列方式定义抢占:
抢占是从程序中强制释放 CPU。[操作系统:基于概念的方法,2E,DM Dhamdhere ]
您可以看到同一本书报告了两种不同的抢占定义。在后者中没有提到必须将 CPU 分配给另一个进程。根据这个定义,抢占只是“中断”的另一个名称。当硬件中断出现时,进程被中断(它从“运行”状态切换到“就绪”状态)或被抢占。
所以我的问题是:这两个定义中哪一个是正确的?我很困惑。
我想确定 printf 的时间复杂度,例如:
{
printf("%d",
i);
}
Run Code Online (Sandbox Code Playgroud)
或者:
{
printf("%c",
array[i]);
}
Run Code Online (Sandbox Code Playgroud)
假设 printf 的时间复杂度始终为 O(1) 是否正确?
[编辑] 让我们采用一个交换两个值的函数:
void swap(...)
{
tmp = x;
x = y;
y = tmp;
}
Run Code Online (Sandbox Code Playgroud)
每个赋值表达式的成本为 1(就时间复杂度而言),因此 T(n) = 1 + 1 + 1 = 3,这意味着 O(1)。但对于这个功能我能说什么呢?
void swap(...)
{
tmp = x;
x = y;
y = tmp;
printf("Value of x: %d", x);
printf("Value of y: %d", y);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下我可以说 T(n) 仍然是 O(1) 吗?