Vous êtes sur la page 1sur 43

Université Sultan Moulay Slimane –

Beni Mellal
Ecole National des Sciences
Appliquées - Khouribga

M33: Programmation Réseaux

Elément1: Multi-threading et programmation réseaux

Présentée par :F.LAASSIRI


Plan
- Sockets
- Programmation répartie avec les sockets (TCP, UDP et Multicast)
- APIs et programmation : sockets, RPC
- Introduction à la Concurrence entre processus & Exclusion Mutuelle 
- Processus et threads 
- Problématique de l’interopérabilité 
- Modélisation OSI des couches hautes (couches session, présentation et application)
- Modèles d’interactions, modèle client/serveur et middleware
- Étude d’un service applicatif spécifique (FTAM) 
- Programmations collaboratives 
Problèmes
• Deux types de problèmes peuvent se produire :

- Les données du segment sont endommagées.


- Le segment n'arrive jamais à destination.

- Réaliser un service réparti en utilisant l’interface de transport (TCP, UDP)

• L'expéditeur effectue 2 opérations :


- Il stocke dans un buffer une copie du segment qu'il vient d'envoyer
- Il arme une temporisation
Mise en œuvre du schéma client-serveur
• Rappel du schéma client-serveur
•Appel synchrone requête-réponse

Mise en œuvre

Bas niveau : utilisation directe du transport : sockets (construit sur TCP ou UDP)
Exemple : utilisation des sockets en Python, Java …………

Haut niveau : intégration dans un langage de programmation : RPC (construit sur sockets )
Exemple : RPC (Remote Procedure Call: Un modèle très répondu de communication entre des
processus d’un système distribué)
Protocoles de transmissions de données entre les clients et les serveurs

Protocole de Contrôle de Transmissions (TCP) : Transmission Control Protocol

- Fiable

- Orienté connexion (ça veut dire il permet de créer un canal orienté vers la destination avant l’envoi des données)

- Lent
Protocole de Datagramme Utilisateur (UDP): User Datagram Protocol

- Non fiable

- Non orienté connexion (c’est-à-dire il ne permet pas de créer un canal précis vers la destination avant l’envoi des
données)

- Rapide
Numéros de port
• Un numéro de port sert à identifier l'application (un processus) en cou
rs de 
communication par l'intermédiaire de son protocole de couche applic
ation  (associé au service utilisé, exemple : 80 pour HTTP).
• Pour chaque port, un numéro lui est attribué (codé sur 16 bits), ce qui
 implique 
qu'il existe un maximum de 65 536 ports (2^16) par ordinateur (et par
 protocoles  TCP et UDP). 
• Lorsqu'un processus client veut dialoguer avec un processus serveur, il
 a besoin 
de connaître le port écouté par ce dernier. Les ports utilisés par les ser
vices devant être connus par les clients, les principaux types de servic
Solutions
Sockets
* Socket désigne un canal de communication ou une interface logicielle avec le système d’exploitation, par
laquelle un processus peut envoyer ou recevoir des données, elle constitue un point d'entrée depuis lequel un
processus peut émettre et recevoir des messages à la destination ou en provenance d'autres processus. Les
sockets permettent la réception et l'émission des messages sur le réseau.

* Les sockets constituent une API (Application Programming Interface) permettant aux applications d'accéder
au réseau pour communiquer.

* Les sockets se situent juste au-dessus de la couche transport du modèle OSI (protocoles UDP ou TCP), elle-
même utilisant les services de la couche réseau
Types de socket
1 *** Stream sockets : Communication connectée : Protocole TCP
• Une socket stream permet une communication bidirectionnelle, sûre, séquencée et un flux de données sans duplication pouvant entraîner
une fragmentation des paquets transmis. Dans le domaine Internet, il s'agit du protocole TCP. dénommé SOCK_STREAM

2 ***Datagram sockets : Communication non-connectée : Protocole UDP


Une socket datagram permet une communication bidirectionnelle qui n'est pas séquencée, pas sûre, et peut éventuellement entraîner une
duplication des données. Un processus utilisant ce type de socket peut donc recevoir les données dans un ordre différent de l'ordre de
départ. Dans le domaine Internet, il s'agit du protocole UDP, dénommé SOCK_DGRAM

3 *** Sockets Raw


Une socket raw permet d'accéder au contenu brut des paquets de données. Les sockets raw ne sont pas destinés aux utilisateurs courants —
seul l’utilisateur Root peut y avoir accès sur la plupart des systèmes UNIX — et sont utilisés par exemple pour analyser le trafic d'un
réseau, dénommé SOCK_RAW

4 *** Sockets sequenced


• Une socket sequenced packet, qui ressemble à un socket stream sauf qu'il n'utilise pas de fragmentations de paquets.
• Les deux premiers sont les plus utilisés
Principe de fonctionnement
de Programmation réseau en
TCP 
•Diagramme d’échanges en mode connecté
L’échange entre un client TCP et un serveur TCP peut être schématisé de la manière suivante :
a- Création d’une socket : via la commende socket
b- Liaison d’une socket à la machine (adr. IP) : bind
c- Connexion à la machine via une socket : connect
d- Phase d’écoute : fonction listen
e- Acceptation des connexions: accept
f- Transfert de données : send, recv, read et write
g- Fermeture de la socket : close
Déclaration des sockets
• Pour que les sockets puissent communiquer entre eux , il faut indiquer pour
chaque socket :
• Domaine de communication : pour les protocoles Internet IPv4, on utilisera le domaine PF_INET ou AF_INET et
AF_INET6 pour le protocole IPv6.

• Type de socket: Pour PF_INET, on aura le choix entre :

***SOCK_STREAM (qui correspond à un mode connecté donc TCP par défaut)

*** SOCK_DGRAM (qui correspond à un mode non connecté donc UDP)

*** SOCK_RAW (qui permet un accès direct aux protocoles de la couche Réseau comme IP, ICMP, ...).
Principe de fonctionnement de Programmation réseau en TCP 
Coté serveur TCP 
import socket # importer le module socket

host, port = ('', 5566)

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socket - Créer un point de communication


# socket() crée un point de communication, et renvoie un descripteur.
# AF_INET pour IPv4 et AF_INET6 pour IPv6
# SOCK_STREAM pour le choix de protocole TCP
socket.bind((host, 5566))
# Faire un attachement de l’adresse à la socket ----- car on veut écouter à tel adresse et à tel port

• print("Le serveur est démarée !!!!!! ")


while True:
socket.listen(5) # Mettre la socket en phase d’écoute
conn, address = socket.accept() # Accepter la connexion venant du client et d'aprés la socket
print("En écoute........")
print("Un client vient de se connecter.....")

data = conn.recv(1024) # Recevoir un message sur une socket STREAM,


# il n'acceptera pas de paquet de données supérieur à 1024 octets
data = data.decode("utf8") # signifie "UCS transformation format 8 bits" est un codage de caractères informatiques
# permettant de coder l'ensemble des caractères internationaux, comme par exemple les accents, les majuscules, etc.
print(data)
conn.close()
socket.close()
Principe de fonctionnement de Programmation réseau en TCP 

Coté client TCP 


import socket
host, port = ('localhost', 5566) # nom de la machine distante et un numéro arbitraire du port de communication

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # creation d une socket pour la communication de type


TCP
try:
socket.connect((host,port)) # se connecter via socket sur HOST et le service PORT
print("Client connecté !")
data = "Bonjour le serveur, je suis le client ! : "
data = data.encode("utf8")
socket.sendall(data)
except ConnectionRefusedError:
print("Connexion au serveur échouée !")
finally:
# fermeture de la liaison
socket.close()
Résultat
Coté Serveur TCP Coté client TCP
PS D:\TP_Python> python .\client.py

PS D:\TP_Python> python .\server.py Client connecté !


 
Le serveur est démarrée !!!!!!
En écoute …………………………..
Un client vient de se connecter.....
Principe de fonctionnement de Programmation
réseau en UDP
Diagramme d’échanges en mode connecté
L’échange entre un client TCP et un serveur TCP
peut être schématisé de la manière suivante :
a- Création d’une socket : via la commende socket
b- Liaison d’une socket à la machine (adr. IP) : bind
c- Connexion à la machine via une socket : connect
d- Phase d’écoute : fonction listen
e- Acceptation des connexions: accept
f- Transfert de données : send, recv, read et write
g- Fermeture de la socket : close
II. Processeur
• Un processeur est un dispositif matériel;
• C’est une ressource de calcul;
• Le processeur fait progresser le processus qui lui est affecté;
Plusieurs processeurs ⇒ plusieurs processus exécutés simultanément
(Parallélisme)
Processus # Programme
Notion de processus (process)
• Dans un système multitâche ou multiprogrammes ou multiproces, la
ressource la plus importante d’une machine est le processeur. Cette
ressource est allouée à un et un processus sélectionnée parmi un
ensemble des processus éligibles.
• Un processeur n'est capable de traiter qu'un seul processus à la fois.
Un sous-ensemble du système d'exploitation, appelé ordonnanceur,
organise les tâches et les fait commuter tout à tour pour donner
l'impression qu'elles s'exécutent toutes simultanément.
• La vie d’un processus : création d’un processus, exécution, fin d’un
processus.
Notion de processus (process)
• Un programme informatique est un ensemble d'instructions et d’opérations destinées à être
exécutées par un ordinateur, lorsque le programme est devient en cours d’exécution s’appel
Process.
• Un processus est l'instance d'exécution d'un programme dans un certain
contexte pour un ensemble particulier de données.(C'est l'état de la machine à un instant t.)
• Processus = tâche
• Processus c’est entité dynamique qui matérialise n’importe quel programme en cours
d’exécution avec ses propres ressources physiques (mémoires, processeur, entrés/sorties……)
et logiques (données et variables…….) contrairement à un programme .
• Plusieurs processus peuvent exécuter parallèlement le même programme.
• Plusieurs processus peuvent se trouver simultanément en cours d'exécution
(multiprogrammation et temps partagé).
Types des processus
• Processus systèmes : daemon: Disk And Execution MONitor: démon : Processus
lancé par le système (init processus père des tous les processus du système).
• est démarré par le système ;
• est chargé lors du démarrage, il réside en mémoire et est en attente d’un appel;
• n’est associé à aucun terminal et son propriétaire est un utilisateur système (root)
• Processus utilisateur : Processus lancé par l’utilisateur (Commande utilisateur)
• est démarré depuis un terminal associé à un utilisateur ;
• accède aux ressources via des requêtes ou des démons.
Caractéristiques des processus
-PID - ID de processus: un numéro d'identification du processus ( PID) : numéro unique
•PPID - (Parent Process IDentifier): ID de processus parent: est l'ID de processus de son
créateur,
•Un processus est toujours créé par un processus père ;
•identifiant unique de processus parent.
•Un processus père peut avoir plusieurs processus fils.
-UID - ID utilisateur : correspond au numéro l'utilisateur
qui a lancé le processus.
-PGID - ID de groupe de processus: correspond au
numéro du groupe qui a lancé le processus.
Exécution d’un programme
États d'un processus

•Dans un système multitâche, plusieurs processus peuvent se trouver simultanément en cours


d'exécution : ils se partagent l'accès au processeur.
• Un processus peut prendre un parmi les 3 états suivants:
-Etat actif ou élu ou Exécution (running): le processus est en cours d’exécution, c’est-à-dire le
processus est à l’intérieur de processeur.
- Etat prêt ou éligible (ready): le processus a été chargé en mémoire centrale et attend son
exécution par le processeur.
- Etat en attente ou bloqué ou Endormi: Le processus a été interrompu ou attend un événement
(la fin d'une opération d'entrée/sortie, un signal, ...).
•Note : Le S.E choisit un processus qui deviendra actif parmi qui sont prêts.
États d'un processus
Ordonnancement des processus

- Consiste à organiser des traitements,


leurs enchainements entre eux, leur
planification, la synchronisation des
travaux et leur exécution.
Types d’ordonnancement
- L'ordonnancement est à envisager à trois niveaux : à court, à moyen et à long terme.
1. L'ordonnanceur à court terme aussi appelé dispacher, répartiteur ou ordonnanceur du
processeur choisit à quel processus sera alloué le processeur et pour quel laps de
temps.
2.L'ordonnancement à long terme "job schedulling" ou Le planificateur à long
terme sélectionne le processus à partir du spool, ou pool de travaux, et le charge dans
la file d' attente Ready pour exécution ultérieure.
3. L'ordonnancement à moyen terme est assuré par l'ordonnanceur de mémoire aussi appelé
permutateur ou swapper. Son rôle est de permuter les processus placés en mémoire et
ceux qui, faute de place, ont été temporairement entreposés sur le disque .
Algorithmes d'ordonnancement

• Nous distinguons plusieurs Algorithmes d'ordonnancement, les plus répondu sont :


• L'ordonnancement avec priorité
• FCFS  -  Fist-come First-served   =   Premier arrivé / Premier servi
• SJF  -  Shorted Job First   =   le job le plus court d'abord
• SRT -  Shorted Remaining Time   =   l'algorithme du temps restant le plus court
• RR  -  Round Robin   =   L'algorithme du tourniquet
Algorithmes d'ordonnancement avec priorité

• L'ordonnancement avec priorité : quand un nouveau


processus arrive dans la file d'attente des processus
prêts, sa priorité est comparée avec celle du
processus élu.
Algorithmes d'ordonnancement : FCFS

FCFS: Fist-come First-served: Premier arrivé / Premier servi :


est un algorithme de planification des processus du système
d'exploitation, les processus en file d'attente selon l'ordre de leur
arrivée. Avec le premier arrivé, premier servi, ce qui vient en premier
est traité en premier; la prochaine requête en ligne sera exécutée une
fois celle qui précède qu'elle soit terminée.
Algorithmes d'ordonnancement
• SJF: Shortest Job First : choisir la tâche la plus courte dans la file
d'attente prête ou le travail le plus court est prioritaire.
• SRT - Shorted Remaining Time = l'algorithme du temps restant
le plus court : priorité est donnée au processus dont le temps
d’exécution restant est le plus faible.
• RR - Round Robin = L'algorithme du tourniquet: Le processeur
gère une liste circulaire de processus. Chaque processus dispose d'un
quantum de temps pendant lequel il est autorisé à s'exécuter. Elle
donner le processus au CPU à tour de rôle à chaque tâche avec une
durée maximale.
Threads
• Les threads sont les entités exécutées par le CPU. Elles permettent à
plusieurs exécutions d’avoir lieu dans le même processus
• Il n’y a pas de protections entre les threads d’un même processus, Les
threads sont appelés processus légers
• Un thread est une abstraction de l’exécution
Qu’est ce qu’un thread ?

• Les threads peuvent s'exécuter sur le processeur tout comme les


processus: on peut ordonnancer des threads ou les exécuter en
parallèle sur des processeurs séparés. Chaque thread possède
son propre code à exécuter et sa propre pile d'appel. Cela
facilite beaucoup la programmation d'applications qui utilisent
plusieurs processeurs. Cependant, les threads doivent partager
leur zone de mémoire avec les autres threads du processus : ils
peuvent ainsi partager des données sans devoir passer par de
lourds systèmes de communication inter-processus.
Différence entre processus et les threads 
•  Les processus et les threads sont des séquences
d’exécution indépendantes. La principale différence est la
suivante : Les threads (du même processus) s’exécutent
dans un espace mémoire partagé, tandis que
les processus s’exécutent dans des espaces mémoire
différents.
Différence entre processus et les threads 
• Un programme en cours d’exécution est souvent appelé processus.
Un thread est un sous-ensemble du processus.
Différence entre processus et les threads 
• Un processus se compose de plusieurs threads. Un thread est la plus
petite partie du processus pouvant s’exécuter simultanément avec
d’autres parties (threads) du processus.
• Un processus est parfois appelé tâche lourde. Un thread est souvent
appelé processus léger.
• Un processus a son propre espace d’adressage. Un thread utilise
l’espace d’adressage du processus et le partage avec les
autres threads de ce processus.
Thread ?

• Tous les threads appartiennent à un processus partagent


des descripteurs de fichiers communs, une mémoire et
d’autres ressources, mais chaque thread a son propre
gestionnaire d’exceptions et sa propre pile en Python. Les
différences mentionnées ci-dessus ne sont que les
principales différences entre un processus et un thread
Différence entre processus et les threads 
Processus Thread
Définition Un programme en cours d’exécution Un thread est une petite partie d’un processus.
s’appelle un processus.
La communication La communication entre deux La communication entre deux threads est moins
processus est coûteuse et limitée. coûteuse que celle du processus.
Multitâche Le multitâche basé sur les processus Le multitâche basé sur les threads permet à un
permet à un ordinateur d’exécuter programme unique d’exécuter deux threads ou
deux ou plusieurs programmes plus simultanément.
simultanément.
Espace d’adressage Chaque processus a son espace Tous les threads d’un processus partagent le
d’adressage distinct même espace d’adressage que celui d’un
processus.
Tâche Les processus sont des tâche lourde Les threads sont des tâches légères.
Exemple Vous travaillez sur un éditeur de Vous imprimez un fichier à partir d’un éditeur de
texte, il fait référence à l’exécution texte tout en travaillant dessus, ce qui ressemble à
d’un processus. l’exécution d’un thread dans le processus
Type des Threads

• Threads utilisateurs
• Les threads utilisateurs sont des threads qui ne sont pas liés au
système d'exploitation. Ceux-ci sont gérés à l'intérieur d'un processus,
par une bibliothèque logicielle. Celle-ci s'occupe de la création et la
suppression des threads, ainsi que de leur ordonnancement. Le
système d'exploitation ne peut pas les ordonnancer et n'a donc pas
besoin de mémoriser les informations des threads. Par contre,
chaque thread doit se partager le temps alloué au processus lors de
l'ordonnancement : c'est dans un quantum de temps que
ces threads peuvent s'exécuter.
Threads utilisateurs
Type des Threads

• Threads noyaux
• Les threads noyaux sont gérés par le système d'exploitation, qui peut
les créer, les détruire ou les ordonnancer. L'ordonnancement est donc
plus efficace, vu que chaque thread est ordonnancé tel quel. Il est donc
nécessaire de disposer d'une table des threads pour mémoriser les
contextes d'exécution et les informations de chaque thread.
Threads noyaux
• Un processus dispose d un ensemble de zone mémoire (soit organisé
sous forme de page ou de segments ) pour la pile , le code et les
données . Si un processus donne naissance a un autre processus les 2
processus vive et meurt sans conséquence sur l autre.
• Un thread partage sa mémoire avec d autres thread on parle de
mémoire partagée. Si le processus qui a crée les threads est tué alors
tous ses threads le seront aussi avec lui.
• De nombreux systèmes d’exploitation offrent la possibilité d’associer
à un même processus plusieurs chemin d’exécution (Multithreading)
Exemple de Threading avec Python
import threading
import time

class MonThread (threading.Thread):


def __init__(self, jusqua): # jusqua = donnée supplémentaire
threading.Thread.__init__(self) # ne pas oublier cette ligne
# (appel au constructeur de la classe mère)
self.jusqua = jusqua # donnée supplémentaire ajoutée à la classe

def run(self):
for i in range(0, self.jusqua):
print("thread ", i)
time.sleep(0.08) # attend 100 millisecondes sans rien faire
# facilite la lecture de l'affichage

m = MonThread(10) # crée le thread


m.start() # démarre le thread,
# l'instruction est exécutée en quelques millisecondes
# quelque soit la durée du thread

for i in range(0, 10):


print("programme ", i)
time.sleep(0.1) # attend 100 millisecondes sans rien faire
# facilite la lecture de l'affichage

Vous aimerez peut-être aussi