国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法

這篇具有很好參考價值的文章主要介紹了動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.1 ?設計目的

理解存儲管理的功能,掌握動態(tài)異長分區(qū)內存管理中的最佳適應算法。

1.2 ?設計要求

本設計要求模擬最佳適應算法的分配算法和回收算法。

1.3??數據結構設計

空閑區(qū)域首址

空閑區(qū)域長度

addr

size

圖1-1 空閑區(qū)域表

為了實現存儲資源的分配和回收,操作系統(tǒng)需要記錄內存資源使用情況,即哪些區(qū)域尚未分配,哪些區(qū)域已經分配以及分配給哪些進程等。為此一般需要兩個表,一個為分配表, 另外一個為空閑區(qū)域表。前者記錄已經分配的區(qū)域, 后者記錄著所有當前未被進程占用的空閑區(qū)域, 如圖1-1所示。

顯然, 沒有記錄于表中的區(qū)域即為已被進程所占用的非空閑區(qū)域,在實際的操作系統(tǒng)中,這些區(qū)域登記在進程的PCB中。而PCB中除了關于內存資源的信息外,還有其它大量信息。

由于本設計是對存儲管理算法的模擬,所以用一個線程來代表一個進程,用線程駐留區(qū)域表來描述線程占用的內存空間,如圖1-2所示。

線程名稱

駐留區(qū)始址

駐留區(qū)大小

a

0

15

b

20

10

……

……

……

圖1-2 線程駐留區(qū)表

同時,需要一張表來記錄各個線程對內存的請求信息,如圖1-3所示。

線程名稱

請求大小(KB)

預計駐留時間( 秒)

thread_1

15

8

thread_2

11

4

……

……

……

圖1-3 內存申請表

1.4??算法設計

1.4.1??算法結構設計

分配時取滿足申請要求且長度最小的空閑區(qū)域。在實現時, 可將系統(tǒng)中所有的空閑區(qū)域按照長度由小到大的次序依次記錄于空閑區(qū)域表中。與最先適應算法相類似, 當進程申請存儲空間時, 系統(tǒng)由表的頭部開始查找, 取第一個滿足要求的表目。如果該表目所對應的區(qū)域長度恰好與所申請的區(qū)域長度相同, 則將該區(qū)域全部分配給申請者。否則將該區(qū)域分割為兩部分, 一部分的長度與所申請的長度相同, 將其分配給申請者;另一部分即剩余部分的長度為原長度與分配長度之差, 由于剩余部分的長度已經改變,所以應重新將其按長度從小到大的順序插入到空閑區(qū)域表中。

回收時,不僅要按回收區(qū)的首地址查詢空閑區(qū)表,找到與回收區(qū)相臨的空閑區(qū),將其合并到相臨區(qū)中,而且要把合并后的回收區(qū)按照長度遞增的順序插入到空閑區(qū)域表的適當位置。

1.4.2??設計并分析測試數據

假設初始內存布局如圖1-4,圖中的起始地址以及大小都以KB來衡量。

起始地址

0

15

20

30

40

70

85

105

135

180

占用者

a

b

c

d

e

大 ?小

15

5

10

10

30

15

20

30

45

20

圖1-4初始內存布局

由圖1-4可見,初始時共有五個線程駐留在內存,它們是a,b,c,d,e,線程駐留區(qū)表如圖1-5;還有五個空閑區(qū),空閑區(qū)域表如圖1-6。

假設現在有三個線程提出內存申請,申請情況見圖1-7。經過分析我們得到在每種分配算法下這三個線程所申請到的內存情況。圖1-8是最佳適應算法分配情況。

線程名稱

駐留區(qū)始址

駐留區(qū)大小

a

0

15

b

20

10

c

40

30

d

85

20

e

135

45

圖1-5 線程駐留區(qū)表

空閑區(qū)首址

空閑區(qū)長度

15

5

30

10

70

15

105

30

180

20

圖1-6 空閑區(qū)域表

線程名稱

請求大小(KB)

預計駐留時間( 秒)

thread_1

15

8

thread_2

11

4

thread_3

3

5

圖1-7 內存申請表

線程名稱

駐留區(qū)始址

駐留區(qū)大小

a

0

15
b 20 10
40c30 40

30

d 85 20
e 135 45
thread_1 70 15
thread_2 70 11
thread_3 15 3
圖1-8 最佳適應算法線程駐留區(qū)表

1.4.3??程序設計

程序包含兩個文件,一個是頭文件variable_partition.h,另一個是源程序文件variable_partition.cpp。在頭文件中定義了宏、數據結構、全局變量、函數聲明,源程序中含有各個函數的實現。

在頭文件中,結構體FREEAREA、REQUIRE_MEMORY、THREAD_RESIDENCE_MEMORY分別對應于圖1-1、圖1-2、圖1-3中的一行,不同之處是為了構成鏈表在三個結構體中都有前向指針。數組init_free_area_table對應于圖1-6,數組init_thread_require_memory_table對應于圖1-5,數組init_thread_residence_memory_table對應于圖1-7,為了實現動態(tài)分配與釋放,用鏈表重新組織空閑區(qū)域表、線程駐留區(qū)表和內存申請表,全局變量p_free_area_list是空閑區(qū)鏈首,p_thread_require_memory_queue是內存申請隊列的隊首,p_thread_residence_memory_list是線程駐留區(qū)鏈首,tail_thread_residence_memory_list是線程駐留區(qū)鏈尾,由于線程駐留區(qū)鏈表被內存分配函數和內存釋放函數共享,故用臨界區(qū)變量CS_THREAD_MEMORY_LIST來保護,同理,屏幕是所有線程共享的,所以用臨界區(qū)變量CS_SCREEN來保護,空閑區(qū)鏈表被內存分配函數和內存釋放函數共享,故用臨界區(qū)變量CS_FREEAREA_LIST來保護。h_thread是線程句柄數組,用來存放各個線程的句柄。

程序共包含13個函數,按照作用可以將它們分成五組。

第一組包括函數print_space()和函數display_thread_residence_memory(),前者用來顯示若干個空格,后者用來顯示線程駐留區(qū)表;

第二組共十一個函數,用來實現最佳適應分配法,它們的名稱及功能如圖1-9。

函數名稱

函數功能

BF_initialize_freearea_list

初始化空閑區(qū)鏈表:按長度遞增排序

BF_delete_freearea_list

刪除空閑區(qū)鏈表

BF_initialize_require_memory_list

初始化內存申請鏈表

BF_delete_require_memory_list

刪除內存申請鏈表

BF_initialize_thread_residence_memory_list

初始化線程駐留區(qū)鏈表

BF_delete_thread_residence_memory_list

刪除線程駐留區(qū)鏈表

BF_thread

線程函數:申請內存;駐留內存;釋放內存

BF_require_memory

申請一段內存,成功時返回起始地址,失敗時返回空

BF_release_memory

釋放一段內存

BF_insert_freearea

將空閑區(qū)按大小遞增的次序插入到空閑區(qū)鏈表中

BF()

初始化函數:創(chuàng)建線程并等待它們結束

圖1-9 ??最佳適應分配法的函數及其功能

1.4.4??程序流程圖設計

1.函數關系調用圖

動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法,算法

圖1-10???函數關系調用圖

2.主要程序流程圖

動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法,算法

圖1-11???主要程序流程圖

3.內存申請函數流程圖

動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法,算法

圖1-12??內存申請函數流程圖

4.內存釋放函數流程圖

動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法,算法

圖1-13??內存釋放函數流程圖

1.5 ?程序代碼

內存申請函數

// 最佳適應分配算法的內存申請函數
int BF_require_memory(int size) {
    FREEAREA *p = p_free_area_list;
    FREEAREA *prev = NULL;
    int best_fit_start = -1;
    int best_fit_size = INT_MAX;
    // 尋找最佳適應的空閑區(qū)
    while (p != NULL) {
        if (p->size >= size && p->size < best_fit_size) {
            best_fit_start = p->start_address;
            best_fit_size = p->size;
            prev = p;
        }
        p = p->next;
    }
    // 如果找到了最佳適應的空閑區(qū)
    if (best_fit_start != -1) {
        // 劃分空閑區(qū)
        if (best_fit_size > size) {
            FREEAREA *new_free_area = (FREEAREA *)malloc(sizeof(FREEAREA));
            new_free_area->next = prev->next;
            new_free_area->start_address = best_fit_start + size;
            new_free_area->size = best_fit_size - size;

            prev->next = new_free_area;
        }
        // 從空閑區(qū)鏈表中刪除已分配的空閑區(qū)
        if (prev == NULL) {
            p_free_area_list = p_free_area_list->next;
        } else {
            prev->next = prev->next->next;
        }
        return best_fit_start;
    }
    return -1; // 內存申請失敗
}

內存釋放函數

// 最佳適應分配算法的內存釋放函數
void BF_release_memory(int start_address,int size){
EnterCriticalSection(&CS_FREEAREA_LIST);
    FREEAREA *temp, *p, *pp;
    p=p_free_area_list;
    temp = new FREEAREA;
    temp->start_address=start_address;
    temp->size=size;
    temp->next=NULL;
    int flag=0;
    while(1) {
  if(p->next!=NULL&&start_address+size<=p->next->start_address&&start_address>=p->start_address+p->size) {
            temp->next=p->next;
            p->next=temp;
            flag=1;
        }
        if(flag==1||p->next==NULL) break;
        p=p->next;
    }
    if(start_address>=p->start_address+p->size) {
        if(flag==0)
            p->next=temp;
    } else {
        if(flag==0) {
            pp=p_free_area_list;
            temp->next=pp;
            pp->next=p_free_area_list->next;
            p_free_area_list=temp;
        }
    }
    FREEAREA *ppp;
    ppp=p_free_area_list;
    while(1) {
        if(ppp->next!=NULL) {
            if(ppp->start_address+ppp->size==ppp->next->start_address) {
                ppp->size+= ppp->next->size;
                if(ppp->next->next!=NULL)
                    ppp->next=ppp->next->next;
                else {
                    ppp->next=NULL;
                }
                continue;
            }
        }
        if(ppp->next!=NULL) ppp=ppp->next;
        else break;
    }
    EnterCriticalSection(&CS_SCREEN);
    THREAD_RESIDENCE_MEMORY *q;
    q = p_thread_residence_memory_list;
    if (q->start_address == start_address) {
        p_thread_residence_memory_list = p_thread_residence_memory_list->next;
    } else {
        while (q->next != NULL) {
            if (q->next->start_address == start_address) {
                if (q->next == tail_thread_residence_memory_list) {
                    tail_thread_residence_memory_list = q;}
                q->next = q->next->next;
                break;
}
            q = q->next;
}
}
    LeaveCriticalSection(&CS_SCREEN);
    LeaveCriticalSection(&CS_FREEAREA_LIST);
}

1.6 ?運行結果

1.6.1??運行結果截圖

動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法,算法

動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法,算法

圖1-14??運行結果一

動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法,算法

動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法,算法

圖1-15??運行結果二

1.6.2??運行結果分析

第一次運行:

線程thread_1:

請求內存成功,分配了大小為15 KB的內存,起始地址為70 KB。

顯示線程內存駐留區(qū)鏈表。

線程thread_2:

請求內存成功,分配了大小為11 KB的內存,起始地址為70 KB。

顯示線程內存駐留區(qū)鏈表。

線程thread_3:

請求內存成功,分配了大小為3 KB的內存,起始地址為15 KB。

顯示線程內存駐留區(qū)鏈表。

模擬結束后:

所有線程執(zhí)行完畢后,顯示線程內存駐留區(qū)鏈表。

第二次運行:

線程thread_2:

請求內存成功,分配了大小為11 KB的內存,起始地址為70 KB。

顯示線程內存駐留區(qū)鏈表。

線程thread_3:

請求內存成功,分配了大小為3 KB的內存,起始地址為15 KB。

顯示線程內存駐留區(qū)鏈表。

線程thread_1:

請求內存成功,分配了大小為15 KB的內存,起始地址為70 KB。

顯示線程內存駐留區(qū)鏈表。

模擬結束后:

所有線程執(zhí)行完畢后,顯示線程內存駐留區(qū)鏈表。

對于兩次運行結果不同做以下原因分析:

每次運行結果不同的原因主要是因為程序中使用了多線程,多線程程序的執(zhí)行順序是不確定的。在多線程環(huán)境中,操作系統(tǒng)的調度器決定了每個線程何時獲得 CPU 時間。不同運行中線程的交替執(zhí)行順序可能不同,從而導致不同的結果。

程序實現了一個使用線程的內存分配和釋放算法--最佳適應算法。線程被創(chuàng)建來模擬不同的進程,這些進程或任務請求和釋放內存。線程的并發(fā)執(zhí)行,加上潛在的競爭條件和線程爭用,可能導致每次運行中內存分配和釋放的順序不同。

1.7??設計總結

????????在設計最佳適應算法的動態(tài)異長分區(qū)內存管理系統(tǒng)時,理解了存儲管理的關鍵功能,并掌握了最佳適應算法的分配和回收過程。在數據結構設計方面,建立了兩張關鍵表:分配表和空閑區(qū)域表。分配表記錄已經分配的內存區(qū)域,而空閑區(qū)域表則記錄當前未被進程占用的空閑內存區(qū)域。通過線程駐留區(qū)域表和內存申請表,成功地將進程與其內存請求信息關聯起來,以便模擬實際存儲管理情境。在算法設計方面,最佳適應算法的核心思想是分配時選擇滿足要求且長度最小的空閑區(qū)域。實現了按照空閑區(qū)域長度由小到大的順序記錄空閑區(qū)域表,并在分配時從表頭開始查找符合條件的區(qū)域。若找到匹配的區(qū)域,根據申請大小進行分配或分割,并重新排序插入剩余部分。在回收過程中,實現了按照回收區(qū)的首地址查詢空閑區(qū)表,找到相鄰的空閑區(qū)并合并。然后,將合并后的回收區(qū)按長度遞增的順序插入到空閑區(qū)域表的適當位置。同時每次運行結果不同的原因主要是因為程序中使用了多線程,多線程程序的執(zhí)行順序是不確定的。在多線程環(huán)境中,操作系統(tǒng)的調度器決定了每個線程何時獲得 CPU 時間。不同運行中線程的交替執(zhí)行順序可能不同,從而導致不同的結果,對于操作系統(tǒng)中進程的并發(fā)有了更好的理解。文章來源地址http://www.zghlxwxcb.cn/news/detail-827173.html

到了這里,關于動態(tài)異長分區(qū)內存分配與去配算法的設計-最佳適應算法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 編寫C語言程序,模擬實現首次/最佳/最壞適應算法的內存塊分配和回收,要求每次分配和回收后顯示出空閑分區(qū)和已分配分區(qū)的情況。假設初始狀態(tài)下,可用的內存空間為640KB。(江西師范大學軟件學院 操作系統(tǒng))

    為了實現動態(tài)分區(qū)分配,通常將系統(tǒng)中的空閑分區(qū)鏈接成一個鏈。所謂順序查找是指依次搜索空閑分區(qū)鏈上的空閑分區(qū),去尋找一個大小能滿足要求的分區(qū)。 --------計算機操作系統(tǒng)(第四版) 可變分區(qū)也稱動態(tài)分區(qū),在指作業(yè)裝入內存時,從可用的內存中劃出一塊連續(xù)的區(qū)域

    2024年02月08日
    瀏覽(22)
  • 操作系統(tǒng)動態(tài)內存分配算法【C語言實現】

    操作系統(tǒng)動態(tài)內存分配算法【C語言實現】

    題目: 采用五個算法,各自作業(yè)在1024kB空間上分配情況。 內存可變分區(qū)分配仿真算法 :首次適應,下次適應,最佳適應,最壞適應和快速分配。 使用的結構體數組表示起始地址,內存塊大小,內存塊狀態(tài)(0空閑,1占用) void bubbleprint(struct Info info[]) 函數是為了內存塊大小

    2024年02月03日
    瀏覽(25)
  • 操作系統(tǒng)動態(tài)分區(qū)分配方式C/C++語言(首次適應算法(FF)循環(huán)首次適應算法(NF)最best適應算法(BF)最壞適應算法(WF))

    操作系統(tǒng)動態(tài)分區(qū)分配方式C/C++語言(首次適應算法(FF)循環(huán)首次適應算法(NF)最best適應算法(BF)最壞適應算法(WF))

    一、動態(tài)分區(qū)分配算法 為把一個新作業(yè)裝入內存,須按照一定的分配算法, 從空閑分區(qū)表或空閑分區(qū)鏈中出一分區(qū)分配給該作業(yè)。由于內存分配算法對系統(tǒng)性能有很大的影響,故人們對它進行了較為廣泛而深入的研究,于是產生了許多動態(tài)分區(qū)分配算法。傳統(tǒng)的四種分配算

    2024年02月10日
    瀏覽(17)
  • 資源分配問題【算法設計與分析】<動態(tài)規(guī)劃問題>

    資源分配問題【算法設計與分析】<動態(tài)規(guī)劃問題>

    問題分析: ( 要把問題分為多步解決,每步求出子問題的多個最優(yōu)策略后一步依賴于上一步的最有策略,最后一步得出問題的解) (1)首先要考慮分配給項目A的資金與利潤的關系。得到此時投資數x與其相對應的 的關系。 (2)其次要考慮分配給前兩個項目A,B的總資金 與利

    2023年04月08日
    瀏覽(26)
  • 實驗名稱:動態(tài)分區(qū)分配方式模擬

    實驗名稱:動態(tài)分區(qū)分配方式模擬

    實驗名稱:動態(tài)分區(qū)分配方式模擬 實驗目的 進一步加深對動態(tài)分區(qū)分配管理方式的理解;掌握動態(tài)分區(qū)分配方式使用的數據結構、分配算法和回收算法 實驗內容 編寫C語言程序,模擬實現首次/最佳/最壞適應算法的內存塊分配和回收,要求每次分配和回收后顯示出空閑分區(qū)和

    2024年02月03日
    瀏覽(25)
  • 【C/C++】靜態(tài)內存分配與動態(tài)內存分配

    1.1 - 定義概述 內存分配 (Memory Allocation) 是指為計算機程序或服務分配物理內存空間或虛擬內存空間的一個過程。通常在程序執(zhí)行前或執(zhí)行時完成內存分配。 1.2 - 分類概述 存在兩種類型的內存分配: 編譯時內存分配或靜態(tài)內存分配 (Compile-time or Static Memory Allocation) 運行時內存

    2024年02月11日
    瀏覽(24)
  • C++——內存分配與動態(tài)內存管理

    C++——內存分配與動態(tài)內存管理

    ??作者簡介: 花想云 ,在讀本科生一枚,致力于 C/C++、Linux 學習。 ?? 本文收錄于 C++系列 ,本專欄主要內容為 C++ 初階、C++ 進階、STL 詳解等,專為大學生打造全套 C++ 學習教程,持續(xù)更新! ?? 相關專欄推薦: C語言初階系列 、 C語言進階系列 、 數據結構與算法 本章我們

    2023年04月17日
    瀏覽(22)
  • 動態(tài)分配內存與釋放

    動態(tài)分配內存與釋放

    1.malloc malloc()可以找到一個大小合適的塊。 內存是匿名的,也就是說,malloc()分配了內存,但沒有為它指定名字。 格式如下: double*ptd; ptd=(double*)malloc(30*sizeof(double)); ps:ptd可以看成是一個數組。 malloc()可能分配不到所需的內存。在這種情況下,該函數返回空指針。

    2024年01月17日
    瀏覽(30)
  • 用指針實現內存動態(tài)分配

    導引 :已知:變量在使用前必須被定義且安排好存儲空間。且變量有這么一些分類:全局變量、靜態(tài)局部變量【它們的儲存一般是在編譯時確定,在程序開始執(zhí)行前完成?!孔詣幼兞俊驹趫?zhí)行進入變量定義所在的復合語句時為它們分配存儲,變量的大小也是靜態(tài)確定的。臨時

    2023年04月09日
    瀏覽(28)
  • C++ 指針進階:動態(tài)分配內存

    malloc 是 stdlib.h 庫中的函數,原型為 void *__cdecl malloc(size_t _Size); : 作用 : malloc 函數沿空閑鏈表(位于內存 堆空間 中)申請一塊滿足需求的內存塊,將所需大小的內存塊分配給用戶剩下的返回到鏈表上; 并返回指向該內存區(qū)的首地址的指針,意該指針的類型為 void * ,因此

    2024年02月05日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包