Почему сегменты общей памяти работают дольше, чем неименованные каналы при передаче больших данных?

Пишу лабу по операционным системам. Требуется написать две программы, которые передают данные при помощи неименованных каналов и сегментов общей памяти. Требуется сравнить время передачи и прийти к выводу, что сегменты общей памяти при больших данных работают быстрее. Но получается наоборот. В чём проблема в моём коде? Что я делаю не так?

Код неименованных каналов:

#define _GNU_SOURCE

#include <string.h>
#include <time.h>
#include <unistd.h>
#include <stdio.h>
#include <wait.h>
#include <math.h>
#include <stdlib.h>
#include <fcntl.h>

#define COUNT 6

int main()
{
    // fd[0]=READ, fd[1]=WRITE
    int fd[2], nread, pid, status;
    
    for (int i = 0; i < COUNT; i++)
    {
        long size = 8*pow(16, i); // bytes
        pipe(fd);
        fcntl(fd[1], F_SETPIPE_SZ, size);
        fcntl(fd[0], F_SETPIPE_SZ, size);

        pid = fork();
        
        if (pid == 0)
        {
            // READ
            int tmp_size = 0;           
            close(fd[1]);               
            char *buf = (char *)malloc((size) * sizeof(char));
            while((nread = read(fd[0], buf, size)) != 0);

            printf("%d) - %ld - Read: %ld\n", i, size, strlen(buf));
            free(buf);
            exit(1);    
        }
        else
        {
            // WRITE
            close(fd[0]);   
            
            FILE *file = i==0? fopen("program1_result", "w"): fopen("program1_result", "a+");
            char cur_time[150];
            sprintf(cur_time, "%f\t", (double)clock()/CLOCKS_PER_SEC);
            if (file != NULL) fputs(cur_time, file);
            fclose(file);
            
            char *buf = (char *)malloc((size) * sizeof(char));
            for (int j = 0; j < size; j++)
            {
                *(buf+j) = '1';
            }
            write(fd[1], buf, size);
            close(fd[1]);
            free(buf);
        }
        wait(&status);
        FILE *file = fopen("program1_result", "a+");
        char cur_time[150];
        sprintf(cur_time, "%f\n", (double)clock()/CLOCKS_PER_SEC);
        if (file != NULL) fputs(cur_time, file);
        fclose(file);

    }
}

Код сегментов общей памяти:

#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/sem.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define COUNT 6

int main()
{
    int pid, status, shmid, sem;
    char *shmPtr;

    
    key_t shm_keys[COUNT], sem_keys[COUNT];
    for (int i = 0; i < COUNT; i++)
    {
        shm_keys[i] = ftok(".", (char)i);
        sem_keys[i] = ftok(".", 'a' + i);
    }
    
    for (int i = 0; i < COUNT; i++)
    {
        int size = 8*pow(16, i);        
        if ((shmid = shmget(shm_keys[i], size + 1, IPC_CREAT | 0666)) == -1) exit(1);
        shmPtr = shmat(shmid, 0, 0);
        
        sem = semget(sem_keys[i], 1, IPC_CREAT | 0666);
        
        pid = fork();

        if (pid == 0)
        {
            while(semctl(sem, 0, GETVAL) != 1);
            char *str = (char *)malloc(size * sizeof(char));
            strcpy(str, shmPtr);

            printf("%d) - %d - Schitano: %ld, peredano: %ld\n", i, size, strlen(str), strlen(shmPtr));
            
            free(str);
            exit(1);
        }
        else
        {
            FILE *file = i==0? fopen("program2_result", "w"): fopen("program2_result", "a+");
            char cur_time[150];
            sprintf(cur_time, "%f\t", (double)clock()/CLOCKS_PER_SEC);
            if (file != NULL) fputs(cur_time, file);
            fclose(file);
            
                            
            char *str = (char *)malloc((size+1) * sizeof(char));
            for (int j = 0; j <= size; j++)
            {
                if (j == size) *(str+j) = '\0';
                else *(str+j) = '1';
            }
            strcpy(shmPtr, str);
            
            free(str);
            
            semctl(sem, 0, SETVAL, 1);          
        }   
        wait(&status);
        
        FILE *file = fopen("program2_result", "a+");
        char cur_time[150];
        sprintf(cur_time, "%f\n", (double)clock()/CLOCKS_PER_SEC);
        if (file != NULL) fputs(cur_time, file);
        fclose(file);
        
        shmdt(shmPtr);
        shmctl(shmid, IPC_RMID, NULL);
        semctl(sem, 0, IPC_RMID);
    }
    
    return 0;
}   

Результат работы 1 программы(неименованные каналы):

  • 0,00191 0,002115
  • 0,002277 0,00234
  • 0,002643 0,00303
  • 0,003325 0,003547
  • 0,003916 0,005306
  • 0,005582 0,022589

Результат работы 2 программы(СОП):

  • 0,00206 0,00237
  • 0,00275 0,00281
  • 0,003096 0,003194
  • 0,003768 0,003972
  • 0,004248 0,005733
  • 0,006183 0,04059

Ответы (0 шт):