I believe that I did both organizations at one time or another.
Method 1
, , listen. accept. pthread_create, recv/send , . .
, . :
, . - . , . , [ ] . , recv send, , . .
: wait for input, process, send output, repeat. : sock = accept, pthread_create(sock), repeat
. , . .
2
N, N .
accept [] , , 1. , , , malloc [ mgmt] . , accept
N . , - select/poll, recv, enqueue request wait for result, select/poll, send.
, : [ ] / . , .
[] , :
// control thread for recv:
while (1) {
// (1) do blocking poll on all client connection sockets for read
poll(...)
// (2) for all pending sockets do a recv for a request block and enqueue
// it on the request queue
for (all in read_mask) {
request_buf = dequeue(control_free_list)
recv(request_buf);
enqueue(request_list,request_buf);
}
}
// control thread for recv:
while (1) {
// (1) do blocking wait on result queue
// (2) peek at all result queue elements and create aggregate write mask
// for poll from the socket numbers
// (3) do blocking poll on all client connection sockets for write
poll(...)
// (4) for all pending sockets that can be written to
for (all in write_mask) {
// find and dequeue first result buffer from result queue that
// matches the given client
result_buf = dequeue(result_list,client_id);
send(request_buf);
enqueue(control_free_list,request_buf);
}
}
// worker thread:
while (1) {
// (1) do blocking wait on request queue
request_buf = dequeue(request_list);
// (2) process request ...
// (3) do blocking poll on all client connection sockets for write
enqueue(result_list,request_buf);
}
. . recv ( ) [ ].
, , . , , . [ ], H/W, .
, " "? , [, ], . .
. / [] . , "side/extra", .
, , , .
send .
, , recv . [- ] , .
.
/ enqueue/dequeue.
, " ". .
. recv , , , recv. .
, recv syscalls []. (.. ).
.
(, 50 000), (, 100).
,
, 1 , 2, , [, , ].
1 . 2. , N, 2.
1, . , , . . /, .
, .
" " .
[ 1] [ 2] , [] "-". .
, 1 . 2 . , , .