• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Brian Warehouse

            Some birds aren`t meant to be caged, their feathers are just too bright... ...
            posts - 40, comments - 16, trackbacks - 0, articles - 1

            實驗二代碼 首次適應(yīng)法 位示圖法

            Posted on 2010-08-17 13:02 Brian 閱讀(1596) 評論(0)  編輯 收藏 引用 所屬分類: OS
            /*
            Title: 首次適應(yīng)算法
            Author: Brian
            Date: 2010/05/31
            */
            #include 
            <iostream>
            #include 
            <cstdlib> // system()
            using namespace std;

            typedef 
            struct SNode { // Space Node
                int start,end; // 起始,結(jié)束
                int length; // 長度大小
                struct SNode *next; // 指向下一結(jié)點的指針
            }* SP;

            SP space
            =(SP)malloc(sizeof(SNode)); // 全局變量,內(nèi)存空間頭結(jié)點


            void DispSpace() { // 顯示內(nèi)存空間分配情況

                SP p
            =space;
                cout
            <<"\n  空閑區(qū)說明表 \n"
                    
            <<"---地址--長度---\n";
                
            while (p->next)
                {
                    cout
            <<"    "<<p->next->start
                        
            <<"    "<<p->next->length<<endl;
                    p
            =p->next;
                }
                cout
            <<"----------------\n";
            }

            void Initial() { // 初始化說明表
                SP p,q;
                p
            =(SP)malloc(sizeof(SNode));
                q
            =(SP)malloc(sizeof(SNode));    
                p
            ->start=14; p->length=12; p->end=26;
                q
            ->start=32; q->length=96; q->end=128// 指導(dǎo)書上的作業(yè)分配
                space->next=p; // 與頭結(jié)點連接
                p->next=q;
                q
            ->next=NULL;
                DispSpace();
            }

            void Allocation(int len) { // 分配內(nèi)存給新作業(yè)
                SP p=space,q;
                
            while (p->next) {
                    
            if (p->next->length < len)
                        p
            =p->next;
                    
            else if (p->next->length > len) {
                        p
            ->next->start=p->next->start+len;
                        p
            ->next->length=p->next->length-len;
                        cout
            <<"分配成功!\n";
                        DispSpace(); 
            return;
                    }
                    
            else {
                        q
            =p->next;
                        p
            ->next=q->next;
                        cout
            <<"分配成功!\n";
                        DispSpace(); 
            return;
                    }    
                } 
                cout
            <<"分配失敗!\n";
                DispSpace(); 
            return;
            }

            void CallBack(int sta,int len) { // 回收內(nèi)存
                SP p=space,q=p->next,r; // 開始地址和長度
                p->end=0;
                
            int en=sta+len;
                
            while (q) {
                    
            if (sta == 0) { // 初始地址為0
                        if (en == q->start) { // 正好回收
                            q->start=0;
                            q
            ->length=q->end;
                            
            return;
                        }
                        
            else {
                            r
            =(SP)malloc(sizeof(SNode));
                            r
            ->start=sta; r->length=len; r->end=en;
                            p
            ->next=r;
                            r
            ->next=q;
                            
            return;
                        }
                    }
                    
            else if ((p->end < sta) && (q->start > en)) { // 上鄰區(qū)
                        r=(SP)malloc(sizeof(SNode));
                        r
            ->start=sta; r->length=len; r->end=en;
                        p
            ->next=r;
                        r
            ->next=q;
                        
            return;
                    }
                    
            else if ((p->end < sta) && (q->start == en)) { // 鄰區(qū)相接
                        q->start=sta;
                        q
            ->length=q->end-sta;
                        
            return;
                    }
                    
            else if ((p->end == sta) && (q->start < en)) { // 下鄰區(qū)
                        p->end=en;
                        p
            ->length=en-p->start;
                        
            return;
                    }
                    
            else if (p->end==sta && q->start==en) { // 鄰區(qū)相接
                        p->end=q->end;
                        p
            ->length=p->end-p->start;
                        p
            ->next=q->next;
                        
            return;
                    }
                    
            else {
                        p
            =p->next;
                        q
            =q->next;
                    }
                }
            }


            void main() {
                Initial();
                cout
            <<"現(xiàn)在分配大小為 6K 的作業(yè) 4 申請裝入主存: ";
                Allocation(
            6); // 分配時參數(shù)只有長度    
                
            //--------指導(dǎo)書測試數(shù)據(jù)演示----------
                cout<<"現(xiàn)回收作業(yè) 3 (起址10,長度4)\n";
                CallBack(
            10,4);
                DispSpace();
                cout
            <<"現(xiàn)回收作業(yè) 2 (起址26,長度6)\n";
                CallBack(
            26,6);
                DispSpace();
                
            //---------------演示結(jié)束-------------
                system("pause");
            }

             

            /*
            Title: 位示圖法
            Author: Brian
            Date: 2010/05/25
            */
            #include 
            <iostream>
            #include 
            <cstdlib>
            using namespace std;

            typedef 
            struct PNode { // 進(jìn)程PCB    
                struct PNode *next; // 后向指針
                char name[12]; // 進(jìn)程名
                int *PT; // 頁表
                int size; // 進(jìn)程所需要的空間
            }* Proc;

            Proc H
            =(Proc)malloc(sizeof(PNode)); // 進(jìn)程頭結(jié)點
            Proc CurrJob; // 當(dāng)前進(jìn)程指針

            int BG_DEF[8][8= {  // 指導(dǎo)書上的初始條件
                {1,1,0,0,1,1,1,0},
                {
            0,1,0,1,0,1,0,0},
                {
            0,0,0,0,0,0,0,0},
                {
            1,0,0,0,0,0,0,1},
                {
            0,0,0,0,0,0,0,0},
                {
            0,0,0,0,0,0,0,0},
                {
            0,0,0,0,0,0,0,0},
                {
            0,0,0,0,0,0,0,0
            };
            int FREE_DEF = 54// 指導(dǎo)書上初始條件的空閑塊數(shù)

            int BG[8][8]={0}; // 用戶自定義位示圖
            int FREE=64// 用戶自定義空閑塊數(shù)

            void DispBG(int flag) // 顯示當(dāng)前位示圖 F
            {
                cout
            <<"\n字節(jié)號\\位數(shù)\t0\t1\t2\t3\t4\t5\t6\t7\n";
                
            for(int i=0; i<8; i++)
                {
                    cout
            <<'\t'<<i;
                    
            for(int j=0; j<8; j++)
                    {
                        
            if (flag==1)
                            cout
            <<"\t"<<BG[i][j];
                        
            else cout<<"\t"<<BG_DEF[i][j];
                    }
                    cout
            <<endl;
                }
                cout
            <<endl;
            }

            void Initial() // 用戶選取坐標(biāo)初始化內(nèi)存塊
            {
                DispBG(
            1);
                cout
            <<"\n請輸入您想要分配的塊號坐標(biāo),以 -1 -1 結(jié)束:\n";
                
            int i,j;
                
            while (1)
                {
                    cin
            >>i>>j;
                    
            if (i+j==-2// i==-1 && j==-1
                        break;
                    BG[i][j]
            =1;
                    FREE
            --;
                }
                DispBG(
            1);
            }

            void Allocation(int flag) //內(nèi)存分配
            {
                
            int i,j,k,kflag=1// 進(jìn)程個數(shù)
                Proc s=H;
                s
            =s->next=(Proc)malloc(sizeof(PNode));
                cout
            <<"請輸入進(jìn)程名和內(nèi)存大小: ";
                cin
            >>s->name>>s->size;
                
            if (flag==1)
                {
                    
            if (s->size > FREE)
                    {
                        cout
            <<"空間不足,分配失敗!";
                        
            return;
                    }
                    FREE
            -=s->size;
                }
                
            else {
                    
            if (s->size > FREE_DEF) {
                        cout
            <<"空間不足,分配失敗!";
                        
            return;
                    }
                    FREE_DEF
            -=s->size;
                }
                
                s
            ->PT=new int[s->size]; // 新建PT表
                k=0;
                
            if (flag==1// 用戶自定義位示圖
                {
                    
            for (i=0; i<8 && kflag; i++)
                        
            for (j=0; j<8 && kflag; j++)
                        {
                            
            if (!BG[i][j])
                            {
                                BG[i][j]
            =1;
                                FREE
            --;
                                s
            ->PT[k++]=8*i+j;
                                
            if (k==s->size)
                                {
                                    cout
            <<"分配完成!\n";
                                    kflag
            =0;
                                }
                            }
                        }
                }
                
            else // 實驗指導(dǎo)書位示圖
                {
                    
            for (i=0; i<8 && kflag; i++)
                        
            for (j=0; j<8 && kflag; j++)
                        {
                            
            if (!BG_DEF[i][j])
                            {
                                BG_DEF[i][j]
            =1;
                                FREE_DEF
            --;
                                s
            ->PT[k++]=8*i+j;
                                
            if (k==s->size)
                                {
                                    cout
            <<"分配完成!\n";
                                    kflag
            =0;
                                }
                            }
                        }
                }
                s
            ->next=NULL;
            }

            void CallBack(int flag) //內(nèi)存回收
            {
                
            char name[12];
                cout
            <<"請輸入需要回收的進(jìn)程名: ";
                cin
            >>name;
                Proc p
            =H->next,q=H;
                
            while (p)
                {
                    
            if (strcmp(name,p->name)==0// 刪除進(jìn)程,回收內(nèi)存
                    {
                        
            for(int i=0; i<p->size; i++// 修改該進(jìn)程位示圖
                        {
                            
            int m=p->PT[i]/8;
                            
            int n=p->PT[i]%8;
                            
            if (flag==1)
                            {
                                BG[m][n]
            =0;
                                FREE
            ++;
                            }
                            
            else {
                                BG_DEF[m][n]
            =0;
                                FREE_DEF
            ++;
                            }
                        }
                        
                        q
            ->next=p->next; // 刪除進(jìn)程結(jié)點
                        free(q);
                        cout
            <<"回收成功!\n";
                        
            return;
                    }
                    p
            =p->next;
                    q
            =q->next;
                }
                cout
            <<"無此進(jìn)程,回收內(nèi)存失敗!\n";
            }

            void DispPT()
            {
                
            char name[12];
                cout
            <<"請輸入要打印頁表的進(jìn)程名: ";
                cin
            >>name;
                Proc p
            =H->next;
                
            while (p)
                {
                    
            if (strcmp(name,p->name) == 0)
                    {
                        cout
            <<"  塊號\n"
                            
            <<"--------\n";
                        
            for (int i=0; i<p->size; i++)
                            cout
            <<"    "<<p->PT[i]<<endl;
                        cout
            <<"--------\n";
                        
            return;
                    }
                    p
            =p->next;
                }
                cout
            <<"該進(jìn)程不存在!\n";
            }

            void Welcome()
            {
                cout
            <<"----------位示圖法---------\n"
                    
            <<"       1. 新進(jìn)程內(nèi)存分配\n"
                    
            <<"       2. 舊進(jìn)程內(nèi)存回收\n"
                    
            <<"       3. 打印進(jìn)程頁表\n"
                    
            <<"       4. 打印位示圖\n"
                    
            <<"       5. 退出系統(tǒng)\n"
                    
            <<"-----------------------------------\n";
            }

            void main()
            {
                H
            ->next=NULL;
                
            int flag;
                cout
            <<"內(nèi)存初始化方式: 1.自定義 2.指導(dǎo)書\n"
                    
            <<"請選擇: ";
                cin
            >>flag;
                
            if (flag==1) Initial(); // 用戶選取坐標(biāo)初始化內(nèi)存塊
                int choice;
                
            while (1)
                {
                    Welcome();
                    cin
            >>choice;
                    
            switch (choice)
                    {
                    
            case 1: Allocation(flag); break// 進(jìn)行一次分配內(nèi)存工作
                    case 2: CallBack(flag); break// 回收用戶指定進(jìn)程的內(nèi)存
                    case 3: DispPT(); break// 打印用戶指定進(jìn)程的頁表
                    case 4: DispBG(flag); break// 打印用戶指定位示圖
                    case 5: cout<<"\n退出成功!\n"; system("pause"); exit(1);
                    }
                }
            }
            婷婷伊人久久大香线蕉AV| 久久只有这里有精品4| 久久国产精品免费一区二区三区| 久久99精品国产麻豆蜜芽| 国产精品久久精品| 亚洲国产精品无码久久98| 亚洲精品综合久久| 国产精品VIDEOSSEX久久发布| 久久久久亚洲精品天堂| 久久偷看各类wc女厕嘘嘘| 亚洲AV无码一区东京热久久| 中文精品久久久久国产网址| 韩国无遮挡三级久久| 丰满少妇高潮惨叫久久久| 国产韩国精品一区二区三区久久| 18岁日韩内射颜射午夜久久成人| 97久久国产亚洲精品超碰热| 性做久久久久久久久老女人| 国产精品一区二区久久| 久久99热这里只有精品国产| 精品乱码久久久久久夜夜嗨| 色欲综合久久躁天天躁蜜桃| 色婷婷久久久SWAG精品| 久久er国产精品免费观看8| 久久久久高潮毛片免费全部播放| 免费无码国产欧美久久18| 欧美激情精品久久久久久久九九九 | 无码超乳爆乳中文字幕久久| 天堂无码久久综合东京热| 国产精品成人99久久久久 | 久久91精品国产91久久麻豆| 中文成人无码精品久久久不卡| 国产成人久久久精品二区三区| 国内精品久久久人妻中文字幕| 色偷偷偷久久伊人大杳蕉| 免费精品久久天干天干| 中文字幕日本人妻久久久免费| 久久久久久精品免费看SSS| 国产69精品久久久久APP下载 | 色成年激情久久综合| 日本道色综合久久影院|