主存屬於可搶佔資源嗎?

主存(內存)一般被視為非可搶佔資源,即進程已經分配內存後,操作系統不會輕易將其從該進程中搶佔。然而在一些情況下,主存也可以被視為可搶佔資源。

一、 內存分配

在大多數情況下,內存是由操作系統在進程啟動時分配的。操作系統負責為進程中的每個線程分配一些私有內存,進程中的所有線程共享一些公共內存。

例如,在Linux中,可以使用malloc()函數為變量或數組分配內存。該函數從進程的堆中分配內存,並返回一個指向所分配內存的指針。操作系統將返回的內存區域映射到該進程的地址空間中,這樣進程就可以訪問該內存區域。

然而,在某些情況下,操作系統可能會搶佔部分內存區域並將其分配給其他進程。例如,當系統的物理內存不足時,操作系統可能會利用虛擬內存技術將進程的部分內存映射到磁盤上,在需要時再將其讀入內存中。當系統需要更多內存時,操作系統可能會將進程佔用的部分內存寫回磁盤並將其搶佔。


int main()
{
    // 分配10個整數的數組
    int* nums = (int*)malloc(10 * sizeof(int));
    if (nums == NULL)
    {
        printf("內存分配失敗!\n");
        return -1;
    }
    for (int i = 0; i < 10; i++)
    {
        nums[i] = i;
    }
    // 釋放內存
    free(nums);
    return 0;
}

二、 內存泄漏

內存泄漏是指應用程序分配內存後,未能釋放該內存,最終導致系統中的可用內存不足。內存泄漏可能導致系統崩潰或嚴重性能下降。

例如,在下面的代碼中,如果忘記使用free()函數釋放nums變量,則可能導致內存泄漏。


int main()
{
    // 分配10個整數的數組
    int* nums = (int*)malloc(10 * sizeof(int));
    if (nums == NULL)
    {
        printf("內存分配失敗!\n");
        return -1;
    }
    // 忘記釋放內存
    return 0;
}

三、虛擬內存

虛擬內存是一種將進程內存映射到磁盤空間的技術。當進程需要訪問某個內存頁時,操作系統將從磁盤中讀取該頁到物理內存中。因此,虛擬內存為進程提供了一個比物理內存更大的地址空間。

當系統物理內存不足時,操作系統可能會將某些頁寫回磁盤並將其搶佔。因此,虛擬內存是一種可搶佔資源。

下面的代碼演示了如何使用虛擬內存技術,將進程的內存映射到磁盤上:


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>

int main()
{
    int fd, i;
    char* ptr;
    // 打開文件,如果不存在則創建它
    fd = open("test.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    if (fd == -1)
    {
        printf("文件打開失敗!\n");
        return -1;
    }
    // 調整文件大小為4KB
    if (ftruncate(fd, 4096) == -1)
    {
        printf("文件調整大小失敗!\n");
        close(fd);
        return -1;
    }
    // 將文件映射到內存中
    ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (ptr == MAP_FAILED)
    {
        printf("內存映射失敗!\n");
        close(fd);
        return -1;
    }
    // 寫入數據
    for (i = 0; i < 4096; i++)
    {
        ptr[i] = i % 256;
    }
    // 解除內存映射
    if (munmap(ptr, 4096) == -1)
    {
        printf("內存解除映射失敗!\n");
        close(fd);
        return -1;
    }
    // 關閉文件
    close(fd);
    return 0;
}

四、可交換內存

可交換內存是一種僅在內存不足時才會被搶佔的內存。例如,在Linux中,可交換內存可以通過將頁面從物理內存中交換到交換分區或磁盤上來實現。

下面的代碼演示了如何創建一個使用可交換內存的進程:


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

int main()
{
    int i;
    char* ptr;
    // 使用可交換內存分配10MB內存
    ptr = (char*)malloc(1024 * 1024 * 10);
    if (ptr == NULL)
    {
        printf("內存分配失敗!\n");
        return -1;
    }
    // 寫入數據
    for (i = 0; i < 1024 * 1024 * 10; i++)
    {
        ptr[i] = i % 256;
    }
    // 休眠10秒,等待操作系統將頁面寫回磁盤
    sleep(10);
    // 釋放內存
    free(ptr);
    return 0;
}

原創文章,作者:AYIMH,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/375357.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
AYIMH的頭像AYIMH
上一篇 2025-04-29 12:49
下一篇 2025-04-29 12:49

相關推薦

  • Python飛機大戰中文字資源分析

    Python飛機大戰是一款經典的飛行射擊遊戲,在遊戲過程中,玩家需要控制一架飛機不斷消滅敵人,生存到最後。該遊戲使用Python語言編寫,其中涉及到的文字資源對遊戲的整體體驗有重要…

    編程 2025-04-29
  • 從零入坑嵌入式及相關優質資源推薦

    對於一個全能編程開發工程師而言,嵌入式開發是不可忽視的領域。本文將從入坑嵌入式的不同方面進行詳細闡述,並推薦一些優質資源。 一、嵌入式開發簡介 嵌入式開發是指將多種軟硬件技術融合在…

    編程 2025-04-28
  • k8scpu: Kubernetes資源調度中的CPU管理

    在Kubernetes中,我們可以使用k8scpu來管理CPU資源。這個工具可以幫助我們確保每個容器都有足夠的CPU資源來運行應用程序,同時避免浪費資源。本文將從多個方面對k8sc…

    編程 2025-04-23
  • JMeter監控服務器資源

    一、JMeter監控服務器資源簡介 JMeter是一個開源的Java應用程序,主要用於完整的性能測試、功能測試和負載測試。在jmeter性能測試中,我們強烈建議通過監測資源利用情況…

    編程 2025-04-22
  • 深入理解Nginx靜態資源的優化

    一、Nginx簡介 Nginx是一個高性能的Web服務器,它能夠處理靜態請求,也可以作為反向代理服務器和負載均衡器來處理動態請求。Nginx的高可靠性、高性能和低內存消耗使得它成為…

    編程 2025-04-12
  • Spring Boot靜態資源放行指南

    在Spring Boot應用中,靜態資源放行是個不可或缺的部分。這些資源包括展示在Web應用頁面上的圖片、CSS和JavaScript等文件。在本文中,我們將通過幾個方面來講述如何…

    編程 2025-04-12
  • springboot靜態資源映射詳解

    一、Springboot靜態資源映射基礎 Springboot 是目前最常用的 Java 開發框架之一,其中最重要的一個特性是可以快速構建 Web 應用程序。在 Web 應用程序中…

    編程 2025-01-24
  • 資源分解結構(RBS)

    一、概述 資源分解結構(Resource Breakdown Structure, RBS)是一種將項目按資源類型和分類進行逐級分解和組織的工具。它是項目管理中資源管理的重要手段,…

    編程 2025-01-21
  • Macwget:如何高效獲取網站資源

    一、Macwget簡介 Macwget是一種在Mac OS X操作系統下常用的網絡資源下載工具,使用簡單,功能強大。它可以從各種服務器上下載文件或整個網站,並可以遞歸地下載鏈接的所…

    編程 2025-01-16
  • Macwget:如何高效獲取網站資源

    一、Macwget簡介 Macwget是一種在Mac OS X操作系統下常用的網絡資源下載工具,使用簡單,功能強大。它可以從各種服務器上下載文件或整個網站,並可以遞歸地下載鏈接的所…

    編程 2025-01-16

發表回復

登錄後才能評論