Heim  >  Artikel  >  Backend-Entwicklung  >  Dia e – Kontexte in C verstehen

Dia e – Kontexte in C verstehen

Linda Hamilton
Linda HamiltonOriginal
2024-10-21 08:08:02362Durchsuche

Dia e - Entendendo contextos em C

In C ist Kontext der aktuelle Ausführungsstatus eines Programms, einschließlich Registern (kleine Speicherbereiche innerhalb der CPU, die zum Speichern von Daten und Anweisungen während der Programmausführung verwendet werden), Variablen und des Ablaufs von Anweisungen, entscheidend für den Aufgabenwechsel.

Kontextwechsel für Betriebssysteme

Die Hauptfunktion besteht darin, Multitasking zu ermöglichen. Dadurch wird sichergestellt, dass das System effizient zwischen Prozessen wechseln kann.

Die contexts.c-Datei wurde hier zur Verfügung gestellt. Es ist eine Demonstration, wie Kontexte funktionieren.

Ganz oben in dieser Datei sehen wir den Import der ucontext.h-Bibliothek. Es ermöglicht Ihnen, den Ausführungskontext zu manipulieren.

Im folgenden Auszug sehen wir, dass drei Kontexte erstellt werden und diesen drei Kontexten Speicher in der Größe von STACKSIZE zugewiesen wird.

#define STACKSIZE 64 * 1024 /* tamanho de pilha das threads */

ucontext_t ContextPing, ContextPong, ContextMain;

Und kurz darauf die Ping- und Pong-Funktionen, die in ihren jeweiligen Kontexten ausgeführt werden:

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);
}

/*****************************************************/

In der Hauptfunktion wird malloc verwendet, um die Stapel zu reservieren, wo sie später mit uc_stack.ss_sp dem Kontext zugewiesen werden, und swapcontext wird verwendet, um zwischen ihnen zu wechseln.

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);
}

Ausgabe des ausgeführten Programms:

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

Damit können wir sehen, dass auch beim Ändern der Kontexte die Werte, die durch die Funktion „fließen“, erhalten bleiben, ein Beispiel ist in diesem Fall der for-Index.

Sie haben vielleicht bemerkt, dass es einen Malloc für den Ping- und Pong-Kontext gibt, aber wir sehen, dass es auch einen Kontext für Main gibt. Warum gibt es dafür keinen Malloc?

ContextMain benötigt keinen separaten Stapel, da es auf dem Stapel des Hauptthreads ausgeführt wird, während Ping- und Pong-Kontexte über eigene dynamisch zugewiesene Stapel verfügen.

Wenn ich einen Kontext erstelle und ihm keinen Speicher zuordne, wird er bei Verwendung von Swap auf den Hauptstapel des Programms verschoben.

Dieser Code stammt von Professor Maziero und ist im entwickelten Teilprojekt von PingPongOS „Trocas de Contexto“ zu finden.

Das obige ist der detaillierte Inhalt vonDia e – Kontexte in C verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn