繁体   English   中英

测量n个过程的时间

[英]Measuring time of n processes

因此,我要根据n个进程的好值来衡量它们的时间。 我从父进程派生了n个进程,它们要做的就是在一个无限循环中对从0到X的计数器进行计数,每次打印从0到X的一个计数所需要的时间。

我想这是系统编程实验室中的标准练习。

我将此实验的输出保存到一个csv文件中,以解决诸如进程的平均时间之类的问题,但是..我的输出已损坏。

我的代码:

  #include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <time.h>
#include <unistd.h>
#include <wait.h>


int exitSTATUS=0;
int *t = NULL;



void inputWarning() { printf("Falsche Eingabe"); }

long to_us(const struct timespec *spec) {
  // inversion of to_spec from above ^
  return spec->tv_sec * 1000000 + spec->tv_nsec / 1000;
}

void handleSIGINT_child(int sig){
  exitSTATUS=1;
}
void handleSIGINT_parent(int sig){
  if(t!= NULL)
          free(t);
}

void testTime(int n, int *t, int X) {
  pid_t pid;
  int i;
  for (i = 0; i < n; i++) {
    pid = fork();

    if (pid < 0) {
      // TODO: Errer handling
    } else if (pid == 0) {

      signal(SIGINT,handleSIGINT_child);

      setpriority(PRIO_PROCESS, 0, t[i]);

      while (1) {
        if(exitSTATUS>0) exit(0);
        struct timespec delta = {0, 0};
        long current_us = 0;
        // clock for higher precision on difference
        clock_gettime(CLOCK_REALTIME, &delta);
        current_us = to_us(&delta);

        int j;
        for (j = 0; j < X; j++) {
        }
           clock_gettime(CLOCK_REALTIME, &delta);
        long diff = to_us(&delta) - current_us;

        printf("%i;%lu\n", i, diff);
      }
    }
  }
  if (pid > 0) {
    signal(SIGINT,handleSIGINT_parent);
    wait(NULL);
  }
};

int main(int argc, char *argv[]) {
  if (argc >= 4) {
    int n = strtol((argv)[1], NULL, 10);
    t = malloc(n*sizeof(int));
    if (n >= 0 && argc >= n + 3) {
      int i;
      for (i = 0; i < n; i++) {
        int niceval =
            strtol(argv[i + 2], NULL, 10); // TODO : Auf parseError prüfen
        t[i] = niceval;
      }
      int X = strtol(argv[n + 2], NULL, 10);
      testTime(n, t, X);
      free(t);
      return 0;
    }
  }
  inputWarning();
  if (t != NULL) {
    free(t);
  }
  return 0;
}

在输出中,我得到一些奇怪的东西

1;4287
1;4366
1;4774
1;4243
1;4492
10;8539
0;5856
0;6558
0;6462
0;5886

第六行中的10是错误的,因为我只有三个进程。 我猜想第一个过程的输出是1,而第0个过程的输出是0。

关于这个原因,我有两个想法。 1.程序以sigint终止。 这会导致输出突然中断。 2.流程之间的变化导致削减。

无论如何,我只想让我的输出变得干净漂亮就可以使用它。

任何帮助,将不胜感激。 :)

编辑:

仅用于复制:

生成文件:

OBJ=main.o
CC=gcc
CFLAGS=-g -Wall -Wextra -std=gnu11

app: $(OBJ)
        $(CC) $(CFLAGS) -o $@ $(OBJ)

%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $<

clean:
        rm -f *.o app

和运行命令

./app 3 19 0 0 2000000 > output.csv

printf之后简单刷新stdout缓冲区就可以解决问题:

printf("%i;%lu\n", i, diff);
fflush(stdout);

无论如何,我也建议对文件进行锁定,以防在此过程中发生上下文切换:

flock(fileno(stdout), LOCK_SH);
printf("%i;%lu\n", i, diff);
fflush(stdout);
flock(fileno(stdout), LOCK_UN);

另一种方法是使用互斥锁。

这给了我正确的输出,但是它似乎总是在进程之间切换。 因此,您的输出将在每行中打印不同的过程(或2或3行取决于切换)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM