Comment fonctionnent les threads ? Puis les forks ? C'est quoi la différence ? Toutes les réponses à ces questions ici !





0x01. CONCEPT



L'image est un jeu de mot, fork signifie en informatique, "processus fils" mais en anglais "fourchette", tandis que "threads" qui pourrait s'apparenté à un fil léger*, peut aussi désigner un fil... de tissus.

Pour expliquer, très sommairement la différence entre fork et thread est celle-ci:
1- le fork serait comme une bactérie, qui se reproduit : un clone est créé et les deux sont identiques
2- le threads serait plutôt comme un ovule au moment oà il y a deux parties d'une même cellule (l'oeuf)

Dans le 1er cas, il s'agit d'une séparation complète, de deux entités (programmes) pouvant être indépendant l'une de l'autre
tandis que dans le 2nd cas, ce serait plutôt comme une entité pouvant contenir deux petites entités à l'intérieur de lui.


@ RAM                                                   @ RAM
0x1000000  +---------------+         +---------------+  0x1000000
           |  Programme 1  |         |  Programme A  |
           | +-----------+ |         |               |
           | | Thread 1. | |         |               |
           | +-----------+ |         +---------------+  0x1499999
           |               |         
           | +-----------+ |         +---------------+  0x1500000
           | | Thread 2. | |         |   Fork du     |
           | +-----------+ |         |               |
           |               |         |  Programme A  |
0x2000000  +---------------+         +---------------+  0x2000000


Oui, un fork peut contenir des threads. Si les threads sont limités par la mémoire allouée pour le programme, les forks peuvent prendre plus de mémoire. Sachant que pour le calcul, ça n'est pas la mémoire le plus utile mais le temps d'exécution CPU ou GPU, les threads sont plus généralement utilisés dans les programmes demandant plus calculs, tandis que les forks plutôt dans les programmes demandant plus de ressources mémoires (pour par exemple éviter les écritures sur le disque).





0x02. FORK.C


 
[title=1][/title]
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
  pid_t pid;
  pid_t ppid;
 
  ppid=getpid();
 
  while(1)
  {
    switch(fork())
    {
      case -1:
        perror("");
        exit(1);
      case 0:
        pid=getpid();
        printf("\\n[%-5d]\\tfork\\n",pid);
        sleep(1);
        exit(1);
      default:
        printf("\\n[%-5d]\\tparent",ppid);
    }
    sleep(1);
  }
 
}
 
 




0x03. THREADS.c


 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
 
 
// Compile: g++ -pthread thread.c -o thread
 
 
void* fn_thread_type_0(void* rien)
{
  while(1)
  {
    printf("\\n[%5d]\\tthread",getpid());
    sleep(1);
  }
}
 
 
 
int main(int argc, char *argv[])
{
  pthread_t thread[4];
  int i;
 
  printf("\\n[%5d]\\tmain",getpid());
 
  for( i=0 ; i<4 ; i++ )
  {
    if( pthread_create(&thread[i], NULL, fn_thread_type_0, NULL) )
      exit(-1);
 
    pthread_join(thread[i], NULL);
  }
 
  while(1)
  {
    sleep(1);
  }
 
  return(0);
}
 



   =>   Écrit par : Nicolas, le 29 février 2016


 
Mots clés :  
  c 
  
  linux 
  
  windows 
  
  macos 
    >   Articles connexes :

Cheat SHeet OpenSSL



Durcissement de Windows



Comment gagner du temps sur Internet



/tmp et /var/log en noexec sur macOS



7412116