Annotation of researchv10dc/man/manx/lnode.5, revision 1.1.1.1

1.1       root        1: .TH LNODE 5 SHARE
                      2: .SH NAME
                      3: lnode \- kernel user shares structure
                      4: .SH SYNOPSIS
                      5: .B "#include <sys/lnode.h>"
                      6: .SH DESCRIPTION
                      7: The kernel
                      8: .I lnode
                      9: structure is used to maintain per-user shares while a user has processes running.
                     10: .I Lnodes
                     11: are installed by
                     12: .IR login (8)
                     13: via the 
                     14: .IR limits (2)
                     15: system call when a new user logs into the system.
                     16: .I Dead
                     17: lnodes are removed by 
                     18: .IR sharer (8)
                     19: when the last process for a user exits.
                     20: The layout as given in the include file is:
                     21: .PP
                     22: .nf
                     23: .ift .ta 1.1i 1.9i
                     24: .ifn .ta 24n 35n
                     25: /*
                     26:  * Structure for active shares
                     27:  */
                     28: 
                     29: typedef short  uid_t;
                     30: 
                     31: .ift .ta .3i 1.1i 1.9i
                     32: .ifn .ta 2n +10n +13n
                     33: struct lnode
                     34: {
                     35:        uid_t   l_uid;  /* real uid for owner of this node */
                     36:        u_short l_flags;        /* (see below) */
                     37:        u_short l_shares;       /* allocated shares */
                     38:        uid_t   l_group;        /* uid for this node's scheduling group */
                     39:        float   l_usage;        /* decaying accumulated costs */
                     40:        float   l_charge;       /* long term accumulated costs */
                     41: };
                     42: 
                     43: /*
                     44:  * Meaning of bits in l_flags
                     45:  */
                     46: 
                     47: .ift .ta .6i 1.8i 2.4i
                     48: .ifn .ta +8n +11n +6n
                     49: #define        \s-1ACTIVELNODE\s0      001     /* this lnode is on active list */
                     50: #define        \s-1LASTREF\s0  002     /* set for L_DEADLIM if last reference to this lnode */
                     51: #define        \s-1DEADGROUP\s0        004     /* group account is dead */
                     52: #define        \s-1CHNGDLIMITS\s0      020     /* this lnode's limits have changed */
                     53: #define        \s-1NOTSHARED\s0        040     /* this lnode does not get a share of the m/c */
                     54: .DT
                     55: .fi
                     56: .PP
                     57: .I Lnodes
                     58: are grouped together in a tree.
                     59: At any level in the tree,
                     60: the share of resources allocated to an individual lnode is that 
                     61: proportion of the group's resources
                     62: represented by the ratio of the lnode's shares
                     63: to the total shares of all the lnodes in the group.
                     64: The 
                     65: .I l_group
                     66: field represents the 
                     67: .I uid
                     68: of the group leader's lnode.
                     69: The top of the tree is represented by
                     70: .IR root 's
                     71: lnode, which is initialised at system boot time.
                     72: .PP
                     73: The
                     74: .SM LASTREF
                     75: bit in
                     76: .I l_flags
                     77: is set for the 
                     78: .SM L_DEADLIM
                     79: request to the
                     80: .IR limits (2)
                     81: system call if the last process referencing the 
                     82: .I lnode 
                     83: has exited.
                     84: The
                     85: .SM DEADGROUP
                     86: bit is set if this
                     87: .I lnode
                     88: was the last one referencing it's group.
                     89: Dead groups are collected via the
                     90: .SM L_DEADGROUP
                     91: request to the
                     92: .IR limits (2)
                     93: system call.
                     94: .PP
                     95: The
                     96: .I l_charge
                     97: field is the long term accumulated charge for consumption of resources.
                     98: For group leaders, it represents the charge for the whole group.
                     99: The 
                    100: .I l_usage
                    101: field is a number representing recent usage of resources,
                    102: and is used by the scheduler to determine current share of resources.
                    103: .SS kern_lnode
                    104: Each user's
                    105: .I lnode
                    106: is embedded in a larger structure to hold temporary values for use
                    107: by the scheduler, known as a
                    108: .IR kern_lnode .
                    109: The layout as given in the include file is:
                    110: .PP
                    111: .nf
                    112: .ift .ta 1.9i
                    113: .ifn .ta 28n
                    114: /*
                    115:  * Kernel user share structure
                    116:  */
                    117: 
                    118: typedef struct kern_lnode *    KL_p;
                    119: 
                    120: .ift .ta .3i 1.1i 1.9i
                    121: .ifn .ta 2n +13n +13n
                    122: struct kern_lnode
                    123: {
                    124:        KL_p    kl_next;        /* next in active list */
                    125:        KL_p    kl_prev;        /* prev in active list */
                    126:        KL_p    kl_parent;      /* group parent */
                    127:        KL_p    kl_gnext;       /* next in parent's group */
                    128:        KL_p    kl_ghead;       /* start of this group */
                    129:        struct lnode    kl;     /* user parameters (as above) */
                    130:        float   kl_gshares;     /* total shares for this group */
                    131:        float   kl_eshare;      /* effective share for this group */
                    132:        float   kl_norms;       /* share**2 for this lnode */
                    133:        float   kl_usage;       /* kl.l_usage / kl_norms */
                    134:        float   kl_rate;        /* active process rate for this lnode */
                    135:        float   kl_temp;        /* temporary for scheduler */
                    136:        float   kl_spare;       /* <spare> */
                    137:        u_long  kl_cost;        /* cost accumulating in current period */
                    138:        u_long  kl_muse;        /* memory pages used */
                    139:        u_short kl_refcount;    /* processes attached to this lnode */
                    140:        u_short kl_children;    /* lnodes attached to this lnode */
                    141: };
                    142: .DT
                    143: .fi
                    144: .PP
                    145: Every process has a pointer to its owner's
                    146: .I kern_lnode
                    147: called
                    148: .I p_lnode.
                    149: Every time a process incurs a clock tick,
                    150: the value
                    151: .I p_lnode\->kl_usage
                    152: multipied by
                    153: .I p_lnode\->kl_rate
                    154: is added to its scheduling priority in
                    155: .IR p_sharepri .
                    156: .I p_sharepri
                    157: is decayed by the clock by an amount depending on the process's
                    158: .I p_nice
                    159: value \(em the ``nicer'' the process, the slower the decay.
                    160: This value is copied into the low-level scheduler's priority in
                    161: .I p_pri
                    162: whenever the process is run in user space.
                    163: .SH "SEE ALSO"
                    164: limits(2),
                    165: share(5),
                    166: sharer(8).

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.