\subsubsection{Pseudofs proc}
% ----------------------------
\begin{frame}
\frametitle{Basics}
\begin{itemize}
\item most important pseudofs
\item mount-point: /proc
\item early mount required
\item stable Kernel API extension
 \begin{itemize}
 \item process/thread information
 \item kernel extension
  \begin{itemize}
  \item modules
  \item drivers
  \end{itemize}
 \item system state/utilization (e.g. loadavg, interrupts)
  \begin{itemize}
  \item loadavg
  \item interrupts
  \end{itemize}
 \item system behavior (e.g. memory over-commit)
  \begin{itemize}
  \item memory over-commit
  \item network
  \item irq affinity
  \end{itemize}
 \end{itemize}
\end{itemize}
\end{frame}
% The pseudo filesystem proc is an important API-extension of the linux
% kernel. It provides access to informations about the processes and
% threads, as well as other kenel-internal information, extensions and
% behaviour. The proc filesystem must be mounted as early as possible, right
% after userspace gets control from kernel.

% ----------------------------
\begin{frame}
\frametitle{Process information}
\begin{itemize}
\item one directory for each process
\item PID as directory name
\item /proc/self: link to process' own information
\item per process:
 \begin{itemize}
 \item maps: memory mappings
 \item status/stat: process status (human/machine readable)
 \item fd/fdinfo: (open) file descriptors
 \item map\_files: mmap-ed files
 \item mounts: filesystem mounts
 \item task/<tid>: information about each thread
 \end{itemize}
\item tools accessing process information in proc
 \begin{itemize}
 \item ps
 \item top
 \end{itemize}
\item prevent tool output parsing
\item direct access to process information is preferred
\end{itemize}
\end{frame}
% The informations about processes are provides in separate subdirectories,
% one for each process. The directory name is the PID number of the process.
% The link /proc/self can be used by processes to access its own process
% information.
% The file "maps" shows the memory mappings of a process. It lists all
% mappings, text segment, dynamic libraries, heap and stack.
% The file "status" contains informations about the process status in a
% human-readable form. The same information, but in machine readable form,
% is in file "stat".
% The directory "fd" and fd_info" contains information about the open file
% handles of the process.
% The directory "tasks" contain infomration about the threads of a process.

% ----------------------------
\begin{frame}
\frametitle{Kernel extensions}
\begin{itemize}
\item system-wide information
\item all files shows the current state of loaded extensions
\item extensions:
 \begin{itemize}
 \item modules: \\ a list of loaded modules
 \item devices: \\ major-number-to-driver mapping
 \item filesystems: \\ all currently supported filesystems
 \end{itemize}
\end{itemize}
\end{frame}
% The kernel code can be extended by loadable modules. Ther are files in
% /proc, which informs about the currently loaded extensions. Each time an
% extension is added or removed, the content of these files may change.
% The file "modules" shows all modules, which are currently loaded. It also
% contains the start address of the text segment in memory, reference count
% and used-by information. The tool lsmod make use of this information.
% The file "devices" shows the mappings between the major numbers and the
% related device driver, separate for character and block devices.
% The file "filesystems" show all supported filesystems at the moment.

% ----------------------------
\begin{frame}
\frametitle{System State/Utilization}
\begin{itemize}
\item system-wide information
\item system state
 \begin{itemize}
 \item uptime: time since system start
 \item config.gz: kernel configuration
 \end{itemize}
\item system utilization
 \begin{itemize}
 \item loadavg: average system load (with some history)
 \item interrupts: histogram of all interrupts (total and per CPU)
 \item meminfo: memory information
 \item buddyinfo: information about contiguous free pages
 \end{itemize}
\end{itemize}
\end{frame}
% The system state and utilization is also available via filehandles in
% /proc.
% The file "loadavg" shows how many processes are schedulable at the same
% time and the history of this value.
% The file "interrupts" contains the histogram for all interrupts (total and
% per CPU).
% The file "meminfo" contains information about the system memory, the file
% "buddyinfo" contains a list of contiguous free pages in memory zones.
% The file "config.gz" contains the configuration, with which the kernel has
% been build. The file is compressed an can be extracted e.g. by zcat or
% zless.

% ----------------------------
\begin{frame}
\frametitle{System Behavior}
\begin{itemize}
\item System behavior: sub-directory /proc/sys
 \begin{itemize}
 \item use tool \textbf{sysctl} to change the values
 \item settings at system start: \textbf{/etc/sysctl.conf} or \textbf{/etc/sysctl.d}
 \end{itemize}
\item Interrupt routing: sub-directory /proc/irq
 \begin{itemize}
 \item system-wide affinity mask
 \item per IRQ affinity mask
 \item IRQs are only routed to the CPUs, which are set in the affinity mask bitfield
 \end{itemize}
\end{itemize}
\end{frame}
% The subdirectory "sys" contains a large number of file handles, which can
% be used for fintune the system behaviour. The filehandles can be accessed
% directly, but it is highly recommended to use the tool "sysctl" instead.
% Most distributions supports settings at system start via /etc/sysctl.conf
% or /etc/sysctl.d.
% The subdirectory "irq" can be used, to configure the iterrupt routing to
% CPUs.

% ----------------------------
\subsubsection*{}
\begin{frame}
\frametitle{Resources}
\begin{itemize}
\item \href{https://www.kernel.org/doc/Documentation/filesystems/proc.txt}{Kernel: Documentation/filesystems/proc.txt}
\item \href{http://man7.org/linux/man-pages/man5/proc.5.html}{man 5 proc}
\item \href{http://man7.org/linux/man-pages/man8/sysctl.8.html}{man 8 sysctl}
\item \href{http://man7.org/linux/man-pages/man5/sysctl.conf.5.html}{man 5 sysctl.conf}
\end{itemize} 
\end{frame}
