【问题标题】:Threads vs fork wordlist read and hashThreads vs fork wordlist 读取和哈希
【发布时间】:2020-12-29 08:18:00
【问题描述】:

为什么在这种情况下 fork 比线程更好?对于 139 mb (rockyou.txt) 的文件,fork 是 0.5 秒,对于相同的文件和文件末尾的相同单词,使用线程是 3 秒(使用时钟 () 和普通秒表测量,线程需要更长的时间比叉子)
该程序读取单词表的每一行,对其进行哈希处理并与摘要进行比较。
这个是带叉子的

void wordlistFork(char digest[], char hashtype[], FILE *wordlist,int numberOfFork){
    int i;
    clock_t t;
    fseek(wordlist, 0L, SEEK_END);
    long fileLength = ftell(wordlist);
    fseek(wordlist, 0L, SEEK_SET);
    for(i=0;i<numberOfFork;i++){
        int pid = fork();
    if(pid==0){
            char line[512];
            long initialOffset = correctOffset(lengthOfFile*i/numberOfFork,wordlist);
            long finalOffset = correctOffset(lengthOfFile*(i+1)/numberOfFork,wordlist);
            fseek(wordlist, initialOffset, SEEK_SET);
            t = clock();
            while (initialOffset < finalOffset) {
                fscanf(wordlist,"%s\n",line);
                char tempLine[512] = {0};
                strncpy(tempLine,line,strlen(line));
                if (strcmp(hash(tempLine,hashType), digest) == 0) {
                    printf("Child %d: Trovato! hash %s %s -> %s\n",i, tipohash, digest, linea);
                    t = clock() -t;
                    double time_taken = ((double)t)/CLOCKS_PER_SEC;
                    printf("Time elapsed: %f seconds\n",time_taken);
                    system("killall hashcrack");
                    return;
                }
                initialOffset = ftell(wordlist);
            }
            printf("Child %d Found nothing.\n",i);
            exit(0);
        }
    }
    for(i=0;i<numberOfFork;i++)
        wait(NULL);
}    

这个是带线的

for(i=0;i<numberOfThreads;i++)
    pthread_create(&threads[i], NULL, (void *(*)(void *)) crack, (void *)(intptr_t) i);
for(i=0;i<numberOfThreads;i++)
    pthread_join(threads[i],NULL);  

void *crack(const int *args){
    int threadID = (int)(intptr_t)args;
    char line[512];
    FILE *wordlist = fopen(Tpath,"r");
    long initialOffset = correctOffset(fileLength*threadID/numberOfThreads,wordlist);
    long finalOffset = correctOffset(fileLength*(threadID+1)/numberOfThreads,wordlist);
    fseek(wordlist, initialOffset, SEEK_SET);
    while (initialOffset < FinalOffset) {
        fscanf(wordlist,"%s\n",line);
        char tempLine[512] = {0};
        strncpy(tempLine,line,strlen(line));
        if (strcmp(hash(tempLine,hashType), Tdigest) == 0) {
            printf("Thread %d: Found! hash %s %s -> %s\n",threadID, hashType, Tdigest, line);
            system("killall hashcrack");
            exit(0);
        }
        initialOffset = ftell(wordlist);
    }
    printf("Thread %d: found nothing.\n",threadID);
    return NULL;
}

【问题讨论】:

  • 提示:不要一遍又一遍地自虐地重铸同一个变量,只需声明一个具有该类型的局部变量,或者更好的是,更改参数的类型以匹配它的类型。
  • @tadman 问题是暂时的,暂时我认为我没有重铸任何东西。你说的是哪条线?
  • (struct params *)args 出现的次数太多了。由于这样的习惯,这段代码最终只会变得杂乱无章。由于您受到线程函数签名的约束,因此只需声明struct params* args = args_v 并将参数更改为void* v_args。瞧,不再需要重铸!
  • @tadman 我也更新了代码,如果您有任何其他建议,我会全力以赴
  • 您可以使用strncpy(tempLine, line, sizeof(tempLine)-1)“修复”该问题。但是看看会发生什么:tempLine 的初始化写入了 512 个零。然后副本写入几个字节的有用数据,并用 0 填充 tempLine 的其余部分,因为这就是 strncpy 所做的。结果:写了将近 1kb 的零,而您需要只写一个。这可能不是世界上最糟糕的低效率,但它肯定不会帮助您的表现。

标签: c multithreading fork


【解决方案1】:

您的代码的性能是不确定的,并且取决于工作完成的顺序。可能只是这样,在一种情况下首先测试文件的结尾,而在另一种情况下,首先测试文件的开头。您的代码不会强制执行任何特定的顺序,因此它严重依赖于调度顺序的怪癖。

这就像您测试使用两种不同的算法搜索相同的花园来寻找隐藏的鸡蛋一样。如果鸡蛋每次都在同一个地方,那么恰好在其搜索模式中搜索鸡蛋较早位置的算法总是会获胜,即使它不是更好的算法。

【讨论】:

  • 我的代码强制执行一个特定的顺序,有 fseek,我将文件分成 n 个部分,然后将 seek 移动到特定线程/fork 的部分
  • @helloworld 您的代码不强制执行任何顺序。每个线程或进程都有将搜索的特定文件块,并且这些线程/进程以您的代码强制执行的特定顺序运行。该文件可能会从头到尾进行搜索,也可能会从头到尾进行搜索。您的代码没有强制执行它。
  • 我不明白,我将文件分成块,我从初始偏移量读取到最终偏移量,反之亦然,但是好的,也许操作系统可以决定从最终偏移量读取偏移到初始,我不知道。但是,有什么我能做或不能做的吗?验证您在说什么或使线程做得更好
  • @helloworld 您不会从初始偏移量读取到最终偏移量。您分派了一群单独的工人,每个工人都从文件中的不同点开始。至于您是否可以做某事,在不知道您要做什么的情况下,我不知道如何回答。您的代码正在随机搜索某些东西 - 需要多长时间完全取决于运气。您可以按强制顺序进行搜索,但这不会使代码变得更好。有什么问题?您认为一种方法比另一种方法更快的结论是错误的,那么问题是什么?
  • 问题是我用 pthread 做某事可能是错误的。我有 6 个内核,每个内核都有一个文件块,并且使用指令“while (initialOffset
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 2014-06-30
  • 2019-06-05
  • 1970-01-01
  • 2012-12-11
  • 2023-04-11
  • 2019-04-04
  • 2015-04-25
相关资源
最近更新 更多