Worldscope

Linux Process Memory Usage

Palavras-chave:

Publicado em: 05/08/2025

Linux Process Memory Usage

Understanding how Linux processes utilize memory is crucial for developing efficient and stable applications. This article provides an overview of process memory usage in Linux, delves into methods for monitoring and analyzing it, and discusses techniques for optimizing memory footprint.

Fundamental Concepts / Prerequisites

Before diving into the specifics, it's important to understand a few key concepts:

  • Virtual Memory: Linux uses virtual memory, allowing processes to access more memory than physically available. This is achieved through techniques like swapping parts of memory to disk.
  • Address Space: Each process has its own private address space, which is divided into different segments: code (text), data (initialized variables), bss (uninitialized variables), heap (dynamic memory allocation), and stack (function calls and local variables).
  • Resident Set Size (RSS): The portion of a process's virtual address space that is resident in physical RAM.
  • Virtual Memory Size (VSZ): The total amount of virtual memory a process has allocated, including both resident and swapped-out memory.
  • /proc filesystem: A virtual filesystem that provides information about running processes, including memory usage details.

Implementation in C: Monitoring Memory Usage

We can use the /proc/[pid]/status file to obtain detailed memory information for a specific process. The following C code demonstrates how to read and parse relevant memory statistics.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BUFFER 256

int main(int argc, char *argv[]) {
  if (argc != 2) {
    fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
    return 1;
  }

  pid_t pid = atoi(argv[1]);
  char filename[MAX_BUFFER];
  snprintf(filename, MAX_BUFFER, "/proc/%d/status", pid);

  FILE *fp = fopen(filename, "r");
  if (fp == NULL) {
    perror("Error opening file");
    return 1;
  }

  char line[MAX_BUFFER];
  long vmSize = 0, vmRss = 0;

  while (fgets(line, MAX_BUFFER, fp) != NULL) {
    if (strncmp(line, "VmSize:", 7) == 0) {
      sscanf(line, "VmSize: %ld kB", &vmSize);
    } else if (strncmp(line, "VmRSS:", 6) == 0) {
      sscanf(line, "VmRSS: %ld kB", &vmRss);
    }
  }

  fclose(fp);

  printf("Process ID: %d\n", pid);
  printf("Virtual Memory Size (VmSize): %ld kB\n", vmSize);
  printf("Resident Set Size (VmRSS): %ld kB\n", vmRss);

  return 0;
}

Code Explanation

The code first checks for the correct number of command-line arguments, expecting a process ID (PID). It then constructs the path to the /proc/[pid]/status file using snprintf.

The file is opened using fopen. If the file cannot be opened (e.g., due to insufficient permissions or an invalid PID), an error message is printed, and the program exits.

The code iterates through the file line by line using fgets. For each line, it checks if it starts with "VmSize:" or "VmRSS:" using strncmp. If a match is found, sscanf is used to extract the corresponding memory value (in kilobytes) and store it in the vmSize or vmRss variable.

Finally, the program prints the extracted memory information to the console.

Complexity Analysis

Time Complexity: The time complexity is O(n), where n is the number of lines in the /proc/[pid]/status file. Since this file is typically small, the time taken to read and parse it is generally negligible.

Space Complexity: The space complexity is O(1), as the code uses a fixed-size buffer (MAX_BUFFER) to store the contents of each line read from the file. The memory usage does not depend on the size of the process being monitored.

Alternative Approaches

Another approach to monitor process memory usage is to use the ps command in combination with tools like awk or grep. For example:

ps -p <pid> -o pid,vsz,rss

This command provides the PID, virtual memory size (VSZ), and resident set size (RSS) for a given process. Using command-line tools avoids the need to write C code but it might be less flexible for integration into larger programs and requires parsing string output, which can be error-prone. It also relies on external binaries.

Conclusion

Monitoring and understanding Linux process memory usage is essential for optimizing application performance and stability. This article covered how to use the /proc filesystem and C programming to monitor memory usage and introduced an alternative approach using command-line tools. By leveraging these techniques, developers can gain valuable insights into how their applications consume memory and identify potential memory leaks or inefficiencies.