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 < 4; i++) { printf("%s: %d\n", (char *)arg, i); swapcontext(&ContextPing, &ContextPong); } printf("%s: fim\n", (char *)arg); swapcontext(&ContextPing, &ContextMain); } /*****************************************************/ void BodyPong(void *arg) { int i; printf("%s: inicio\n", (char *)arg); for (i = 0; i < 4; i++) { printf("%s: %d\n", (char *)arg, i); swapcontext(&ContextPong, &ContextPing); } printf("%s: fim\n", (char *)arg); swapcontext(&ContextPong, &ContextMain); } /*****************************************************/
주 함수에서 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 인덱스입니다.
Ping 및 Pong 컨텍스트에 대한 malloc이 있다는 것을 눈치채셨을 수도 있지만, main에 대한 컨텍스트도 있다는 것을 알 수 있는데 왜 그에 대한 malloc이 없나요?
ContextMain은 메인 스레드의 스택에서 작동하기 때문에 별도의 스택이 필요하지 않지만 Ping 및 Pong 컨텍스트에는 동적으로 할당된 자체 스택이 있습니다.
컨텍스트를 생성하고 메모리를 할당하지 않으면 스왑을 사용할 때 프로그램의 메인 스택으로 이동합니다.
이 코드는 PingPongOS "Trocas de Contexto"의 개발된 하위 프로젝트에서 발견된 Maziero 교수의 코드입니다.
위 내용은 Dia e - C의 컨텍스트 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!