close

Вход

Забыли?

вход по аккаунту

?

Кооперативная многозадачность

код для вставкиСкачать
Коопе т
я
оо д ч о т
Л
тел goto
о т от ет
уд
…
Коопе т
я
оо д ч о т
• Т п о о д о т , п кото о леду
д
пол ет тол ко по ле то о, к к теку
д
е
ото о отд т п о е о ое е д у
д
оо
.
т
Коопе т
я
оо д ч о т
• П е у е т коопе т
о
о о д о т : от ут т е
ео од о т
т
е
дел е е т укту д
о ект
т п к т е к
ек
mutex’о , то уп о ет
п о
о
е, о о е о пе е о код
од о д
ед
оо д
е.
Коопе т
я
оо д ч о т
• Недо т тк : е по о о т
е п ло е
от т
лу е
о
к од о
,п
од е к от ут т
о
опе
«отд т п о е о ое е ». К
е т уд е
о о о т е л
оо д о
текту
од од
д е ОС, по ол
е п о е о у пол т од у
д у то е , к к д у
д
о л опе
од од
дет её
е е
.
Соп о
• Сопрограмма
л. coroutine) — ко по е т п о
,
о о
по т е подп о
, кото
допол тел
подде
ет о е т о од
то ек
е од у к к
подп о
, о т о ку п одол е е пол е
о
е е оп еделё о о поло е
.
о
П
е
var q := new queue
coroutine produce
loop
while q is not full
create some new items
add the items to q
yield to consume
coroutine consume
loop
while q is not empty
remove some items from q
use the items
yield to produce
Ак к
•С о
ет?
ук
• setjmp/longjmp, setcontext/getcontext/makecontext/swapcontext.
•C
• libtask, libpcl, coro, lthread, libCoroutine, libconcurrency, libcoro, ribs2, and
libmill.
• C++
• Boost.Coroutine, Mordor, CO2.
Ак к
•С о
ет?
ук
• setjmp/longjmp, setcontext/getcontext/makecontext/swapcontext.
•C
• libtask, libpcl, coro, lthread, libCoroutine, libconcurrency, libcoro, ribs2, and
libmill.
• C++
• Boost.Coroutine, Mordor, CO2.
Сдел т
о
ук
– setjmp/longjmp
Сдел т
о
// Продв нуты goto
ук
– setjmp/longjmp
Сдел т
о
ук
// Продв нуты goto
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int value);
– setjmp/longjmp
Сдел т
о
ук
static jmp_buf buf;
void second(void) {
printf("second\n");
longjmp(buf,1);
}
void first(void) {
second();
printf("first\n");
}
int main() {
if (!setjmp(buf)) first(); else printf("main\n");
return 0;
}
– setjmp/longjmp
Сдел т
о
ук
– setcontext/…
Сдел т
о
ук
typedef struct ucontext {
struct ucontext *uc_link;
sigset_t uc_sigmask;
stack_t uc_stack;
mcontext_t uc_mcontext;
// ...
} ucontext_t;
– setcontext/…
Сдел т
о
ук
– setcontext/…
int setcontext(const ucontext_t *ucp);
int getcontext(ucontext_t *ucp);
void makecontext(ucontext_t *ucp, void *func(), int argc, ...);
int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
Сдел т
о
ук
int main(int argc, const char *argv[]){
ucontext_t context;
getcontext(&context);
puts("Hello world");
sleep(1);
setcontext(&context);
return 0;
}
– setcontext/…
Что-то ото ое – libcoro
• coro.h, coro.c, LICENSE.
Что-то ото ое – libcoro
typedef void (*coro_func)(void *);
typedef struct coro_context coro_context;
void coro_create (coro_context *ctx, coro_func coro, void *arg, void
*sptr, size_t ssze);
void coro_destroy (coro_context *ctx);
Что-то ото ое – libcoro
struct coro_stack
{
void *sptr;
size_t ssze;
};
int coro_stack_alloc (struct coro_stack *stack, unsigned int size);
void coro_stack_free (struct coro_stack *stack);
Что-то ото ое – libcoro
void coro_transfer (coro_context *prev, coro_context *next);
Что-то ото ое – libcoro
struct coro_context
{
ucontext_t uc;
};
Что-то ото ое – libcoro
struct coro_context
{
// ???
};
Что-то ото ое – libcoro
#define coro_jmp_buf jmp_buf
#define coro_setjmp(env) setjmp (env)
#define coro_longjmp(env) longjmp ((env), 1)
struct coro_context
{
coro_jmp_buf env;
};
Что-то ото ое – libcoro
#define coro_jmp_buf jmp_buf
#define coro_setjmp(env) _setjmp (env)
#define coro_longjmp(env) _longjmp ((env), 1)
struct coro_context
{
coro_jmp_buf env;
};
Что-то ото ое – libcoro
#define coro_jmp_buf sigjmp_buf
#define coro_setjmp(env) sigsetjmp (env, 0)
#define coro_longjmp(env) siglongjmp ((env), 1)
struct coro_context
{
coro_jmp_buf env;
};
Что-то ото ое – libcoro
struct coro_context
{
void **sp; /* must be at offset 0 */
};
Что-то ото ое – libcoro
extern pthread_mutex_t coro_mutex;
struct coro_context
{
pthread_cond_t cv;
pthread_t id;
};
Что-то ото ое – libcoro
struct coro_context
{
void *fiber;
/* only used for initialisation */
coro_func coro;
void *arg;
};
Что-то о е
ото ое – libtask
• https://swtch.com/libtask/
• https://www.ibm.com/developerworks/ru/library/os-libtask/
Что-то о е
ото ое – libtask
int taskcreate( void (*f)(void *arg), void *arg, unsigned int stacksize );
int taskyield(void);
void taskexit( int status );
void taskexitall( int status );
void tasksystem(void);
Что-то о е
ото ое – libtask
int taskdelay( unsigned int ms );
Что-то о е
ото ое – libtask
int netannounce( int proto, char *address, int port );
if((fd = netannounce(TCP, 0, atoi(argv[1]))) < 0){
fprintf(stderr, "cannot announce on tcp port %d: %s\n",
atoi(argv[1]), strerror(errno));
taskexitall(1);
}
Что-то о е
ото ое – libtask
int netaccept( int fd, char *server, int *port );
while((cfd = netaccept(fd, remote, &rport)) >= 0) {
fprintf(stderr, "connection from %s:%d\n", remote, rport);
taskcreate(proxytask, (void*)cfd, STACK);
}
Что-то о е
ото ое – libtask
int netdial( int proto, char *name, int port );
if((remotefd = netdial(TCP, server, port)) < 0) {
close(fd);
return;
}
Что-то о е
ото ое – libtask
int fdnoblock( int fd );
int fdread( int fd, void* buf, int cnt );
int fdwrite( int fd, void* buf, int cnt );
void fdwait( int fd, int rw );
Что-то о е
ото ое – libtask
https://swtch.com/libtask/tcpproxy.c
Автор
tekhnostrim
Документ
Категория
Без категории
Просмотров
22
Размер файла
184 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа