我正在编写操作系统中的三个简单的作业。 问题是:
测量上下文切换的成本有点棘手。 lmbench基准测试是通过在一个CPU上运行两个进程,并在它们之间设置两个UNIX管道来实现的。管道只是UNIX系统中的进程可以相互通信的众多方式之一。然后第一个进程向第一个管道发出写入,并等待第二个管道的读取;在看到第一个进程等待从第二个管道读取内容时,操作系统将第一个进程置于阻塞状态,并切换到另一个进程,该进程从第一个管道读取然后写入第二个进程。当第二个进程再次尝试从第一个管道读取时,它会阻塞,因此通信的来回循环继续。通过反复测量这样的通信成本,lmbench可以很好地估计上下文切换的成本。您可以尝试使用管道或者其他一些通信机制(如UNIX套接字)重新创建类似的东西。
在具有多个CPU的系统中出现了测量上下文切换成本的一个难点;您需要在此类系统上执行的操作是确保您的上下文切换过程位于同一处理器上。幸运的是,大多数操作系统都要求将进程绑定到特定的处理器;例如,在Linux上,sched setaffinity()调用就是您正在寻找的。通过确保两个进程都在同一个处理器上,您确保测量操作系统停止一个进程并在同一个CPU上恢复另一个进程的成本。
我尝试使用sched_setaffinity()
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sched.h>
和
unsigned long mask = 1;/* processor 0*/
sched_setaffinity(getpid(),sizeof(mask),&mask);
但这不适用于我的MAC
➜ Ch6 Direct Execution gcc context\ switch.c -o context_switch -lm
context switch.c:23:3: warning: implicit declaration of function 'sched_setaffinity' is invalid in C99 [-Wimplicit-function-declaration] sched_setaffinity(getpid(),sizeof(mask),&mask);/* bind c...
1 warning generated.
Undefined symbols for architecture x86_64:
"_sched_setaffinity", referenced from:
_main in context switch-b44334.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
那么如何将两个子进程绑定到同一个处理器? 谢谢你的帮助。