🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #72850

Re: Jak skutecznie odczytać wolne miejsce w buforze nadawczym portu szeregowego?

#72850
From: Adam Wysocki
Date: Wed, 11 Jul 2018 19:45
66 lines
3864 bytes
spryciarzsprytny7@gmail.com wrote:

>> 3. Jak select() zwróci writability to wyślij całą kolejkę do write() 
>>    (ale nie więcej, niż SSIZE_MAX bajtów)
> 
> Bufor portu szeregowego w Linux-e to 4KB. Przynajmniej bufor wejściowy 
> tyle ma... Natomiast SSIZE_MAX to 9223372036854775807 (w Kubuntu 18.10 
> jaki mam pod ręką - podejrzewam, że na Raspbianie jest podobnie bo to 
> też 64 bitowy system - mogę to jutro sprawdzić). Tak więc ZCW te twoje 
> zastrzeżenie w nawiasie jest bez sensu, bo SSIZE_MAX jest dużo większa 
> od całej pamięci operacyjnej...

Bo to 64-bitowy system. Na 32-bitowym masz 2GB. POSIX gwarantuje 32kB.

Sam wysyłam rozsądnie niewielkimi porcjami (zwykle do 4kB lub PIPE_BUF), 
co by write() za długo nie blokowało kopiując dane z userspace.

> W sumie to nie wiem co widzisz w tym złego (w zapisie bajt po bajcie), 

Zapis bajt po bajcie jest niewydajny. Każdy zapis powoduje przełączenie 
kontekstu i zwiększa overhead. Zrób prosty benchmark, nawet na dd.

[gof@pi ~]$ dd if=/dev/zero of=/dev/null bs=1 count=10000000
10000000+0 records in
10000000+0 records out
10000000 bytes (10 MB) copied, 12.9187 s, 774 kB/s

[gof@pi ~]$ dd if=/dev/zero of=/dev/null bs=100 count=100000
100000+0 records in
100000+0 records out
10000000 bytes (10 MB) copied, 0.209594 s, 47.7 MB/s

[gof@pi ~]$ dd if=/dev/zero of=/dev/null bs=1000 count=10000
10000+0 records in
10000+0 records out
10000000 bytes (10 MB) copied, 0.0355727 s, 281 MB/s

[gof@pi ~]$ dd if=/dev/zero of=/dev/null bs=10000 count=1000
1000+0 records in
1000+0 records out
10000000 bytes (10 MB) copied, 0.00900733 s, 1.1 GB/s

Linus kiedyś podsumował to w swoim stylu:

https://lkml.org/lkml/2012/7/6/495

> skro jest powiedziane (przez inne guru - link w mojej poprzedniej 
> wypowiedzi), że w Linux-ie port szeregowy to urządzenie znakowe, a nie 
> blokowe - przez to nie ma buforów i zapis i odczyt odbywa się po jednym 
> znaku (tak działa też klawiatura i mysz).

Urządzenie znakowe oznacza, że podstawową jednostką transmisji jest w nim 
bajt a nie, że odczyt i zapis odbywają się po jednym bajcie. Większość 
(jeśli nie każdy) układów uartopodobnych ma jakąś kolejkę / bufor, żeby 
móc wysyłać następny bajt zaraz po tym, jak wyślą poprzedni.

> W sumie trochę tego nie jarzę, bo można sprawdzić ile danych jest do 
> odczytu, a nie wiadomo ile można wysłać...

Nie spotkałem się z sytuacją, w której potrzebowałbym wiedzieć, ile mogę 
wysłać danych. Do czego jest Ci taka informacja? Masz do wysłania tyle, 
ile masz, więc wysyłasz tyle, ile możesz (na ile write() pozwoli).

-- 
[ Email: a@b a=grp b=chmurka.net ]
[ Web:   http://www.chmurka.net/ ]
Technical Details
Message-ID: <pi5mpd$sa6$1$gof@news.chmurka.net>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.chmurka.net!.POSTED.pi.v.chmurka.net!not-for-mail
References: <62ce83e9-ba03-4a59-8f59-6e4acc6ad001@googlegroups.com> <pi4u7m$j0j$1$gof@news.chmurka.net> <b861f107-de90-4db7-8b82-2473d6bfb4e2@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.chmurka.net!.POSTED.pi.v.chmurka.net!not-for-mail
From: gof@somewhere.invalid (Adam Wysocki)
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: Jak skutecznie odczytać wolne miejsce w buforze
 nadawczym portu szeregowego?
Date: Wed, 11 Jul 2018 19:45:49 +0000 (UTC)
Organization: news.chmurka.net
Message-ID: <pi5mpd$sa6$1$gof@news.chmurka.net>
References: <62ce83e9-ba03-4a59-8f59-6e4acc6ad001@googlegroups.com> <pi4u7m$j0j$1$gof@news.chmurka.net> <b861f107-de90-4db7-8b82-2473d6bfb4e2@googlegroups.com>
NNTP-Posting-Host: pi.v.chmurka.net
Mime-Version: 1.0
Injection-Date: Wed, 11 Jul 2018 19:45:49 +0000 (UTC)
Injection-Info: news.chmurka.net; posting-account="gof"; posting-host="pi.v.chmurka.net:172.24.44.20"; logging-data="28998"; mail-complaints-to="abuse-news.(at).chmurka.net"
User-Agent: tin/2.4.1-20161224 ("Daill") (UNIX) (Linux/4.4.50-v7+ (armv7l))
Cancel-Lock: sha1:b/bVhSM6ndKDJVDdpf4EY3ZUyYU=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit