OPS102 - Resources and Processes

From CDOT Wiki
Revision as of 13:58, 5 October 2023 by Chris Tyler (talk | contribs) (Created page with "Category:OPS102 == Computer Resources == Every digital computer system has finite resources, managed by the operating system. One or more of these three broad categories...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Computer Resources

Every digital computer system has finite resources, managed by the operating system.

One or more of these three broad categories of resources constrain (limit) the system's ability to execute each running program:

  1. Memory - The availability of adequate memory, and the performance of that memory.
  2. CPU - The ability of the CPU to execute the instructions contained in the program at a particular speed.
  3. Input/Output (I/O) - This is a very broad category that includes storage, networking, printers, keyboard and mouse, and so forth.

Processes

On a multitasking computer system, a process is a single instance of an executing computer program. For example, ssh is one program. If there are no running instances of ssh on a computer system, then there are no ssh processes. If one user starts one ssh session, then one there is one ssh process. If five users start a combined total of twelve ssh sessions, then there are twelve ssh processes.

Each process is assigned a Process ID (PID) and is allocated its own resources, such as memory. Processes are scheduled to run (execute) on a CPU core for a fraction of a second, and then the operating system may intervene and switch the CPU core to run another processes. However, if a process is waiting for an I/O resources, such as data from a storage device, a packet of data from the network, or a keystroke from the user, it may inform the operating system that it does not need to be executed until that resource is available. A process which is ineligible for execution because it is waiting for a resources is called a sleeping process.

Resource Conflicts

When the resource requirements of running computer programs significantly exceed available resources, system performance will become unsatisfactory.

It is important to be able to identify the resource consumption of each process, and each operating system provides multiple tools to do this. They also provide tools to terminate processes if they are unstable or consuming excessive resources.

Challenges with Monitoring Resource Usage

It is difficult to accurately monitor a process' resource utilization because it will change from microsecond to microsecond. In addition, some resources are very difficult to accurately measure:

Memory

On contemporary computer systems, memory is very actively and dynamically managed by the Operating System using the hardware's virtual memory features. This enables many useful techniques, including:

  • Demand Loading - Only the portion of programs which are used are loaded. Code for features that are not used is not loaded into memory. For example, in a word processor (such as LibreOffice/OpenOffice or Word), features such as table of content generation, endnotes, and watermarks are not used in many documents, and the code for those features will not be loaded in many cases.
  • Sharing of Memory - Shared libraries (also called Dynamically Linked Libraries) may be used by many different processes. These libraries are loaded into memory only once, using demand loading, regardless of the number of processes using each library. Similarly, a program which is running in two or more processes will be loaded into memory only once, and shared between the processes. This significantly reduces memory requirements.
  • Swap - When system memory (RAM) is approaching full utilization, the operating system may take some of the least-recently-used areas of memory and place them in storage (hard disk or solid state disk) or compress them in order to avoid running out of free memory. Areas of memory swapped out may be swapped back in if they are later required.

Due to the utilization of these techniques and others, the memory consumption of a program can be calculated in many different ways. For example:

  • You could add up the full size of the program, all of the shared libraries, and the data used by a process, but that would yield a large number (a pessimistic view of memory consumption). The process is likely not occupying that much memory, and terminating the process will typically release only a fraction of that memory because most of the shared libraries will still be loaded into memory and in use by other programs.
  • You could add up just the portion of the program in memory plus the data area in memory used by a process, but this would understate the full memory utilization because it does not include the shared libraries nor the portion of the program or data which has been swapped out or which has not (yet) been demand-loaded.

Therefore resource monitoring tools may present several different statistics about memory usage for each process, or may try to present a rough approximation of the amount of total system memory which can be reasonably attributed to a process.

CPU

Each CPU core is independently capable of executing programs. Most modern CPUs have multiple cores (Symmetric Multi Processing, SMP), enabling multiple programs to be executed simultaneously. Many modern CPUs can execute more than one thread on a core (Symmetric Multi Threading, SMT), meaning that they have hardware support for rapid switching between two or more processes (or, in some cases, sub-processes called threads) on one core -- so a 4-core CPU may be marketed as capable of running up to 8 tasks. However, this does not mean that 8 programs can be fully executed at once!

To use an analogy, a SMP processor is a bit like an apartment building, where each core is like an apartment ad can fully accommodate a family (whether a single, couple, roommates, or parents and children), or, in the case of the CPU, fully execute a process. SMT capability is a bit like Airbnb rentals, which enable those units to be shared out quickly when they're not in use by the main occupants, or in the case of the CPU, quickly run other threads when the core (or part of the core) is not in use.

Further complicating the issue is the fact that CPUs may have multiple cores of different specifications -- some fast, power-hungry cores used for heavy tasks, and other slower, energy-efficient cores for lighter tasks. Cores may be shut down and started up by the OS as needed. For example, some Seneca lab computers have an Intel CPU with 12 cores consisting of 10 performance cores (capable of running 2 threads) and 2 efficiency cores (capable of running 1 thread). In a similar way, a Google Pixel 8 phone has 4 energy-efficient/low-performance Arm Cortex-A510 cores, 4 mid-range Cortex-A715 cores, and one high-energy-usage/very high-performance Cortex-X3 core.

In addition, current CPUs can operate at a range of speeds, and the OS and hardware work together to dynamically tune the speed to balance temperature, energy usage, and performance.

Therefore, statistics reporting the percentage of CPU capability in use by a process may report the percentage of a core's capability in use, either with or without considering SMT capabilities, or they may report the percentage of the full CPU's capability (including all cores). When cores of different specifications are part of a single CPU, it may be difficult to determine the relative ratio of performance between the different types of cores, especially as the speed of those cores is being adjusted -- and therefore utilization percentages are almost always a rough approximation.

Monitoring and Terminating Processes

Monitoring and Terminating Processes on Windows

Graphical User Interface

To manage processes graphically on Windows, use the Task Manager tool. You can access this from the Start menu, or by pressing Ctrl-Alt-Delete and selecting Task Manager from the menu that appears.

The Task Manager display shows processes grouped by executable name, along with approximate resource usage.

To terminate a process, select it using the mouse, and then click on the End Task button in the lower-right corner of the display.

Command Line Interface using the CMD Shell

To manage processes using the CMD shell (the default shell on Windows), use these commands:

1. tasklist - displays a list of tasks (processes) active on the system. You can use options to select which processes are displayed, as well as the output format (table, list, or comma-separated values).

2. taskkill - terminates a process. By default, this command attempts to get tasks to terminate in a safe manner (for example, if the program is saving a file, that operation will be completed before the program terminates). If a program does not respond to request, you can specify the /f option, which forcibly terminates the program.

You can specify the process to be terminated in one of two ways:

  • By process ID, using the /PID nnn option, which will terminate the process with the specified process ID.
  • By image (program or library) name, using the /IM name option, which terminates processes with the given image name. Asterisk wildcard characters may be specified as part of the name. Names must include the extension (for example, use taskkill /im firefox.exe or taskkill /im firefox* instead of taskkill /im firefox).

The tasklist and taskkill commands also provide a mechanism for filtering the process selection; see the online documentation for details (help tasklist or help taskkill).

Command Line Interface using Powershell

Powershell is an alternate Windows shell. You can use these commands to view and terminate processes using Powershell:

1. get-process - Displays a list of current processes with basic information about each. You can specify a program name as a positional argument (without the filename extension); see the online documentation for other available options.

2. stop-process - Terminates a process. You may specify a PID using the -ID option (stop-process -id pid) or a program name (without the filename extension) using the -NAME option (stop-process -name name).

Idea.png
Short Names
Many Powershell commandlets (built-in commands) have short names. The short name for the get-process command is ps and the short name for the stop-process command is kill, which conveniently match the names of similar commands on Linux!

Monitoring and Terminating Processes on Linux

Command Line Interface

From the bash (default shell) command line on Linux, you can view the current process table using the process status command ps. By default, it will show only processes associated with the current shell, and will show only the process ID (PID), terminal, total execution time, and command name:

$ ps
    PID TTY          TIME CMD
 303632 pts/4    00:00:00 bash
 303771 pts/4    00:00:00 ps

There are many ps options available to control which processes are displayed and what information is displayed about each process. These are the more commonly-used:

-u user  - Displays all processes owned by user

-e - Shows every process

-l - Shows long output, including process status (S), process ID (PID), parent process ID (PPID), approximate memory size (SZ), total execution time (TIME), and program name (CMD)

-f - Shows full output, including process ID (PID), parent process ID (PPID), process start time (STIME), total execution time (TIME), and program name (CMD)

To terminate a process on Linux, send it a signal using the kill command. Processes are specified by ID:

kill PID

By default, processes are send the terminate signal (signal 15, SIGTERM). This requests that the process terminate gracefully (for example, by completing pending operations before stopping). If a program does not respond to this signal, the kill signal (signal 9, SIGKILL) may be specified; this signal tells the operating system to abruptly and forcefully terminate the process. Either of these forms is accepted:

kill -9 PID
kill -KILL PID

There are many other signals that may be sent to processes; to see a list of all available signals, run the command kill -l or see the online documentation for signal(7) (by running the command: man 7 signal).

To find all processes associated with a given program, use the pgrep command: pgrep name

To terminate processes by program name, use the killall command: killall name

Text User Interface

In addition to the command-line interface (CLI) tools mentioned above, there are several text user interface (TUI) tools available which display a full-screen view of the current process status which is updated periodically.

The most common TUI process monitoring tool is top, which displays output like this:

top - 11:51:05 up 1 day, 22:23,  2 users,  load average: 0.63, 0.62, 0.66
Tasks: 530 total,   1 running, 529 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.2 us,  1.4 sy,  0.0 ni, 97.1 id,  0.0 wa,  0.2 hi,  0.1 si,  0.0 st
MiB Mem :  28797.0 total,    730.7 free,  17121.8 used,  10944.4 buff/cache
MiB Swap:   8192.0 total,   8188.0 free,      4.0 used.  10960.2 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 299042 qemu      20   0   11.4g   8.2g  30336 S  18.5  29.2  23:06.23 qemu-system-x86                     
   2382 chris     20   0 1313576 201884  78048 S   2.6   0.7  11:56.51 Xorg                                
   7037 chris     20   0   33.0g 562524 275008 S   2.6   1.9  24:20.54 chrome                              
   2654 chris     20   0 6512860 298252 136624 S   2.3   1.0  16:25.62 gnome-shell                         
 304806 chris     20   0 1005964  54372  40312 S   2.3   0.2   1:00.46 gnome-system-mo                     
   8265 chris     20   0  851044  64084  39280 S   1.0   0.2  14:41.79 gnome-terminal-                     
   1111 polkitd   20   0  603836  12488   7528 S   0.7   0.0   3:37.71 polkitd                             
   7089 chris     20   0   33.0g 324364 171304 S   0.7   1.1   5:50.08 chrome                              
   7354 chris     20   0 1134.3g 355716 129476 S   0.7   1.2   6:32.51 chrome                              
 296095 chris     20   0 1132.2g 160168 115772 S   0.7   0.5   1:14.49 chrome                              
 299134 qemu      20   0   11.0g   2.9g  27264 S   0.7  10.2   1:25.34 qemu-system-x86                     
      1 root      20   0  217576  28572  10624 S   0.3   0.1   0:54.85 systemd                             
   1118 root      20   0   15232   7552   6784 S   0.3   0.0   0:25.38 systemd-machine                     
   2823 root      20   0  249680  19604   8064 S   0.3   0.1   7:15.86 sssd_kcm                            
   2955 chris     20   0  684472  17024  14720 S   0.3   0.1   9:13.72 gsd-smartcard                       
   3340 root      20   0  542844  13952  11776 S   0.3   0.0   0:04.69 abrt-dbus                           
   7090 chris     20   0   32.6g 155276 108568 S   0.3   0.5  13:29.98 chrome                              
   7363 chris     20   0 1132.3g 335376 120948 S   0.3   1.1   3:16.12 chrome                              
 295131 chris     20   0 1136.3g 426468 132800 S   0.3   1.4   3:13.88 chrome                              
 311918 chris     20   0  225500   4224   3072 R   0.3   0.0   0:00.21 top                                 
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.20 kthreadd                            
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                              
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                          
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 slub_flushwq                        

This display is sorted by processor utilization (shown in the %CPU column); you can change the sort order to memory utilization (%MEM) by pressing Shift-M, and change back to processor utilization by pressing Shift-P.

By default, this display is updated every 3 seconds; you can change the update frequency by pressing S and typing a new update frequency (in seconds between updates).

To terminate a process, press K; the program will prompt you for the process ID to be killed (defaulting to the one at the top of the display, using the most resources), and the signal to be sent to that process (defaulting to signal 15, SIGTERM).

To see help messages about available options, press the ? key.

To exit from top, press the Q key (quit).

The top command is available on most Linux and Unix-like systems, including matrix.senecacollege.ca. There are several newer commands available, including htop and btop, but these are not present on all systems.

Graphical User Interface

If you're using a GUI on a Linux system, many graphical process monitoring and control tools are available, including the Gnome System Monitor and Conky.