Δίνοντας options στην εντολή time

Giorgos Keramidas keramida at ceid.upatras.gr
Mon Jun 2 06:25:03 EEST 2008


On Sun, 01 Jun 2008 23:56:53 +0300, George Notaras <gnot at g-loaded.eu> wrote:
> V13 wrote:
>> On Sunday 01 June 2008, Nick Demou wrote:
>>> συνεπώς λόγω της ατυχούς διατύπωσης στο man page του ps ("the memory
>>> that a task has used" αντί για "is using") η απορία του Γιώργου ήταν
>>
>> Gia na leme kai toy straboy to dikio, den einai kai toso atyxis. Ean
>> den oriseis xroniko diastima den mporeis na anafertheis sth mnimi poy
>> xrisimopoieitai (kati san na leme "Nomizo oti den katalabaineis ti
>> *akribos* rotas").
>>
>> P.x: ena programma xrisimopoihse 1MB ta teleytaia 10 lepta alla tora
>> (ta teleytaia 10 deyterolepta) xrisimopoiei 100KB.
>
> Ακριβώς επειδή δεν θα είχε νόημα να μετράει την χρήση της μνημης
> αθροιστικά', είχα θεωρήσει ότι μάλλον δείχνει την 'μέγιστη' μνήμη που
> εχει χρησιμοποιήσει το process για τους (άστοχους) λόγους που εξήγησα
> και σε παραπάνω μήνυμα. Η 'ελάχιστη' τιμή δεν θα είχε επίσης κανένα
> νόημα, ενώ η έννοια του 'μέσου όρου' δεν υφίσταται από τη στιγμή που
> το /proc κρατάει μόνο μία τιμή για κάθε μετρούμενο μέγεθος.

Βασικά η έννοια του μέσου όρου υφίσταται, μην σε αγχώνει ότι χρειάζεται
λίγο χώρο.  Ο πυρήνας κάνει τόσα πολλά πράγματα που θα ήταν trivial να
κάνει και μέσο όρο με τις τιμές των τελευταίων 16384 processes, ή ακόμα και
όλων των processes από τότε που έκανε boot.

Από την άλλη, προσοχή με το `abstraction' του /proc ως filesystem.  Είναι
πολύ εύκολο να την πατήσεις και να πιστέψεις ότι αυτά που δείχνει το proc
ως περιεχόμενα είναι «η πραγματικότητα» που έλεγα και σε άλλο post.

Στην πραγματικότητα τα περιεχόμενα του /proc δεν υπάρχουν πουθενά.  Το
/proc δεν «κρατάει» τίποτα.  Τουλάχιστον όχι με τη συμβατική έννοια ενός
filesystem που «αποθηκεύει» κάποιες πληροφορίες.  Είναι ένα pseudo-fs,
οπότε η πραγματική πληροφορία είναι μέρος του πυρήνα και μόνο εκεί είναι
αποθηκευμένη.  Πολλές φορές με binary formats ή δομές εντελώς «εσωτερικές»
για τον πυρήνα.

Το /proc σου _δείχνει_ κάποια πράγματα τα οποία τα έχει _υπολογίσει_ λίγο
πριν τα δεις, με βάση τις πραγματικές μεταβλητές.

Έτσι π.χ., ο πυρήνας μπορεί να κρατάει όσες τιμές θέλει, και να σου δείχνει
κάτι που υπολογίζεται με βάση αυτές.  Για παράδειγμα, όταν ζητάς να δεις τα
περιεχόμενα του `/proc/<PID>/maps' ο πυρήνας δεν έχει κάπου αποθηκευμένο
ένα static πίνακα με το «σωστό» αριθμό εγγραφών για κάθε πρόγραμμα που
χρησιμοποιεί μνήμη.  Μπορεί όμως να διατρέξει τη λίστα των segments μνήμης
του process και να «υπολογίσει» το αποτέλεσμα.

Ένα άλλο κλασικό παράδειγμα όπου ο πυρήνας «υπολογίζει» κάτι πολύ πριν στο
δείξει είναι το `load average'.  Ο πυρήνας κρατάει σε ένα πίνακα[1] τριών
στοιχείων (πίνακας avenrun[] στο αρχείο `kernel/timer.c' τις τιμές του load
average).  Κάθε φορά που τρέχει το timer interrupt του πυρήνα καλεί την
update_times() κι αυτή την calc_load().  Η calc_load() κάνει ότι είναι να
κάνει, και όταν ζητάς να δεις τα περιεχόμενα του αρχείου `/proc/loadavg'
καλείται η fs/proc/proc_misc.c:loadavg_read_proc() για να δου δείξει 6
νούμερα:

  * Τα 3 load average values από τον πίνακα avenrun[]
  * Τον αριθμό των 'running' threads
  * Τον συνολικό αριθμό των threads
  * Το PID από το τελευταίο process που έτρεξε [πεδίο lastpid
    στην έξοδο της εντολής `top'].

[1] Τα παραπάνω αναφέρονται στο linux-2.6.25.4 kernel.  Σε άλλες εκδόσεις
του πυρήνα μπορεί να υπάρχουν κάποιες μικροδιαφορές.

Τι θέλω να πω μ' όλα αυτά... Ο πυρήνας μπορεί να κάνει ΠΟΛΛΑ πράγματα πριν
σου δείξει κάτι στο `/proc', οπότε μην αγχώνεσαι αν κρατάει μία τιμή ή δύο
ή κάτι λιγότερο από 8192 :-)



More information about the Linux-greek-users mailing list