Як частину мого курсу Uni ми були показані і просили використовувати труби для спілкування між процесами (використовуючи pipe()
і fork()
) за кілька невеликих вправ. Немає проблем з його роботою чи концепцією, але поза цими вимогами я задаюсь питанням, наскільки ефективно це писати і читати з такою трубою?
Якщо у мене є якесь значення, яке я вкладав у блок з 4 байтів, чи краще пакувати і записати 100 значень (тобто 400 байт) одразу?
Або ж продуктивність, порівнянна, якщо я роблю 100, пише кожен з 4 байтів?
Чи запускає трубопровід 400 байт в один бікприймач робить що-небудь, поки запис не буде завершено - якщо приймач просто намагається прочитати перші 4 байти, чи зможе він зробити це після того, як він написав, але до того, як закінчиться все 400?
Відповіді:
4 для відповіді № 1Труби обробляються подібно до файлів (звичайно,вони не перебувають на диску). Вони буферизовані однаково, і ручка до них обробляється аналогічно. Не намагайтеся вручну буферізати для труби; це робить це вже. Якщо ви "дійсно стурбовані", ви можете спробувати обидва способи і збирати деякі періоди роботи. Я пропоную просто писати блоки з 4 байтів, як у вас є. Не намагайтеся оптимізувати, якщо ви не знаєте, що є проблема.
1 для відповіді № 2
Я можу сказати вам анекдот. Я колись працював на веб-системі для вбудованої платформи Linux. Ми спробували труби для внутрішнього зв'язку, оскільки вони були набагато швидше, ніж сокет UNIX або TCP-сокетів. Врешті-решт, ми використовували сокети в будь-якому випадку, тому що їх було простіше використовувати в нашому застосуванні. (Ми потребували двосторонніх зв'язків і труб - лише один спосіб.)