Πληροφορίες Μαθήματος
- Εαρινό εξάμηνο - Τμήμα άρτιων αριθμών μητρώου.
- Μάθημα: Δευτέρα 13:00-15:00 και Τρίτη 11:00-13:00.
- Forum μαθήματος στο piazza
Περιγραφή Μαθήματος
Το μάθημα εξετάζει σε βάθος το Linux ως περιβάλλον ανάπτυξης λογισμικού, από τη σκοπιά του προγραμματιστή συστήματος. Στο πρώτο μέρος δουλεύουμε με το κέλυφος (bash): βασικά εργαλεία, ανακατευθύνσεις, διαχείριση διεργασιών, Makefiles και προγραμματισμό σεναρίων (shell scripts). Στο κύριο μέρος γράφουμε προγράμματα σε C/C++ που χρησιμοποιούν απευθείας τις κλήσεις συστήματος (system calls) του Linux/POSIX: χειρισμό λαθών, είσοδο/έξοδο χαμηλού επιπέδου, σήματα, δημιουργία και έλεγχο διεργασιών, επικοινωνία διεργασιών (pipes, FIFOs, κοινή μνήμη, σημαφόροι, κλείδωμα αρχείων), δικτυακό προγραμματισμό με sockets, και πολυνηματικό προγραμματισμό με POSIX threads και μηχανισμούς συγχρονισμού (mutexes, condition variables, monitors).
Με την ολοκλήρωση του μαθήματος θα μπορείτε:
- να αυτοματοποιείτε εργασίες με bash scripts·
- να γράφετε προγράμματα σε C που χρησιμοποιούν σωστά τις κλήσεις συστήματος και χειρίζονται τα λάθη τους (π.χ.
errno, διακοπή από σήματα, μερικές αναγνώσεις/εγγραφές)· - να σχεδιάζετε εφαρμογές με πολλές διεργασίες ή νήματα που επικοινωνούν και συγχρονίζονται σωστά·
- να υλοποιείτε απλούς εξυπηρετητές (servers) και πελάτες (clients) πάνω από TCP/IP·
- να εντοπίζετε και να αποφεύγετε τα τυπικά σφάλματα του ταυτόχρονου κώδικα (race conditions, deadlocks).
Το μάθημα είναι έντονα προγραμματιστικό: περιλαμβάνει προγραμματιστικές ασκήσεις και γραπτή τελική εξέταση. Από τη φύση του χρειάζεται αυτενέργεια και συνεχή προσωπική προσπάθεια. Θα πρέπει να γνωρίζετε C και δομές δεδομένων και να έχετε ολοκληρώσει το μάθημα Κ22: Λειτουργικά Συστήματα. Οι ασκήσεις σας θα πρέπει να μεταγλωττίζονται και να τρέχουν στα Linux workstations του τμήματος.
Ανακοινώσεις
- 15/02: Το μάθημα ξεκινάει Δευτέρα 17 Φεβρουαρίου.
Βιβλιογραφία
- M. Kerrisk, The Linux Programming Interface, No Starch Press, 2010.
- W.R. Stevens, S.A. Rago, Advanced Programming in the UNIX Environment, 3rd ed., Addison-Wesley, 2013.
- M.J. Rochkind, Advanced UNIX Programming, 2nd ed., Addison-Wesley, 2004.
- K. Robbins, S. Robbins, UNIX Systems Programming: Communication, Concurrency, and Threads, 2nd ed., Prentice Hall, 2003.
Syllabus & Πρόγραμμα
| Lecture | Topic | Slides & Code |
|---|---|---|
| Module 1: Introduction to Unix | ||
| Lecture 1 | Course logistics. Introduction to Unix, basic commands | |
| Lecture 2 | File processing, basic commands (cont'd) | |
| Lecture 3 | csh, bash, environment variables, input/output, process management, makefiles | |
| Module 2: Shell Scripting | ||
| Lecture 4 | Shell scripting: parameters, simple arithmetic, if, case, sample programs | |
| Lecture 5 | Shell scripting: for, while, file contents, exec | |
| Module 3: Error Handling, Low-Level I/O & Signals | ||
| Lecture 6 | Error handling, low-level I/O | |
| Lecture 7 | Low-level I/O, signals | |
| Module 4: Processes & Pipes | ||
| Lecture 8 | Processes, process control | |
| Lecture 9 | Process control, pipes | |
| Interlude: AI for Coding | ||
| Lecture 10 | AI for coding: tools, workflows and failure modes, with systems programming as the case study | |
| Module 5: Internetworking with Sockets | ||
| Lecture 11 | Sockets: addressing, TCP client/server | |
| Lecture 12 | Sockets (cont'd): name resolution, UDP datagrams | |
| Module 6: Threads | ||
| Lecture 13 | POSIX threads: creation, termination, joining | |
| Lecture 14 | Thread synchronization: mutexes, condition variables | |
| Module 7: Advanced Threads & Monitors | ||
| Lectures 15–16 | Advanced threads, monitor-style programming | |
| Module 8: Inter-Process Communication | ||
| Lecture 17 | IPC, message queues, shared memory | |
| Lecture 18 | Shared memory, semaphores | |
| Lectures 19–20 | Semaphores, file locking | |
| Module 9: sed & awk (optional) | ||
| Lecture 21 | sed and awk programming (if time permits) | |
| Review | ||
| Lectures 22–23 | Επανάληψη | |
Οδηγίες Παράδοσης των Ασκήσεων
- Οι προγραμματιστικές ασκήσεις υποβάλλονται μόνο μέσω eClass. Ασκήσεις που στέλνονται μέσω email θεωρούνται πως δεν έχουν υποβληθεί.
- Τις ασκήσεις πρέπει να τις παραδώσετε στην ώρα τους, δηλαδή μέχρι τις 23:59:59 της ημέρας που έχει ανακοινωθεί ως προθεσμία για την παράδοση της άσκησης. Παραδόσεις μπορείτε να κάνετε και αργότερα όμως θα υπάρχει η αντίστοιχη ποινή που περιγράφεται στην εκάστοτε άσκηση.
-
Βήματα για την υποβολή των ασκήσεων:
- Βάζετε όλο τον κώδικα σε ένα directory. Βεβαιωθείτε πως ο κώδικας κάνει compile. Θα πρέπει να έχετε ένα Makefile, οπότε οι εντολές
makeκαιmake cleanθα πρέπει να δουλεύουν. Βεβαιωθείτε πως έχετε στο directory μόνο κώδικα, README, Makefile και άλλα αρχεία που χρειάζεται ο κώδικάς σας αλλά όχι τα binaries. Ο κώδικάς σας θα γίνει compile από την αρχή κατά την εξέταση της άσκησης. - Φτιάχνετε ένα συμπιεσμένο tar-ball (
.tar.gz) με το directory στο οποίο έχετε τον κώδικά σας. Για παράδειγμα, αν έχετε τον κώδικα στο directoryprojectX/, δημιουργείτε το tar-ball ως εξής:
tar czvf FirstLast-projectX.tar.gz projectX
όπου First είναι το όνομά σας, Last το επώνυμό σας και X ο αριθμός της άσκησης. Πριν από ο,τιδήποτε, βεβαιωθείτε πως έχετε αντίγραφο του κώδικά σας, π.χ.cp -r projectX projectX.bak. - Ελέγξτε το tar-ball πριν το υποβάλετε:
tar tzvf FirstLast-projectX.tar.gzδείχνει τα περιεχόμενά του. Ακόμη καλύτερα, κάντε το extract σε ένα άδειο directory και τρέξτεmakeεκεί. - Υποβάλλετε το tar-ball στην αντίστοιχη εργασία στο eClass. Μπορείτε να κάνετε πάνω από μία υποβολές μέχρι την προθεσμία, αλλά κρατείται μόνο η τελευταία. Μην αφήνετε την υποβολή για το τελευταίο λεπτό.
- Καλό θα είναι να έχετε ένα backup της άσκησής σας, όπως ακριβώς αυτή υποβλήθηκε, σε κάποιο εύκολα προσπελάσιμο μηχάνημα (server του τμήματος, ιδιωτικό repository στο GitHub, cloud).
- Είστε υπεύθυνοι για να διασφαλίσετε τον κώδικά σας, είτε από λάθος διαγραφές, αλλαγές, είτε από τρίτους.
- Η σωστή υποβολή ενός σωστού
.tar.gzπου περιέχει τον κώδικα της άσκησής σας και ό,τι αρχεία χρειάζονται είναι αποκλειστικά ευθύνη σας. Άδεια.tar.gzή.tar.gzπου έχουν λάθος και δεν γίνονται extract δεν βαθμολογούνται.
- Βάζετε όλο τον κώδικα σε ένα directory. Βεβαιωθείτε πως ο κώδικας κάνει compile. Θα πρέπει να έχετε ένα Makefile, οπότε οι εντολές
Χρήσιμοι Σύνδεσμοι
- Διανομές Linux και FreeBSD (δωρεάν): Ubuntu, Debian, Mint, SUSE, Red Hat και FreeBSD.
- Εισαγωγικά για Unix/Linux: UNIX Tutorial for Beginners (Surrey), The Linux Command Line (W. Shotts, δωρεάν βιβλίο), και μια εισαγωγή από (παλιούς) φοιτητές του τμήματος.
- Linux man pages (man7.org).
- comp.lang.c FAQ για τη γλώσσα C.
- Tutorial για το πώς να κάνετε compile προγράμματα C στο Linux.
- Βιβλιοθήκες: C Standard Library (cppreference), The GNU C Library.
- B. Barney, POSIX Threads Programming, Lawrence Livermore National Laboratory.
- B. Hall, Beej's Guide to Network Programming (sockets).
- A.B. Downey, The Little Book of Semaphores, Green Tea Press.
- Debugging: gdb (δοκιμάστε και
gdb -tui), Valgrind για λάθη μνήμης, και AddressSanitizer (gcc -g -fsanitize=address). - Αν θέλετε IDE: VS Code, Eclipse CDT ή CodeLite.