Почему сегменты общей памяти работают дольше, чем неименованные каналы при передаче больших данных?
Пишу лабу по операционным системам. Требуется написать две программы, которые передают данные при помощи неименованных каналов и сегментов общей памяти. Требуется сравнить время передачи и прийти к выводу, что сегменты общей памяти при больших данных работают быстрее. Но получается наоборот. В чём проблема в моём коде? Что я делаю не так?
Код неименованных каналов:
#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