C에서 컨텍스트는 레지스터(프로그램 실행 중 데이터와 명령을 저장하는 데 사용되는 CPU 내의 작은 저장 영역), 변수 및 흐름을 포함하는 프로그램의 현재 실행 상태입니다. 작업 전환에 중요한 지침입니다.
주요 기능은 멀티태스킹을 허용하는 것입니다. 이를 통해 시스템은 프로세스 간을 효율적으로 전환할 수 있습니다.
contexts.c 파일은 여기에서 사용할 수 있습니다. 컨텍스트가 어떻게 작동하는지 보여주는 데모입니다.
이 파일의 상단에서 ucontext.h 라이브러리를 가져오는 것을 볼 수 있습니다. 실행 컨텍스트를 조작할 수 있습니다.
아래 발췌에서는 3개의 컨텍스트가 생성되고 이 3개의 컨텍스트에는 STACKSIZE 크기의 메모리가 할당되는 것을 볼 수 있습니다.
#define STACKSIZE 64 * 1024 /* tamanho de pilha das threads */ ucontext_t ContextPing, ContextPong, ContextMain;
그리고 곧 각각의 컨텍스트에서 실행될 Ping 및 Pong 기능은 다음과 같습니다.
void BodyPing(void *arg) { int i; printf("%s: inicio\n", (char *)arg); for (i = 0; i주 함수에서 malloc은 스택을 예약하는 데 사용되며 나중에 uc_stack.ss_sp를 사용하여 컨텍스트에 할당되고 swapcontext는 스택 간에 전환하는 데 사용됩니다.
int main(int argc, char *argv[]) { char *stack; printf("main: inicio\n"); getcontext(&ContextPing); stack = malloc(STACKSIZE); if (stack) { ContextPing.uc_stack.ss_sp = stack; ContextPing.uc_stack.ss_size = STACKSIZE; ContextPing.uc_stack.ss_flags = 0; ContextPing.uc_link = 0; } else { perror("Erro na criação da pilha: "); exit(1); } makecontext(&ContextPing, (void *)(*BodyPing), 1, " Ping"); getcontext(&ContextPong); stack = malloc(STACKSIZE); if (stack) { ContextPong.uc_stack.ss_sp = stack; ContextPong.uc_stack.ss_size = STACKSIZE; ContextPong.uc_stack.ss_flags = 0; ContextPong.uc_link = 0; } else { perror("Erro na criação da pilha: "); exit(1); } makecontext(&ContextPong, (void *)(*BodyPong), 1, " Pong"); swapcontext(&ContextMain, &ContextPing); swapcontext(&ContextMain, &ContextPong); printf("main: fim\n"); exit(0); }실행된 프로그램의 출력:
main: inicio Ping: inicio Ping: 0 Pong: inicio Pong: 0 Ping: 1 Pong: 1 Ping: 2 Pong: 2 Ping: 3 Pong: 3 Ping: fim Pong: fim main: fim이를 통해 컨텍스트를 변경하더라도 함수를 통해 "흐르는" 값이 유지된다는 것을 알 수 있는데, 이 경우의 예가 for index입니다.
Ping과 Pong의 컨텍스트에 대한 malloc이 있다는 것을 눈치채셨을 것입니다. 그러나 main에 대한 컨텍스트도 있다는 것을 알 수 있습니다. 왜 그것에 대한 malloc이 없습니까?
ContextMain은 메인 스레드의 스택에서 작동하므로 별도의 스택이 필요하지 않지만 Ping 및 Pong 컨텍스트에는 동적으로 할당된 자체 스택이 있습니다.
컨텍스트를 생성하고 메모리를 할당하지 않으면 스왑을 사용할 때 프로그램의 메인 스택으로 이동합니다.
이 코드는 PingPongOS "Trocas de Contexto"의 개발된 하위 프로젝트에서 발견된 Maziero 교수의 코드입니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3