Sto progettando il loop di eventi per il socket socket asincrono usando epoll/devpoll/kqueue/poll/select (incluso windows-select).Progettazione e problemi del ciclo di eventi asincroni
ho due opzioni di esecuzione, funzionamento IO:
modalitànon bloccante, sondaggio su EAGAIN
- Imposta presa alla modalità non-blocking.
- Lettura/scrittura sul socket.
- Se l'operazione riesce, inviare la notifica di completamento al ciclo di eventi.
- Se ottengo EAGAIN, aggiungere socket a "select list" e polling socket.
modalità Polling: sondaggio e quindi eseguire
- presa Aggiungi per selezionare lista e polling esso.
- aspettare la notifica che è scrivibile leggibile
- lettura/scrittura
- messaggio di notifica di completamento al ciclo di eventi di sucseeds
A me sembra che prima avrebbe richiesto meno chiamate di sistema quando si utilizza in modalità normale , in particolare per scrivere sul socket (i buffer sono abbastanza grandi). Sembra anche che sarebbe possibile ridurre il sovraccarico sul numero di "select" esecuzioni, in particolare è bello quando non si ha qualcosa che si adatta bene come epoll/devpoll/kqueue.
Domande:
- Ci sono dei vantaggi del secondo approccio?
- Ci sono problemi di portabilità con operazioni non bloccanti su socket/descrittori di file su numerosi sistemi operativi: Linux, FreeBSD, Solaris, MacOSX, Windows.
Note: Si prega di non suggeriscono usando implementazioni evento-loop/presa-API
Non vedo alcun motivo per cui non si può attendere per allocare memoria un fino al bisogno di usare il primo approccio. Mi sto perdendo qualcosa? – Ioan
Suppongo di sì ma in pratica non è implementato in questo modo. Nel primo caso è necessario il buffer disponibile dai passaggi 2-4, nel secondo è necessario solo nel passaggio 3. – karunski