找第一个满足大小的空闲分区
该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按 照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中
核心代码:
for (i = 0; i < MEMSIZE - 1 && MemList[i].info != 'e'; i++)
{
//满足所需要的大小,且是空闲空间
if (MemList[i].size >= size && MemList[i].info == 'f')
{
if (MemList[i].size - size <= MINSIZE)
{
MemList[i].info = 'u';
}
else
{ //将i后的信息表元素后移
for (j = MEMSIZE - 2; j > i; j--)
{
MemList[j + 1] = MemList[j];
}
//将i分成两部分,使用低地址部分
MemList[i + 1].start = MemList[i].start + size;
MemList[i + 1].size = MemList[i].size - size;
MemList[i + 1].info = 'f';
MemList[i].size = size;
MemList[i].info = 'u';
}
break;
}
}
找最大的满足大小的空闲分区
该算法按大小递减的顺序形成空闲区链,分配时直接从空闲区链的第一个空闲区中分配(不能 满足需要则不分配)。很显然,如果第一个空闲分区不能满足,那么再没有空闲分区能满足需要。这种分配方法初看起来不太合理,但它也有很强的直观吸引力:在大空闲区中放入程序后,剩下的空闲区常常也很大,于是还能装下一个较大的新程序。最坏适应算法与最佳适应算法的排序正好相反,它的队列指针总是指向最大的空闲区,在进行分配时,总是从最大的空闲 区开始查寻。该算法克服了最佳适应算法留下的许多小的碎片的不足,但保留大的空闲区的可能性减小了,而且空闲区回收也和最佳适应算法一样复杂。
核心代码:
j = 0;
flag = 0;
k = 0;
//保存满足要求的最大空间
for (i = 0; i < MEMSIZE - 1 && MemList[i].info != 'e'; i++)
{
if (MemList[i].size >= size && MemList[i].info == 'f')
{
flag = 1;
if (MemList[i].size > k)
{
k = MemList[i].size;
j = i;
}
}
}
for (j = MEMSIZE - 2; j > i; j--)
{
MemList[j+1]=MemList[j];
}
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
找最小的满足大小的空闲分区
该算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将 所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。孤立地看,该算法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。同时每次分配后必须重新排序,这也带来了一定的开销。
核心代码
j=0;
flag=0;
k=MEMSIZE;
for (i = 0; i < MEMSIZE-1&&MemList[i].info!='e'; i++)
{
if(MemList[i].size>=size&&MemList[i].info=='f')//符合要求
{
flag=1;
if (MemList[i].size<k)//比符合要求的最小空间小,则交换
{
k=MemList[i].size;
j=i;
}
}
}
for ( j = MEMSIZE-2; j > i; j--)
{
MemList[j+1]=MemList[j];
}
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
/*定义内存大小为100*/
#define MEMSIZE 100
/*如果小于此值 将不再分割内存*/
#define MINSIZE 2
/*内存空间分区表 结构*/
typedef struct _MemoryInfomation
{
int start; //起始地址
int size; //大小
char info; //状态 F:空闲(Free) U:占用(Used) E结束(End)*/
} MEMINFO;
//内存空间信息表
MEMINFO MemList[MEMSIZE];
/*--------------------------------
函数名:Display()
功能:显示内存状态
----------------------------------*/
void Dispaly()
{
int i,
used = 0;
/* clrscr();*/
printf("\n--------------------------------------------\n");
printf("%5s%15s%15s%15s", "No", "start", "size", "Info");
printf("\n---------------------------------------------\n");
for (int i = 0; i < MEMSIZE && MemList[i].info != 'e'; i++)
{
if (MemList[i].info == 'u')
{
used += MemList[i].size;
}
printf("%5d%15d%15d%15s\n", i, MemList[i].start, MemList[i].size, MemList[i].info == 'u' ? "USED" : "FREE");
}
printf("\n---------------------------------------------\n");
printf("Totalsize:%-10d Used:%-10d Free:%-10d\n", MEMSIZE, used, MEMSIZE - used);
printf("\n---------------------------------------------\n");
getchar();
}
/*----------------------------
函数名:InitAll()
功能:初始化所有变量
----------------------------*/
void InitAll()
{
int i;
MEMINFO temp = {
0, 0, 'e'};
//初始化空间信息表
for (int i = 0; i < MEMSIZE; i++)
{
MemList[i] = temp;
}
//初始化地址为0
MemList[0].start = 0;
//空间初始为最大的
MemList[0].size = MEMSIZE;
//状态为空闲
MemList[0].info = 'f';
}
/*-----------------------------
函数名:FirstFit_new
功能:首次适应算法分配内存
------------------------------*/
void FirstFit_new()
{
int i, j, size;
char temp[10];
printf("FirstFit_new:How many MEMORY require?");
scanf("%d", &size);
//到了空间尾且没有空间分配
for (i = 0; i < MEMSIZE - 1 && MemList[i].info != 'e'; i++)
{
//满足所需要的大小,且是空闲空间
if (MemList[i].size >= size && MemList[i].info == 'f')
{
if (MemList[i].size - size <= MINSIZE)
{
MemList[i].info = 'u';
}
else
{ //将i后的信息表元素后移
for (j = MEMSIZE - 2; j > i; j--)
{
MemList[j + 1] = MemList[j];
}
//将i分成两部分,使用低地址部分
MemList[i + 1].start = MemList[i].start + size;
MemList[i + 1].size = MemList[i].size - size;
MemList[i + 1].info = 'f';
MemList[i].size = size;
MemList[i].info = 'u';
}
break;
}
}
//没有找到符合分配的空间
if (i == MEMSIZE - 1 || MemList[i].info == 'e')
{
printf("Not Enough Memory!\n");
getchar();
}
Dispaly();
}
/*
最坏适应算法
*/
void BadFit_new()
{
int i, j, k, flag, size;
char temp[10];
printf("BadFit_new How many MEMORY require?");
scanf("%d", &size);
j = 0;
flag = 0;
k = 0;
//保存满足要求的最大空间
for (i = 0; i < MEMSIZE - 1 && MemList[i].info != 'e'; i++)
{
if (MemList[i].size >= size && MemList[i].info == 'f')
{
flag = 1;
if (MemList[i].size > k)
{
k = MemList[i].size;
j = i;
}
}
}
i = j;
if (flag == 0)
{
printf("Not Enough Memory!\n");
getchar();
j = i;
}
else if (MemList[i].size - size <= MINSIZE)
{
MemList[i].info = 'u';
}
else
{
for (j = MEMSIZE - 2; j > i; j--)
{
MemList[j+1]=MemList[j];
}
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
Dispaly();
}
/*
函数名:del()
功能:释放一块内存
*/
void del()
{
int i,number;
char temp[10];
printf("\nplease input the NUMBER you want to stop:");
scanf("%d",&number);
if (MemList[number].info=='u')
{
MemList[number].info='f';//标志为空闲
if (MemList[number+1].info=='f')//右空间空闲则合并
{
MemList[number].size+=MemList[number+1].size;
for(i=number+1;i<MEMSIZE-1&&MemList[i].info!='e';i++)
{
if(i>0)
MemList[i]=MemList[i+1];
}
}
//左空间空闲则合并
if (number>0&&MemList[number-1].info=='f')
{
MemList[number-1].size+=MemList[number].size;
for(i=number;i<MEMSIZE-1&&MemList[i].info!='e';i++)
MemList[i]=MemList[i+1];
}
}
else
{
printf("This Number is NOT exist or is Not used!\n");
getchar();
}
Dispaly();
}
/*
函数名:BestFit_new()
功能:最佳适应算法分配内存
*/
void BestFit_new()
{
int i,j,k,flag,size;
char temp[10];
printf("BestFit_new How many MEMORY require?");
scanf("%d",&size);
j=0;
flag=0;
k=MEMSIZE;
for (i = 0; i < MEMSIZE-1&&MemList[i].info!='e'; i++)
{
if(MemList[i].size>=size&&MemList[i].info=='f')//符合要求
{
flag=1;
if (MemList[i].size<k)//比符合要求的最小空间小,则交换
{
k=MemList[i].size;
j=i;
}
}
}
i=j;
if(flag==0)//没找到
{
printf("Not Enough Memory!\n");
getchar();
j=i;
}
else if (MemList[i].size-size<=MINSIZE)
{
MemList[i].info='u';
}
else
{
for ( j = MEMSIZE-2; j > i; j--)
{
MemList[j+1]=MemList[j];
}
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
Dispaly();
}
/*
函数名:main()
*/
int main(int argc, char const *argv[])
{
char ch;
InitAll();
while(1)
{
printf("============================================================\n");
printf(" 1.Get a block use the FIRSTFIT method\n");
printf(" 2.Get a block use the BESTFIT method\n");
printf(" 3.Get a block use the BADFIT method\n");
printf(" 4.Free a block\n");
printf(" 5.Display Mem info \n");
printf(" 6.Exit\n");
printf("============================================================\n");
ch=getchar();
switch(ch)
{
case '1':
FirstFit_new();
break;
case '2':
BestFit_new();
break;
case '3':
BadFit_new();
break;
case '4':
del();
break;
case '5':
Dispaly();
break;
case '6':
return 0;
}
}
return 0;
}
参考: https://blog.csdn.net/u011070169/article/details/53177987
本文是为大家整理的集成电路技术主题相关的10篇毕业论文文献,包括5篇期刊论文和5篇学位论文,为集成电路技术选题相关人员撰写毕业论文提供参考。_集成电路硕士论文如何写
先写一个表单:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ht..._接口返回文件在服务器中的地址
Index of /hardy/dists Name Last modified Size Description Parent Directory - breezy/ 17-Aug-2012 21:03 - _emc2 源码
包含在头文件#include<string>1.stoi函数 作用: 将 n 进制的字符串转化为十进制 用法 stoi(字符串,起始位置,n进制(默认10进制)),将 n 进制的字符串转化为十进制 举例: stoi(str, 0, 2); //将字符串 str 从 0 位置之后的数字的 2 进制数,转换为十进制 注意: stoi()函数如果传入的字符串s中含有不是数字的字符,则只会识别到从开头到第一个非法字符之 前,如果第一个字符就是非法._stoi函数
cmap参数_cmap参数
1 下载插件插件地址:http://jaist.dl.sourceforge.jp/amateras/56447/AmaterasUML_1.3.4.zip 2 将解压了的文件(全部文件)放于eclipse\plugins目录下3 重启Eclipse4 使用方法File -> new -> other -> 搜索class diagram -> 点击next -> 打开创建了的文件 -> 将各个类拖_eclipse类图
The dbc_min_pct 核心参考定义动态高速缓冲区所使用的最小内存百分比,下面是容许的dbc_min_pct 值: 最小: 2 最大: 90 缺省: 5在文件系统 I/O 操作过程中,数据存储在一个高速缓冲区中,它的大小可以是固定的,可以是动态分配的。当bufpages 和 nbuf 参数设为缺省值零时,高速缓冲区的大小根据对系统内存的竞争性请求,动态地增大或减_db_pct
int i = 100;long l = 2001;float f=300.2;double d=12345.119;char username[]="程佩君";char temp[200];char *buf;CString str;_variant_t v1;_bstr_t v2;一、其它数据类型转换为字符串短整型(int)itoa(i,temp,10);///将i转换为字...
练习2:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153 是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。public class Work2{ public static void main(String args[]){ int g,s,b; //#############################_1.打印100个*号,每打印10个*号换一行。2.判断所有三位数哪些为水仙花数。
文章目录1、调用CWnd成员函数2、调用API函数3、ExitProcess(0)4、exit1、调用CWnd成员函数PostMessage(WM_QUIT,0,0); 常用2、调用API函数PostQuitMessage(0); 常用::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CLOSE,0,0); 最常用::PostMessage(AfxGetMainWnd()->m_hWnd,WM_CLOSE,0,0); 最常用3、ExitProces_mfc退出程序代码
声明:以下全文参考drweb和thehackernews官方发布的分析报告链接如下:https://news.drweb.com/show/?lng=en&i=1..._基于浏览器的中间人攻击
通过 mpu6050加速度计算角度。网上看有两种公式,分别是下面这两种。两者看起来是不同的,起始互相不矛盾只是换了一个表达方式。比如下面这个三角形 tanθ=x/sqrt(y^2+z^2)cosθ=sqrt(y^2+z^2)/sqrt(x^2+y^2+z、^2) (其中sqrt(x^2+y^2+z^2)=1)所以cosθ=sqrt(y^2+z^2)yaw 角我感觉不能直接通过加速度获取,比如加速度计水平放置,你把加速度计缓慢绕着z轴旋转,yaw角在不断变化,但是加速度的各个值基本没变,ax_mpu6050陀螺仪 yaw角加速度 角度