测试Context Switch time(进程上下文切换时间)
--------------------------------------------------
创建两个进程(实时进程)并在它们之间传送一个令牌,如此往返传送一定的次数。其中一个进程在读取令牌时就会引起阻塞。另一个进程发送令牌后等待其返回时也处于阻塞状态。发送令牌带来的开销与上下文切换带来的开销相比,可以忽略不计。 (利用管道传递令牌)
测试程序(1) 使用gettimeofday()获取当前时间
--------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <sched.h>
#include <sys/types.h>
#include <unistd.h> //pipe()
int main()
{
int x, i, fd[2], p[2];
char send = 's';
char receive;
pipe(fd);
pipe(p);
struct timeval tv;
struct sched_param param;
param.sched_priority = 0;
while ((x = fork()) == -1);
if (x==0) {
sched_setscheduler(getpid(), SCHED_FIFO, ¶m);
gettimeofday(&tv, NULL);
printf("Before Context Switch Time %u us\n", tv.tv_usec);
for (i = 0; i < 10000; i++) {
read(fd[0], &receive, 1);
write(p[1], &send, 1);
}
exit(0);
}
else {
sched_setscheduler(getpid(), SCHED_FIFO, ¶m);
for (i = 0; i < 10000; i++) {
write(fd[1], &send, 1);
read(p[0], &receive, 1);
}
gettimeofday(&tv, NULL);
printf("After Context SWitch Time %u us\n", tv.tv_usec);
}
return 0;
}
测试结果(进程切换时间不超过5us)
--------------------------------------------------
Before Context Switch Time 617087 us
After Context SWitch Time 702420 us
702420us - 617087us = 85333 us
85333us / 20000 = 4.26665 us
进程切换时间为4.26665 us
注: cpu MHz : 2801.042
测试程序(2) 使用rdtsc()获取当前时间
--------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <sys/types.h>
#include <unistd.h>
long long rdtsc()
{
__asm("rdtsc");
}
int main()
{
int x, i, fd[2], p[2];
char send = 's';
char receive;
pipe(fd);
pipe(p);
struct sched_param param;
param.sched_priority = 0;
while ((x = fork()) == -1);
if (x==0) {
sched_setscheduler(getpid(), SCHED_FIFO, ¶m);
printf("Before Context Switch Time %lld\n", rdtsc());
for (i = 0; i < 10000; i++) {
read(fd[0], &receive, 1);
write(p[1], &send, 1);
}
exit(0);
}
else {
sched_setscheduler(getpid(), SCHED_FIFO, ¶m);
for (i = 0; i < 10000; i++) {
write(fd[1], &send, 1);
read(p[0], &receive, 1);
}
printf("After Context Switch Time %lld\n", rdtsc());
}
return 0;
}
测试结果(进程切换时间不超过5us)
--------------------------------------------------
Before Context Switch Time 16208184381648
After Context Switch Time 16208424333213
16208424333213 - 16208184381648 = 239951565(clock cycle)
239951565 * 0.357009998 ns = 85665107.74074687 ns
85665107.74074687 ns / 20000 = 4283.255387037 ns = 4.283255387037 us
注: cpu MHz : 2801.042
---------------------------------------------
2 801 042 000Hz
clock cycle = 1 000 000 000 ns / 2 801 042 000 = 0.357009998ns
查看CPU性能参数
cat /proc/cpuinfo
测试程序(3) 可直接获得进程上下文切换时间
--------------------------------------------------
#include <stdio.h>
#include <stdlib.h> //drand48()
#include <sched.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h> //gettimeofday()
#include <time.h>
typedef unsigned long long u64;
double clockCycleTimeS,clockRateHZ;
/* 获取当前时间,返回秒 */
double second() {
struct timeval tv;
gettimeofday(&tv,0);
return tv.tv_sec + 1e-6 * tv.tv_usec;
}
/* 获取当前时间,返回clock cycle */
u64 rdtsc() {
u64 tsc;
__asm__ __volatile__("rdtsc" : "=A" (tsc));
return tsc;
}
/* 睡眠us微秒 */
void selectsleep(unsigned us) {
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = us;
select(0, 0, 0, 0, &tv);
}
/* 计算当前CPU的工作频率 */
void calibrate() {
double sumx = 0;
double sumy = 0;
double sumxx = 0;
double sumxy = 0;
double slope;
const unsigned n = 30;
unsigned i;
for (i=0; i<n; i++) {
double breal,real,ticks;
u64 bticks;
breal = second();
bticks = rdtsc();
selectsleep((unsigned)(10000 + drand48() * 200000));
ticks = rdtsc() - bticks;
real = second() - breal;
sumx += real;
sumxx += real * real;
sumxy += real * ticks;
sumy += ticks;
}
slope = ( (sumxy - (sumx*sumy) / n) /
(sumxx - (sumx*sumx) / n) );
clockRateHZ = slope;
clockCycleTimeS = 1.0 / slope;
printf("%3.3f MHz\n", clockRateHZ*1e-6);
}
int main()
{
calibrate();
int x, i, p1[2], p2[2], time[2];
char send = 's';
char receive;
u64 old_time;
pipe(p1);
pipe(p2);
pipe(time);
struct sched_param param;
param.sched_priority = 0;
while ((x = fork()) == -1);
if (x==0)
{
sched_setscheduler(getpid(), SCHED_FIFO, ¶m);
old_time = rdtsc();
write(time[1], &old_time, sizeof(old_time));
for (i = 0; i < 10000; i++) {
read(p1[0], &receive, 1);
write(p2[1], &send, 1);
}
exit(0);
}
else
{
u64 new_time;
sched_setscheduler(getpid(), SCHED_FIFO, ¶m);
for (i = 0; i < 10000; i++) {
write(p1[1], &send, 1);
read(p2[0], &receive, 1);
}
new_time = rdtsc();
read(time[0], &old_time, sizeof(old_time));
printf("Latency time = %3.3f us\n",
1e6 * (new_time - old_time) * clockCycleTimeS / 20000);
}
return 0;
}
测试结果(Linux-2.6.21 + RealTime Patch)
--------------------------------------------------
2801.226 MHz
Latency time = 8.129 us
分享到:
相关推荐
上下文切换是指当一个进程或线程被暂停执行,而另一个进程或线程获得CPU执行权时,处理器保存当前进程的状态(上下文),加载新进程的状态,这一过程就是上下文切换。上下文切换代价主要包括时间开销、内存消耗和I/O...
从文件的标题、描述、标签以及部分内容来看,该程序旨在测量进程上下文切换的时间消耗。以下将详细阐述涉及的相关概念和技术细节。 ### 一、上下文切换(Context Switch)简介 在操作系统中,上下文切换是指操作系统...
3. **上下文切换**:这是实际进行进程切换的过程,包括保存当前进程的上下文(CPU寄存器、程序计数器等),加载新进程的上下文,并更新进程状态。 4. **同步与通信**:在多进程环境中,进程间可能需要同步(避免...
2. **上下文切换**:上下文切换是进程切换的核心,包括保存当前进程的上下文(如寄存器状态)、加载新进程的上下文以及更新调度数据结构。在Minix中,这通常涉及中断处理和内核级的函数调用。 3. **调度器接口**:...
- **负载情况**:当对Apache服务器进行压力测试时,上下文切换次数显著增加,例如每秒平均18166.5次。这表明在高并发场景下,进程间的切换频率大大增加。 #### 五、结论 通过以上分析,我们可以看出服务器并发处理...
代码可能包括了进程创建、时间片分配、调度循环、上下文切换等核心逻辑。而“pro4.exe”可能是实验运行的可执行文件,用于模拟和测试RR算法的效果。 时间片轮转算法的优势在于它能提供较好的响应时间,适合于需要...
在设计中,我们首先对进程调度的功能进行了分析,包括记录系统中所有进程的执行情况、选择占有处理机的进程和进程上下文切换。然后,我们选择了时间片轮转和优先级法两种算法来模拟进程调度。时间片轮转法中,我们...
1. **时间开销**:通过实验可以测量从发起进程创建请求到进程真正开始执行的时间,这涉及到系统调用的处理时间、上下文切换等。 2. **资源利用率**:分析系统在创建进程时的CPU、内存利用率,以及对其他进程的影响,...
3. **上下文切换**:模拟进程在时间片结束或优先级改变时的上下文切换过程,更新进程状态和资源分配。 4. **时间模拟**:设置一个虚拟时钟来模拟实际时间的流逝,以便在时间片结束时触发调度。 5. **性能评估**:...
在测试实验中,设计了三种测试方案:第一种是测量父子进程切换时间,第二种是测量进程上下文切换时间,第三种是测量中断延迟时间。每种测试方案都包括方案设计、方案实现和测试结果与分析。 测试结果表明,Linux...
文章首先介绍了几个关键时间参数,包括错误响应时间、区间数据交换时间和进程上下文切换时间,并阐述了它们如何影响操作系统的实时性能。接着,文章详细描述了测试方法,包括测试用例的设计、测试工具的选择以及排除...
当进程调度器决定切换到另一个进程时,需要保存当前进程的上下文(CPU寄存器、内存映射等)并恢复新进程的上下文,这个过程称为上下文切换,其开销是调度的一个重要考虑因素。 6. **同步与互斥** 并发进程中可能...
此外,操作系统还需要管理每个进程的上下文切换,过多的进程可能会导致性能下降。 测试进程创建极限的过程需要谨慎进行,以免对系统稳定性造成影响。我们可以通过编写一个简单的程序,循环调用`CreateProcess`,并...
这种方法适用于交互式系统,保证了响应时间,但可能导致CPU上下文切换开销增大。 4. 高响应比优先(HRRN,High Response Ratio Next):结合等待时间和执行时间,以响应比最高的进程优先执行,既考虑了短进程又避免...
同时,理解操作系统中的一些基本概念,如上下文切换、进程通信和信号量等,也将有助于你更好地完成这个大作业。 总的来说,这个操作系统大作业将涵盖操作系统设计的核心部分,提供实践和深入理解进程调度的机会。...
4. **进程切换**:模拟进程上下文切换,更新进程状态并保存/恢复上下文信息。 5. **模拟环境**:创建并初始化一组进程,模拟它们的运行,以便测试调度算法的效果。 为了测试和验证你的实现,你可以设计一些测试用例...
3. 上下文切换机制:保存和恢复进程状态,以便在时间片结束时快速切换到下一个进程。 4. 时间片管理:维护当前时间片计数,并在达到预设值时触发调度。 通过分析和优化这些组件,作者可能已经构建了一个能够适应...
Lmbench是一个轻量级的基准测试套件,可以测量中断响应时间、上下文切换速度等关键指标,为嵌入式Linux的实时应用提供数据支持。 5. 嵌入式应用的影响 在嵌入式系统中,由于硬件资源有限且性能要求严格,Linux的...
4. **上下文切换**:如果当前进程的时间片用完,将该进程移出运行状态,保存其上下文信息,以便下次继续执行。同时,将该进程放回就绪队列的末尾。 5. **选择新进程**:选择就绪队列中的下一个进程执行,重复以上...
此外,模拟CPU执行过程时,要考虑到上下文切换的开销,即保存和恢复进程状态的过程。 在"ProcessManage"这个文件中,可能包含了实现这些功能的代码文件、测试用例和可能的数据结构定义。通过阅读和理解这段代码,你...