IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

context switching dans un simple code java


Sujet :

Java

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut context switching dans un simple code java
    Bonjour tous le monde,

    j'ai toujours entendu que le context switch s'effectue lors d'une operation I/O, ou un synchronised/lock ou chagement de priorite du thread etc.

    Dans mon exemple ci dessous, n'ayant que 4 cores disponibles sur mon ordinateur je m'attends a ce que seulement 4 threads sur 5 soit en etat "running" et que le 5 eme ne soit jamais execute et pourtant tous les 5 ont ce meme etat.
    J'en conclu donc qu'il y a bien des context switchs entre mes 5 threads.

    Mes questions sont donc :

    1. Pourquoi l'OS effectue tout de meme un context switch sachant que je n'ai ni I/O, ni synchronized etc ?

    2. On a l'habitude dans certain cas bien precis d'utiliser un spin lock pour eviter les contexts switch mais j'en conclu que ce n'est donc pas fiable ?

    3. J'ai lu quelque part que l'OS a partir d'un certain nombre de temps dans un spin lock effectue tous de meme un context switch ? qu'en pensez vous ?

    4. Une de mes hypothese est que un core puisse en faite execute plus que un thread et que le context switch s’effectue entre les tasks d’un meme core? Cela ne m’explique toujours pas que est ce que le trigger de ce context switch?



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Tester {
     
        public static final int NUMBER_OF_THREADS = 5;
        public static void main(String[] args) {
     
            Runnable r = () -> {
                int i = 0;
                while (true) {
                    int i = 1 + 1;
                }
            };
     
            for (int i = 0; i < NUMBER_OF_THREADS; i++) {
                Thread t = new Thread(r, "Thread_" + i);
                t.start();
            }
        }
    }

  2. #2
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut


    4 : Le nombre de thread n'est pas liés aux nombre de coeurs, comme expliqué ici (c'est pour du C, mais le principe est le même).
    Tu peux donc en théorie faire tourner 4000 thread sur 1 seul coeur.

    De plus, si je me rappelle bien de mes cours d'OS, il n'y a pas de changement de context entre les threads. Les threads partagent tous le même context (celui à partir duquel ils ont été créés).
    Le changement de context à lieu lors de changement entre process.
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Et pour information, l'OS va forcément interrompre les threads de temps en temps même s'ils ne le font pas eux-mêmes, puisqu'il lui incombe de simuler que tout ce qui peut être en train de tourner soit en train de tourner simultanément.

    On parle de 4 cœurs avec les ordinateurs modernes, mais il n'y a pas si longtemps, on avait des ordinateurs avec un seul cœur et qui faisaient tourner Windows XP. Ça ne les empêchait pas d'avoir une trentaine de programmes qui faisaient leur travail en même temps, qu'ils fassent ou pas des I/O. L'OS se contente simplement de les interrompre régulièrement pour confier le processeur au prochain programme qui attend son tour. Cela étant dit, l'OS qui interrompt le processeur, c'est une I/O.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par thelvin Voir le message
    On parle de 4 cœurs avec les ordinateurs modernes, mais il n'y a pas si longtemps, on avait des ordinateurs avec un seul cœur et qui faisaient tourner Windows XP. Ça ne les empêchait pas d'avoir une trentaine de programmes qui faisaient leur travail en même temps, qu'ils fassent ou pas des I/O. L'OS se contente simplement de les interrompre régulièrement pour confier le processeur au prochain programme qui attend son tour. Cela étant dit, l'OS qui interrompt le processeur, c'est une I/O.
    Donc l'equation 1 core = 1 execution n'est pas exacte ? Si un core peux executer en parrallel reel plusieurs tasks, pourquoi insistons-nous sur le fait qu'il faut avoir dans l'ideal un thread par core si ce n'est pour eviter des context switches ?

  5. #5
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    Ton coeur va simuler du parallèle :
    • Il va exécuter la tache 1 pendant 10ms
    • Puis interruption
    • puis tâche 2 pendant 20ms
    • Puis interruption
    • tâche 3 pendant 11ms
    • interruption
    • re-tâche 2 pendant 15ms
    • etc...

    Ce qui fait qu'à échelle humaine, tu n'aperçois pas ces opérations et les tâches se déroulent en parallèle.

    Mais effectivement si tu veux optimiser au maximum les capacités, en ne méttant qu'1 thread (tâche) par coeur, tu évite les instant d'interruption.

    NB : Avec des fréquences supérieures au GHz de nos jours, les durées des tâches sont pas en ms mais plutôt en micro
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par Drowan Voir le message
    Ton coeur va simuler du parallèle :
    • Il va exécuter la tache 1 pendant 10ms
    • Puis interruption
    • puis tâche 2 pendant 20ms
    • Puis interruption
    • tâche 3 pendant 11ms
    • interruption
    • re-tâche 2 pendant 15ms
    • etc...

    Ce qui fait qu'à échelle humaine, tu n'aperçois pas ces opérations et les tâches se déroulent en parallèle.

    Mais effectivement si tu veux optimiser au maximum les capacités, en ne méttant qu'1 thread (tâche) par coeur, tu évite les instant d'interruption.

    NB : Avec des fréquences supérieures au GHz de nos jours, les durées des tâches sont pas en ms mais plutôt en micro

    On est donc d'accord il n'existe pas de reel parallelisme sur un seul core comme l'a ete di precedement. Un core ne peux execute qu'une et unique tache a un temps t
    En revenant a mes questions d'origines, comment expliquer qu'il y est un context switch sur mon petit code sachant que je n'ai pas de I/O, synchrnoized etc ?

  7. #7
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    cf : wikipedia (en)
    Le context switch peut être déclencher par le séquenceur. Il peut alors avoir lieu ni sur une I/O ni un synchronized.
    Ce qui permet d'éviter qu'un processus ne monopolise un coeur.

    Ou alors je comprend pas ta question
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  8. #8
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par Drowan Voir le message
    cf : wikipedia (en)
    Le context switch peut être déclencher par le séquenceur. Il peut alors avoir lieu ni sur une I/O ni un synchronized.
    Ce qui permet d'éviter qu'un processus ne monopolise un coeur.

    Ou alors je comprend pas ta question
    L'article de Wikipedia parle du context switch a l'echelle d'un processus. Est ce la meme logique a l'echelle d'un thread ?

    Si oui, un spin lock ne peux que reduire le nombre de context switch mais ne pourra jamais les empecher totalement ?

  9. #9
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    cf : https://fr.wikipedia.org/wiki/Commutation_de_contexte
    C'est la même logique à l'echelle du thread (appelé processus léger dans l'article). Dans l'article anglais il ne détail pas la différence.
    La seule différence et le temps/la complexité du context switch car un thread partage le même espace mémoire que son père.
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Yonito Voir le message
    Si oui, un spin lock ne peux que reduire le nombre de context switch mais ne pourra jamais les empecher totalement ?
    Ça a toujours été la seule idée.

    Le spinlock évite un context switch qui aurait été certain avec d'autres formes de synchronisation si le verrou n'est pas libre.

    Mais il ne change rien au fait qu'un thread se fait interrompre comme tout le monde pour laisser le microprocesseur aux autres programmes qui en ont besoin. C'est un état de fait qui n'a rien à voir avec la question d'accès aux ressources partagées.

    Le spinlock lui, ne s'intéresse à rien d'autre que l'accès aux ressources partagées. Normal donc que la question du spinlock ne s'intéresse pas aux problématiques générales.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    OK, merci a tous je cloture cette discussion !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/02/2013, 16h34
  2. insertion date dans access avec code java
    Par voyageur dans le forum Access
    Réponses: 3
    Dernier message: 20/06/2006, 21h36
  3. Du PL/SQL dans du code Java
    Par tikiwine dans le forum JDBC
    Réponses: 12
    Dernier message: 02/03/2006, 16h16
  4. [Forms 9i] Integrer du code java dans un bloc PL/SQL
    Par mohmanjdo dans le forum PL/SQL
    Réponses: 2
    Dernier message: 07/02/2006, 13h54
  5. [CVS]Java Project dans un Simple Project?
    Par tomburn dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 08/04/2005, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo