summaryrefslogtreecommitdiff
path: root/static/v10/man5/lnode.5
diff options
context:
space:
mode:
authorJacob McDonnell <jacob@jacobmcdonnell.com>2026-04-25 21:07:28 -0400
committerJacob McDonnell <jacob@jacobmcdonnell.com>2026-04-25 21:07:28 -0400
commit711594636704defae873be1a355a292505585afd (patch)
tree59ee13f863830d8beba6cfd02bbe813dd486c26f /static/v10/man5/lnode.5
parent3258a063c1f189d7b019e40e525b46bef9b9a7b1 (diff)
docs: Added UNIX V10 Manuals
Diffstat (limited to 'static/v10/man5/lnode.5')
-rw-r--r--static/v10/man5/lnode.5166
1 files changed, 166 insertions, 0 deletions
diff --git a/static/v10/man5/lnode.5 b/static/v10/man5/lnode.5
new file mode 100644
index 00000000..ea07da47
--- /dev/null
+++ b/static/v10/man5/lnode.5
@@ -0,0 +1,166 @@
+.TH LNODE 5 SHARE
+.SH NAME
+lnode \- kernel user shares structure
+.SH SYNOPSIS
+.B "#include <sys/lnode.h>"
+.SH DESCRIPTION
+The kernel
+.I lnode
+structure is used to maintain per-user shares while a user has processes running.
+.I Lnodes
+are installed by
+.IR login (8)
+via the
+.IR limits (2)
+system call when a new user logs into the system.
+.I Dead
+lnodes are removed by
+.IR sharer (8)
+when the last process for a user exits.
+The layout as given in the include file is:
+.PP
+.nf
+.ift .ta 1.1i 1.9i
+.ifn .ta 24n 35n
+/*
+ * Structure for active shares
+ */
+
+typedef short uid_t;
+
+.ift .ta .3i 1.1i 1.9i
+.ifn .ta 2n +10n +13n
+struct lnode
+{
+ uid_t l_uid; /* real uid for owner of this node */
+ u_short l_flags; /* (see below) */
+ u_short l_shares; /* allocated shares */
+ uid_t l_group; /* uid for this node's scheduling group */
+ float l_usage; /* decaying accumulated costs */
+ float l_charge; /* long term accumulated costs */
+};
+
+/*
+ * Meaning of bits in l_flags
+ */
+
+.ift .ta .6i 1.8i 2.4i
+.ifn .ta +8n +11n +6n
+#define \s-1ACTIVELNODE\s0 001 /* this lnode is on active list */
+#define \s-1LASTREF\s0 002 /* set for L_DEADLIM if last reference to this lnode */
+#define \s-1DEADGROUP\s0 004 /* group account is dead */
+#define \s-1CHNGDLIMITS\s0 020 /* this lnode's limits have changed */
+#define \s-1NOTSHARED\s0 040 /* this lnode does not get a share of the m/c */
+.DT
+.fi
+.PP
+.I Lnodes
+are grouped together in a tree.
+At any level in the tree,
+the share of resources allocated to an individual lnode is that
+proportion of the group's resources
+represented by the ratio of the lnode's shares
+to the total shares of all the lnodes in the group.
+The
+.I l_group
+field represents the
+.I uid
+of the group leader's lnode.
+The top of the tree is represented by
+.IR root 's
+lnode, which is initialised at system boot time.
+.PP
+The
+.SM LASTREF
+bit in
+.I l_flags
+is set for the
+.SM L_DEADLIM
+request to the
+.IR limits (2)
+system call if the last process referencing the
+.I lnode
+has exited.
+The
+.SM DEADGROUP
+bit is set if this
+.I lnode
+was the last one referencing it's group.
+Dead groups are collected via the
+.SM L_DEADGROUP
+request to the
+.IR limits (2)
+system call.
+.PP
+The
+.I l_charge
+field is the long term accumulated charge for consumption of resources.
+For group leaders, it represents the charge for the whole group.
+The
+.I l_usage
+field is a number representing recent usage of resources,
+and is used by the scheduler to determine current share of resources.
+.SS kern_lnode
+Each user's
+.I lnode
+is embedded in a larger structure to hold temporary values for use
+by the scheduler, known as a
+.IR kern_lnode .
+The layout as given in the include file is:
+.PP
+.nf
+.ift .ta 1.9i
+.ifn .ta 28n
+/*
+ * Kernel user share structure
+ */
+
+typedef struct kern_lnode * KL_p;
+
+.ift .ta .3i 1.1i 1.9i
+.ifn .ta 2n +13n +13n
+struct kern_lnode
+{
+ KL_p kl_next; /* next in active list */
+ KL_p kl_prev; /* prev in active list */
+ KL_p kl_parent; /* group parent */
+ KL_p kl_gnext; /* next in parent's group */
+ KL_p kl_ghead; /* start of this group */
+ struct lnode kl; /* user parameters (as above) */
+ float kl_gshares; /* total shares for this group */
+ float kl_eshare; /* effective share for this group */
+ float kl_norms; /* share**2 for this lnode */
+ float kl_usage; /* kl.l_usage / kl_norms */
+ float kl_rate; /* active process rate for this lnode */
+ float kl_temp; /* temporary for scheduler */
+ float kl_spare; /* <spare> */
+ u_long kl_cost; /* cost accumulating in current period */
+ u_long kl_muse; /* memory pages used */
+ u_short kl_refcount; /* processes attached to this lnode */
+ u_short kl_children; /* lnodes attached to this lnode */
+};
+.DT
+.fi
+.PP
+Every process has a pointer to its owner's
+.I kern_lnode
+called
+.I p_lnode.
+Every time a process incurs a clock tick,
+the value
+.I p_lnode\->kl_usage
+multipied by
+.I p_lnode\->kl_rate
+is added to its scheduling priority in
+.IR p_sharepri .
+.I p_sharepri
+is decayed by the clock by an amount depending on the process's
+.I p_nice
+value \(em the ``nicer'' the process, the slower the decay.
+This value is copied into the low-level scheduler's priority in
+.I p_pri
+whenever the process is run in user space.
+.SH "SEE ALSO"
+limits(2),
+share(5),
+sharer(8).