Commits

Dimitris Leventeas committed 1ddbb40

Initial Release

Comments (0)

Files changed (11)

Binary file added.

+\documentclass[hyperref={pdfpagelabels=false}]{beamer}
+\usetheme{Antibes}
+
+\usepackage[english,greek]{babel}
+\usepackage[utf8x]{inputenc}
+\usepackage{kerkis}
+\usepackage{amssymb}
+
+
+\usepackage{textcomp}
+\usepackage{setspace}
+
+\hypersetup{
+    bookmarks=false,         % show bookmarks bar?
+    unicode=true,           % non-Latin characters in Acrobat’s bookmarks
+    pdftoolbar=true,        % show Acrobat’s toolbar?
+    pdfmenubar=true,        % show Acrobat’s menu?
+    pdffitwindow=false,     % window fit to page when opened
+    pdfstartview={FitH},    % fits the width of the page to the window
+    pdftitle={Global Interpreter Lock},      % title
+    pdfauthor={Dimitris Leventeas},     % author
+    pdfsubject={Python},   % subject of the document
+    pdfcreator={Dimitris Leventeas},   % creator of the document
+    pdfproducer={Dimitris Leventeas}, % producer of the document
+    pdfkeywords={Python, TasPython}, % list of keywords
+    pdfnewwindow=true,      % links in new window
+    colorlinks=false,       % false: boxed links; true: colored links
+    linkcolor=red,          % color of internal links
+    citecolor=green,        % color of links to bibliography
+    filecolor=magenta,      % color of file links
+    urlcolor=cyan           % color of external links
+}
+
+
+\usepackage{listings}
+\definecolor{keywords}{RGB}{255,0,90}
+\definecolor{comments}{RGB}{60,179,113}
+\lstset{language=Python,
+    otherkeywords={\ , \}, \{},
+    basicstyle=\ttfamily\small\setstretch{1},
+    showspaces=false,
+    showstringspaces=false,
+    alsoletter={1234567890},
+    showtabs=false,
+    emph={access,and,break,class,continue,def,del,elif,else,%
+    except,exec,finally,for,from,global,if,import,in,is,%
+    lambda,not,or,pass,raise,return,try,while},
+    emphstyle=\color{black}\bfseries,
+    emph={[2]True, False, None, self},
+    emphstyle=[2]\color{green},
+    emph={[3]from, import, as},
+    emphstyle=[3]\color{blue},
+    morecomment=[s]{"""}{"""}, 
+    upquote=true,
+    commentstyle=\color{gray}\slshape, 
+    framexleftmargin=1mm, framextopmargin=1mm, frame=shadowbox,
+    stringstyle=\color{green},
+    keywordstyle=\color{keywords},
+    rulesepcolor=\color{blue},
+    emph={[4]1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
+    emphstyle=[4]\color{blue},
+    literate=*{:}{{\textcolor{blue}:}}{1}%
+	{=}{{\textcolor{blue}=}}{1}%
+	{-}{{\textcolor{blue}-}}{1}%
+	{+}{{\textcolor{blue}+}}{1}%
+	{*}{{\textcolor{blue}*}}{1}%
+	{!}{{\textcolor{blue}!}}{1}%
+	{(}{{\textcolor{blue}(}}{1}%
+	{)}{{\textcolor{blue})}}{1}%
+	{[}{{\textcolor{blue}[}}{1}%
+	{]}{{\textcolor{blue}]}}{1}%
+	{<}{{\textcolor{blue}<}}{1}%
+	{>}{{\textcolor{blue}>}}{1},%
+    framexleftmargin=1mm, framextopmargin=1mm, frame=shadowbox, rulesepcolor=\color{blue},#1
+    }
+
+\title{\textlatin{Global Interpreter Lock}}
+\author{Δημήτρης Λεβεντέας}
+
+\institute{\begin{figure}[H]
+\includegraphics[scale=0.25]{taspython.png}
+\end{figure}}
+%\selectlanguage{greek}
+\date[]{\today}
+
+\pdfinfo{%
+  /Title    (Introduction to Python)
+  /Author   (Dimitris Leventeas)
+  /Creator  (Dimitris Leventeas)
+  /Producer (Dimitris Leventeas)
+  /Subject  (Python)
+  /Keywords (introduction, Python)
+}
+
+\newtheorem{ntheorem}{Ορισμός}[section]
+
+\begin{document}
+
+\section{Εισαγωγή}
+
+\begin{frame}
+\titlepage
+\end{frame}
+
+\subsection{\textlatin{import this}}
+
+\frame
+{
+\frametitle{\textlatin{import this}}
+%  \begin{block}
+  \begin{itemize}
+   \item Εύκολη
+      \begin{itemize}
+	\item Εκμάθηση
+	\item Αναγνωσιμότητα
+	\item Συντήρηση
+      \end{itemize}
+   \item Γρήγορη Ανάπτυξη Εφαρμογών
+   \item Επεκτάσιμη
+   \item Ανοικτού Κώδικα
+   \item Παίζει σχεδόν παντού
+   \item Ώριμη
+   \item Όχι πια \textlatin{segmentation faults}
+  \end{itemize}
+%  \end{block}
+}
+
+
+
+\subsection{\textlatin{import that}}
+
+\frame
+{
+\frametitle{\textlatin{import that}}
+  \begin{itemize}
+   \item Ταχύτητα
+   \item \textlatin{Global Interpreter Lock}
+  \end{itemize}
+%  \end{block}
+}
+
+\frame
+{
+\frametitle{Η ελπίδα -- Το προσεχές μέλλον}
+  \begin{itemize}
+   \item \textlatin{Google -- Unladen Swallow}
+   \item \textlatin{New Global Interpreter Lock}
+  \end{itemize}
+%  \end{block}
+}
+
+\frame
+{
+\frametitle{Πειράματα}
+  
+\begin{figure}[ht]
+ \centering
+ \includegraphics[scale=0.50]{./experiments.jpg}
+ % experiments.jpg: 420x336 pixel, 96dpi, 11.11x8.89 cm, bb=0 0 315 252
+ \caption{Πειράματα}
+ \label{fig:experiments}
+\end{figure}
+
+%  \end{block}
+}
+
+
+\section{Παράλληλη Επεξεργασία με νήματα}
+
+\subsection{Εισαγωγή}
+
+\frame
+{
+\frametitle{Βασικές Έννοιες}
+  
+  \begin{ntheorem}
+    \alert{Παράλληλη Επεξεργασία} είναι η εκτέλεση περισσότερων του ενός επί μέρους υπολογισμών ταυτόχρονα.
+  \end{ntheorem}
+
+  \begin{ntheorem}
+    \alert{Νήματα} εκτέλεσης προκύπτουν όταν από ένα πρόγραμμα χωρίζεται σε επιμέρους υπολογισμούς που μπορούν να εκτελεστούν ταυτόχρονα (ή δεν μας ενδιαφέρει ή σειρά τους).
+  \end{ntheorem}
+
+}
+
+\frame
+{
+\frametitle{Βασικές Έννοιες (2)}
+
+  \begin{ntheorem}
+    \alert{Αμοιβαίος αποκλεισμός} \textlatin{(Mutual exclusion - mutex)} είναι αλγόριθμοι που εφαρμόζονται στον σύγχρονο προγραμματισμό για να αποφευχθεί η ταυτόχρονη χρήση ενός πόρου.
+  \end{ntheorem}
+
+  \begin{ntheorem}
+    \alert{Σημαφόρος} (\textlatin{Semaphore}) είναι μια προστατευόμενη μεταβλητή που χρησιμοποιείται για να ελεγχθεί η πρόσβαση σε έναν κοινόχρηστο πόρο.
+  \end{ntheorem}
+}
+
+
+\frame
+{
+\frametitle{Νήματα σε \textlatin{Python}}
+  
+  \begin{itemize}
+   \item Αποτελούν νήματα του διερμηνευτή της \textlatin{Python}
+   \item Αυτόματη διαχείριση από το λειτουργικό σύστημα
+   \item Δεν υπάρχει ειδικός χρονοπρογραμματιστής \textlatin{(scheduler)} για τα νήματα πέραν του λειτουργικού
+  \end{itemize}
+
+}
+
+\frame
+{
+\frametitle{\textlatin{Global Interpreter Lock}}
+  
+  \begin{itemize}
+   \item Διασφαλίζει την εκτέλεση μόνο ενός νήματος κάθε φορά
+   \item \emph{Πλεονέκτημα:} Απλοποιεί πολλές χαμηλού επιπέδου λειτουργίες
+   \item \emph{Μειονέκτημα:} Απαγορεύει την παράλληλη εκτέλεση υπολογισμών
+  \end{itemize}
+
+}
+
+\subsection{Πως δουλεύει}
+
+\frame
+{
+\frametitle{Μοντέλο Εκτέλεσης Νημάτων}
+
+\begin{figure}[ht]
+ \centering
+ \includegraphics[scale=0.30]{./thread_execution_model.png}
+ % thread_execution_model.png: 1004x374 pixel, 72dpi, 35.41x13.19 cm, bb=0 0 1004 374
+ \caption{Μοντέλο εκτέλεσης νημάτων}
+ \label{fig:thread_execution_model}
+\end{figure}
+
+}
+
+
+\frame
+{
+\frametitle{Εφαρμογές Εισόδου/Εξόδου}
+
+\begin{itemize}
+ \item Μόλις εκκινείται μια διαδικασία Εισόδου/Εξόδου, ο \textlatin{GIL} ελευθερώνεται.
+ \item Δέσμευση του \textlatin{GIL} από άλλο νήμα.
+ \item Συνέχιση της εκτέλεσης του.
+\end{itemize}
+
+
+}
+
+\frame
+{
+\frametitle{Υπολογιστικά Φραγμένες Εφαρμογές}
+
+\begin{itemize}
+ \item Απελευθέρωση του \textlatin{GIL} μετά από τακτά χρονικά διαστήματα.
+ \item Τα διαστήματα αυτά μετριούνται με τις εντολές που έχουν εκτελεστεί.
+ \item Δέσμευση του \textlatin{GIL} από άλλο νήμα.
+ \item Συνέχιση της εκτέλεσης του.
+\end{itemize}
+
+}
+
+\subsection{Τι είναι}
+
+\begin{frame}[fragile]
+\frametitle{Δομή}
+
+\selectlanguage{english}
+\begin{lstlisting}
+# lock status
+locked = 0
+# lock for the status
+mutex = p_threads_mutex()
+# use for signaling
+cond = p_threads_cond()
+\end{lstlisting}
+\selectlanguage{greek}
+
+\end{frame}
+
+
+\begin{frame}[fragile]
+\frametitle{Λειτουργίες}
+
+\selectlanguage{english}
+\begin{lstlisting}
+release():
+    # critical area
+    mutex.lock()
+    locked = 0
+    mutex.unlock()
+    # end of critical area
+    # signal another thread
+    cond.signal()
+
+acquire():
+    mutex.lock()
+    while (locked):
+        cond.wait(mutex)
+    locked = 1
+    mutex.unlock()
+\end{lstlisting}
+\selectlanguage{greek}
+
+\end{frame}
+
+
+\begin{frame}
+\frametitle{Ποιός αποκτά τον \textlatin{GIL}}
+
+
+\begin{itemize}
+  \item Χρησιμοποιείται μια ουρά προτεραιότητας.
+  \item Ένα νήμα εισέρχεται στην ουρά. \textbf{\textlatin{wait()}}
+  \item Ο \textlatin{GIL} αποκτάται από το νήμα που εξάγεται από την ουρά. \textbf{\textlatin{signal()}}
+\end{itemize}
+
+\end{frame}
+
+
+\begin{frame}
+\frametitle{Σχηματική απεικόνιση ουράς νημάτων}
+
+\begin{figure}[ht]
+ \centering
+ \includegraphics[scale=0.35]{./threads_queue.png}
+ % threads_queue.png: 515x429 pixel, 72dpi, 18.17x15.13 cm, bb=0 0 515 429
+ \caption{Ουρά νημάτων}
+ \label{fig:threads_queue}
+\end{figure}
+
+\end{frame}
+
+\begin{frame}
+\frametitle{Ποιός αποκτά τον \textlatin{GIL} (2)}
+
+
+\begin{itemize}
+  \item Το λειτουργικό σύστημα αναλαμβάνει ποιο νήμα θα εκτελεστεί.
+  \item Μπορεί να εκτελεστεί το ίδιο νήμα ξανά\dots
+  \item \dots Ή και κανένα, αν το λειτουργικό επιλέξει άλλο νήμα του συστήματος.
+  \item Ο χρήστης δεν έχει κανέναν έλεγχο.
+\end{itemize}
+
+\end{frame}
+
+\section{Το πρόβλημα}
+
+\subsection{Μετρήσεις}
+
+\begin{frame}
+\frametitle{Τι συμβαίνει}
+
+
+\begin{itemize}
+  \item \textlatin{http://www.dabeaz.com/GIL/}
+\end{itemize}
+
+\end{frame}
+
+\begin{frame}
+\frametitle{1 \textlatin{CPU}}
+
+\begin{itemize}
+  \item Εξετάζουμε υπολογιστικά φραγμένα νήματα
+  \item Ένα νήμα εκτελείται για αρκετή ώρα
+  \item Λίγες εναλλαγές περιβάλλοντος (\textlatin{context switches})
+  \item Ελάχιστες λάθος αφυπνίσεις \textlatin{(false alarms)}
+  \item Τα πράγματα κυλάνε ομαλά
+\end{itemize}
+
+\end{frame}
+
+
+\begin{frame}
+\frametitle{2+ \textlatin{CPU}}
+
+\begin{itemize}
+  \item Οι εναλλαγές γίνονται πιο συχνές
+  \item Περισσότερες εναλλαγές περιβάλλοντος (\textlatin{context switches})
+  \item Πολλές λάθος αφυπνίσεις \textlatin{(false alarms)}
+  \item Επιβράδυνση της εκτέλεσης των νημάτων
+\end{itemize}
+
+\end{frame}
+
+\begin{frame}
+\frametitle{1 \textlatin{CPU}}
+
+\begin{itemize}
+  \item Υπολογιστικά φραγμένο νήμα και νήμα που εκτελεί διαδικασία εισόδου/εξόδου
+  \item Σχεδόν άμεση εξυπηρέτηση του νήματος που εκτελεί \textlatin{I/O}
+\end{itemize}
+
+\end{frame}
+
+
+\begin{frame}
+\frametitle{2+ \textlatin{CPU}}
+
+\begin{itemize}
+  \item Το νήμα που εκτελεί \textlatin{I/O} αναγκάζεται να περιμένει για πολύ ώρα.
+  \item Πολλές λάθος αφυπνίσεις \textlatin{(false alarms)}
+  \item Επιβράδυνση της εκτέλεσης
+\end{itemize}
+
+\end{frame}
+
+\subsection{Η αιτία}
+
+\begin{frame}
+\frametitle{Η αιτία του προβλήματος}
+
+\begin{itemize}
+  \item Το λειτουργικό έχει τον έλεγχο της εκτέλεσης των νημάτων.
+  \item Η \textlatin{Python} με τον \textlatin{GIL} απογορεύει την ταυτόχρονη εκτέλεση περισσότερων του ενός νημάτων.
+  \item Αν υπάρχουν παραπάνω επεξεργαστικοί πυρήνες, το λειτουργικό νομίζει μπορεί να τρέξει πολλά νήματα ταυτόχρονα.
+  \item Οι υπολογιστικοί πηρύνες \textlatin{(cpu-cores)} ανταγωνίζονται μεταξύ τους.
+  \item Πολλές κλήσεις συστήματος σπαταλούνται.
+\end{itemize}
+
+\end{frame}
+
+\subsection{Η λύση}
+
+\subsection{Εισαγωγή}
+
+\begin{frame}
+\frametitle{Ιστορία}
+
+\begin{itemize}
+  \item Νέα υλοποίηση του \textlatin{Global Interpreter Lock}.
+  \item Η πρώτη μεγάλη αλλαγή από την ενσωμάτωση των \textlatin{threads} στην \textlatin{Python} το $1992$.
+  \item Προηγούμενη προσπάθεια κατάργησης του \textlatin{GIL} απέτυχε από άποψη επίδοσης \textlatin{(performance)}.
+  \item Προσπαθεί να λύσει το πρόβλημα των λάθος αφυπνίσεων.
+  \item Η νέα έκδοση του \textlatin{GIL} βρίσκεται στην έκδοση 3.2 της \textlatin{Python}.
+\end{itemize}
+
+\end{frame}
+
+
+\begin{frame}[fragile]
+\frametitle{Ιδέα}
+
+\begin{itemize}
+  \item Αντί για ελέγχους ανά τακτά χρονικά διαστήματα \textlatin{(ticks)}, υπάρχει μια καθολική μεταβλητή.
+
+\selectlanguage{english}
+\begin{lstlisting}
+  static volatile int gil_drop_request = 0;
+\end{lstlisting}
+\selectlanguage{greek}
+
+  \item Ένα νήμα τρέχει μέχρι να γίνει αυτή η μεταβλητή $1$.
+\end{itemize}
+
+\end{frame}
+
+\subsection{Η υλοποίηση}
+
+\begin{frame}
+\frametitle{Εναλλαγή νημάτων}
+
+\begin{enumerate}
+  \item Αν τρέχει ένα νήμα μόνο, η μεταβλητή δεν αλλάζει ποτέ τιμή.
+  \item Για δυο νήματα:
+  \begin{itemize}
+   \item Το νήμα σε κατάσταση \textlatin{suspended}, περιμένει ένα συγκεκριμένο χρονικό διάστημα \textlatin{(timeout)}.
+   \item Εκτός και αν το προηγούμενο νήμα έχει διακόψει την εκτέλεση του νωρίτερα.
+   \item Το νήμα που απέκτησε τον \textlatin{GIL}, το επιβεβαιώνει.
+  \end{itemize}
+\end{enumerate}
+
+\end{frame}
+
+\begin{frame}
+\frametitle{Εναλλαγή νημάτων}
+
+\begin{figure}[ht]
+ \centering
+ \includegraphics[scale=0.30]{./new_gil_2.png}
+ % new_gil_2.png: 844x343 pixel, 72dpi, 29.77x12.10 cm, bb=0 0 844 343
+ \caption{Υποχρεωτική εναλλαγή νημάτων}
+ \label{fig:new_gil_2}
+\end{figure}
+
+\end{frame}
+
+\subsection{Αποτελέσματα}
+
+\begin{frame}
+\frametitle{Αποτέλεσματα}
+
+\begin{itemize}
+  \item Δουλεύει!
+  \item Εξακολουθούν όμως τα νήματα να μην προσφέρουν επιτάγχυνση.
+  \item Πολύ καλύτερα από πριν.
+  \item Όμως τα \textlatin{I/O} νήματα δεν έχουν μεγαλύτερη προτεραιότητα. 
+\end{itemize}
+
+\end{frame}
+
+
+\begin{frame}
+\frametitle{Δικαιοσύνη}
+
+\begin{figure}[ht]
+ \centering
+ \includegraphics[scale=0.30]{./unfair.png}
+ % unfair.png: 793x434 pixel, 72dpi, 27.97x15.31 cm, bb=0 0 793 434
+ \caption{Προβλήματα Δικαιοσύνης}
+ \label{fig:unfair}
+\end{figure}
+
+\end{frame}
+
+\begin{frame}
+\frametitle{Λειτουργίες Εισόδου/Εξόδου}
+
+\begin{itemize}
+  \item Αν ένα νήμα εκτελεί μια λειτουργία εισόδου/εξόδου, δεν σημαίνει θα μπλοκάρει.
+  \item Πολλές φορές τα δεδομένα γράφονται σε έναν αποταμιευτήρα \textlatin{(buffer)}.
+  \item Παράδειγμα η εγγραφή ανάγνωση από \textlatin{sockets}.
+\end{itemize}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{Πειράματα}
+
+\begin{itemize}
+  \item Αποστολή δεδομένων $10$ \textlatin{MB} σε ένα νήμα εξυπηρετητή \textlatin{(server)} που ανταγωνίζεται με ένα φραγμένο υπολογιστικά νήμα.
+  \begin{itemize}
+    \item \textlatin{Python 2.6.4 (2 CPU): 0.57s}
+    \item \textlatin{Python 3.2 (2 CPU): 12.4s} (20 φορές πιο αργά)
+  \end{itemize}
+  \item Αποστολή δεδομένων $10$ \textlatin{MB} σε ένα νήμα εξυπηρετητή \textlatin{(server)} που ανταγωνίζεται με \alert{δυο} φραγμένα υπολογιστικά νήματα.
+  \begin{itemize}
+    \item \textlatin{Python 2.6.4 (2 CPU): 0.25s}
+    \item \textlatin{Python 3.2 (2 CPU): 46.9s} (180 φορές πιο αργά)
+    \item \textlatin{Python 3.2 (1 CPU): 0.14s}
+  \end{itemize}
+\end{itemize}
+
+\end{frame}
+
+\section{Ελπίδα}
+
+\subsection{Βελτιώσεις}
+
+\begin{frame}
+\frametitle{Τι θα μπορούσε να βελτιωθεί}
+
+\begin{itemize}
+  \item Προτεραιότητες στα νήματα.
+  \item Προεκτόπιση \textlatin{(preemption)}.
+  \item Πρόβλημα λυμένο στα λειτουργικά συστήματα.
+\end{itemize}
+
+\end{frame}
+
+\begin{frame}
+\frametitle{Τελικές σκέψεις}
+
+\begin{itemize}
+  \item Η βελτίωση του \textlatin{GIL} είναι κάτι που θα πρέπει να μας ενδιαφέρει.
+  \item Πιο προβλέψιμη συμπεριφορά νημάτων είναι κάτι καλό.
+  \item Έχουμε καταιγιστικές εξελίξεις μετά από 15 χρόνια.
+\end{itemize}
+
+\end{frame}
+
+
+\section{Επίλογος}
+
+
+\frame
+{
+\frametitle{Αναφορές}
+
+\begin{itemize}
+ \item \textlatin{PyCon 2010: Understanding the Python GIL - Dave Beazley}
+ \item \textlatin{http://www.dabeaz.com/GIL/}
+ \item \textlatin{http://bugs.python.org/issue7946}
+ \item \textlatin{http://is.gd/9G2Qo}
+\end{itemize}
+
+
+}
+
+
+\end{document}
+from threading import Thread
+from subprocess import Popen
+import time
+
+def countdown(n):
+    while n > 0:
+        n -= 1
+
+# Launch a useless process
+p = Popen(['python3', 'spin.py'])
+
+COUNT = 2 * 10**7
+THREADS = 4
+
+t = []
+for i in range(THREADS): 
+    t.append(Thread(target=countdown,args=(COUNT//THREADS,)))
+
+start = time.time()
+for thr in t:
+    thr.start()
+
+for thr in t:
+    thr.join()
+end = time.time()
+print(end - start)
+
+p.terminate()
+while True:
+    pass 
Add a comment to this file

thread_execution_model.png

Added
New image
+from threading import Thread
+import time
+
+def countdown(n):
+    while n > 0:
+        n -= 1
+
+COUNT = 2 * 10**7
+THREADS = 4
+
+t = []
+for i in range(THREADS): 
+    t.append(Thread(target=countdown,args=(COUNT//THREADS,)))
+
+start = time.time()
+for thr in t:
+    thr.start()
+
+for thr in t:
+    thr.join()
+end = time.time()
+print(end - start)
Added
New image
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.