模拟基本分页存储

介绍

data.h

#ifndef _Data_h_
#define _Data_h_#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>#define LIST_INIT_SIZE 10
#define LISTINCREMENT  2
#define true				1
#define false				0
#define PCBType				PCB
#define Status				int
#define OK					1
#define	ERROR				0
#define NAME_MAXSIZE		20
#define PCB_Num				5
#define LIST_INITSIZE		10
#define PartiType			PartitionInfo
#define BlockNumType		PageData //分页信息
#define TotalMemory			512	//KB
#define PageSize			16	//通常为1 ~ 8KB    //进程申请内存的大小[16, 256]KB    256 / 8 = 32页typedef enum 
{Unallocated, Allocated
}DistributState, PartitionSt;typedef struct {//分区号用数组下标代替int PartStartAddr;char Name[NAME_MAXSIZE];//若为空,则分区空闲
}PartitionInfo;typedef struct
{PartitionInfo *elem;int listsize;		//表容量int length;			//元素个数
}SqList_f, PartTable;	//分区使用说明表typedef struct {					    int BlockNum;               //块号DistributState DistbutSt;	//分配状态
}PageData;typedef struct
{PageData *elem;	int listsize;		int length;			
}SqList_y, PageTable;	//页表typedef struct 
{char Name[NAME_MAXSIZE];	//进程名int	MemorySize;				//内存的大小PageTable *pPagetable;		//页表指针
}PCB;typedef struct Node
{PCBType data;struct Node * Next;		
}LNode, *LinkList, *PCBList;#endif 

list.h

#ifndef _List_h_
#define _List_h_#include "Data.h"//*******           链表            *******//
Status InitLinkList(LinkList *L);
void PCBAssign(PCBType *e1, PCBType e2);
Status GetElemt_L(LinkList L,int i,PCBType *e);
Status ListInsert_L(LinkList L,PCBType e);
Status ListDelete_L(LinkList L,int i,PCBType *e);//******         分区使用说明表           ******//
void PartiAssign_f(PartiType *e1, PartiType e2);
Status InitList_f(SqList_f *L);
Status ListInsert_f(SqList_f *L,int i,PartiType e);
Status ListDelete_f(SqList_f *L,int i,PartiType *e);//******         页表           ******//
void PartiAssign_y(BlockNumType *e1, BlockNumType e2);
Status InitList_y(SqList_y **L);
Status ListInsert_y(SqList_y *L,int i,BlockNumType e);
Status ListDelete_y(SqList_y *L,int i,BlockNumType *e);#endif

memorymanage.h

#ifndef _MemoryManage_h_
#define _MemoryManage_h_#include "List.h"//*****         PCB 链 表 操 作        *****//
Status InsertProcess(LinkList Q,PCBType e);
Status DeleteProsess(LinkList Q,int i,PCBType *e);
//*****         分 区 表 操 作         *****//
//插入分区表元素
Status InsertTable_f(SqList_f *L, int i, PartiType e);	
//删除分区表元素
Status DeleteTable_f(SqList_f *L, int i, PartiType *e);//******          页 表 操 作         ******//
//插入页表元素
Status InsertTable_y(SqList_y *L, int i, BlockNumType e);
//删除页表元素
Status DeleteTable_y(SqList_y *L, int i, BlockNumType *e);
Status LoadPages(PageTable *L, int size);Status MallocMemory(PCB *pe, SqList_f *pPartTable, int *arr);
Status SelectPart(PCB* pPCB, SqList_f *pPartTable,int *arr);
void SearchSpace(PCBList PCBdata, SqList_f *partTable);
void FreeMemory(int *arr, int len, SqList_f *pPartTable);
void InitAllocation(PCBList PCBdata, PartTable *partTable);
void PrintProQueue(LinkList L);
void PrintPartTable(PartTable L);#endif

实现

#include "List.h"//*******           链表            *******//
Status InitLinkList(LinkList *L)
{*L = (LinkList)malloc(sizeof(LNode));strcpy((*L)->data.Name, "");(*L)->Next = NULL;return OK;
}void PCBAssign(PCBType *e1, PCBType e2)
{strcpy(e1->Name,e2.Name);e1->MemorySize = e2.MemorySize;e1->pPagetable = e2.pPagetable;
}Status GetElemt_L(LinkList L,int i,PCBType *e)
{LinkList p = L->Next;	//指向第j个结点int j = 1;				//从第一个开始往后找while ( p && j < i )	//p不为空且j < i{p = p->Next;++j;}						//p为空,说明链表循环结束,也没有到第i个结点   j==iif (!p || j > i)		//因为此处对i   没有做判断   如果 i==0  或 负数  条件成立//对于 i == j == 1 的情况则不用循环正好  返回{return ERROR;}*e = p->data;			//通过寻址改变了 该地址内存中元素的值return OK;
}
//链表中按照优先级:从大到小排序插入
Status ListInsert_L(LinkList L,PCBType e)	//这样修改应该不对 p = *L出错
{LinkList p = L, s;while (p->Next)	p = p->Next;s = (LinkList)malloc(sizeof(LNode));PCBAssign(&s->data, e);s->Next = p->Next;p->Next = s;return OK;
}Status ListDelete_L(LinkList L,int i,PCBType *e)
{LinkList p = L, q;int j = 0;while (p->Next && j < i-1){p = p->Next; ++j;}if(!p->Next || j > i - 1)return ERROR;q = p->Next;p->Next = q->Next;PCBAssign(e, q->data);free(q);return OK;
}//******         分区使用说明表           ******//
void PartiAssign_f(PartiType *e1, PartiType e2)
{e1->PartStartAddr = e2.PartStartAddr;strcpy(e1->Name, e2.Name);
}Status InitList_f(SqList_f *L)
{//构造一个空的线性表LL->elem = (PartiType *)malloc((LIST_INIT_SIZE)*sizeof(PartiType));if(!L->elem) return ERROR;        //存储分配失败L->length = 0;                 //空表长度为0L->listsize = LIST_INIT_SIZE;  //初始存储的容量return OK;
}//在顺序线性表L中第i个位置之前插入新的元素e
Status ListInsert_f(SqList_f *L,int i,PartiType e)
{//在顺序线性表L中第i个位置之前插入新的元素e//i的合法值为1 <= i <= ListLength_Sq(L)+1PartiType *q, *p, *newbase;if(i < 1 || i > L->length + 1 ) return ERROR;     //i值不合法if(L->length >= L->listsize){               //当前存储空间已满,增加分配newbase = (PartiType *)realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(PartiType));if(!newbase) return ERROR;				//存储分配失败L->elem = newbase;						//新基址L->listsize += LISTINCREMENT;			//增加存储容量} q = &(L->elem[i - 1]);			         	//q为插入位置for(p = &(L->elem[L->length-1]);p >= q; --p)PartiAssign_f((p+1),*p); 					//插入位置及之后的元素右移PartiAssign_f(q ,e);							//插入eL->length++;return OK;
}//在顺序线性表L中删除第i个元素,并用e返回其值
Status ListDelete_f(SqList_f *L,int i,PartiType *e)
{//在顺序线性表L中删除第i个元素,并用e返回其值//i的合法值为1 <= i <= ListLength_Sq(L)PartiType *p,*q;if((i < 1) || (i > L->length))	return ERROR;							 //i值不合法p = &(L->elem[i-1]);						 //p为被删除元素的位置PartiAssign_f(e, *p);							 //将被删除元素的值赋给e (待定)q = L->elem + L->length-1;					 //移动到表尾元素的位置for (++p;p<=q;++p)PartiAssign_f((p-1), *p);					 //被删除元素之后的元素左移L->length--;return OK;
}//******         页表           ******//void PartiAssign_y(BlockNumType *e1, BlockNumType e2)
{(*e1).BlockNum = e2.BlockNum;(*e1).DistbutSt = e2.DistbutSt;
}Status InitList_y(SqList_y **L)
{//构造一个空的线性表L(*L) = (PageTable *)malloc(sizeof(PageTable));//不可缺少(*L)->elem = (BlockNumType *)malloc((LIST_INIT_SIZE)*sizeof(BlockNumType));if(!(*L)->elem) return ERROR;        //存储分配失败(*L)->length = 0;                 //空表长度为0(*L)->listsize = LIST_INIT_SIZE;  //初始存储的容量return OK;
}//在顺序线性表L中第i个位置之前插入新的元素e
Status ListInsert_y(SqList_y *L,int i,BlockNumType e)
{//在顺序线性表L中第i个位置之前插入新的元素e//i的合法值为1 <= i <= ListLength_Sq(L)+1BlockNumType *q, *p, *newbase;if(i < 1 || i > L->length + 1 ) return ERROR;     //i值不合法if(L->length >= L->listsize){               //当前存储空间已满,增加分配newbase = (BlockNumType *)realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(BlockNumType));if(!newbase) return ERROR;				//存储分配失败L->elem = newbase;						//新基址L->listsize += LISTINCREMENT;			//增加存储容量} q = &(L->elem[i - 1]);			         	//q为插入位置for(p = &(L->elem[L->length-1]);p >= q; --p)PartiAssign_y((p+1),*p); 					//插入位置及之后的元素右移PartiAssign_y(q ,e);							//插入eL->length++;return OK;
}//在顺序线性表L中删除第i个元素,并用e返回其值
Status ListDelete_y(SqList_y *L,int i,BlockNumType *e)
{//在顺序线性表L中删除第i个元素,并用e返回其值//i的合法值为1 <= i <= ListLength_Sq(L)BlockNumType *p,*q;if((i < 1) || (i > L->length))	return ERROR;							 //i值不合法p = &(L->elem[i-1]);						 //p为被删除元素的位置PartiAssign_y(e, *p);							 //将被删除元素的值赋给e (待定)q = L->elem + L->length-1;					 //移动到表尾元素的位置for (++p;p<=q;++p)PartiAssign_y((p-1), *p);				 //被删除元素之后的元素左移L->length--;return OK;
}

memorymanage.c


#include "MemoryManage.h"//*****         PCB链表操作        *****//
Status InsertProcess(LinkList Q,PCBType e)
{return ListInsert_L(Q, e);
}Status DeleteProsess(LinkList Q,int i,PCBType *e)
{return ListDelete_L(Q ,i,e);
}//*****         分区表操作        *****//
Status InsertTable_f(SqList_f *L, int i, PartiType e) 
{return ListInsert_f(L,i, e);
}Status DeleteTable_f(SqList_f *L, int i, PartiType *e)
{return ListDelete_f(L, i, e);
}//*****         页表操作        *****//
Status InsertTable_y(SqList_y *L, int i, BlockNumType e)
{return ListInsert_y(L,i, e);
}Status DeleteTable_y(SqList_y *L, int i, BlockNumType *e)
{return ListDelete_y(L, i, e);
}Status LoadPages(PageTable *L, int size)
{int i, pageNum = ceil( size * 1.0 / PageSize) ;PageData e = {-1, Unallocated};for (i = 0; i < pageNum; i++){if(!InsertTable_y(L, L->length + 1, e))return ERROR;}return OK;;
}//若返回0,则代表错误
Status SelectPart(PCB* pPCB, SqList_f *pPartTable,int *arr)
{/     以下补充     /int i = 0, j = 0;while(i < pPCB->pPagetable->length && j < pPartTable->length){if(pPCB->pPagetable->elem[i].DistbutSt == Unallocated){if(!strcmp(pPartTable->elem[j].Name, "")){arr[i] = j;++i;++j;} else {++j;}} else {++i;}}if(i == pPCB->pPagetable->length){return OK;}return ERROR;
}Status MallocMemory(PCB *pe, SqList_f *pPartTable, int *arr)
{int i, pageNum ;以下补充     /for(i = 0; i < pe->pPagetable->length; ++i){if(pe->pPagetable->elem[i].DistbutSt == Unallocated){pe->pPagetable->elem[i].BlockNum = arr[i];pe->pPagetable->elem[i].DistbutSt = Allocated;strcpy(pPartTable->elem[arr[i]].Name, pe->Name);}}return ERROR;
}void InitAllocation(PCBList PCBdata, PartTable *pPartTable)
{LNode *p;int pos, arr[20] = {0};p = PCBdata->Next;while (p){if(p->data.pPagetable->elem[0].DistbutSt == Unallocated){if(SelectPart(&(p->data), pPartTable, arr)){MallocMemory(&(p->data), pPartTable, arr);}}p = p->Next;}
}//该释放进程只在结束进程时用到,因此不用管进程信息
void FreeMemory(int *arr, int len, SqList_f *pPartTable)
{int i;以下补充   /for(i = 0; i < len; ++i){strcpy(pPartTable->elem[arr[i]].Name, "");}
}void SearchSpace(PCBList PCBdata, SqList_f *partTable)
{int pos, arr[20] = {0};LNode *p;p = PCBdata->Next;while (p){if(p->data.pPagetable->elem[0].DistbutSt == Unallocated){if(SelectPart(&(p->data), partTable, arr)){MallocMemory(&(p->data), partTable, arr);}}p = p->Next;}}void PrintProQueue(LinkList L)
{int i = 0;L = L->Next;while(L){printf(" -----------------------------\n");printf("|进程名 | 申请大小 |\n");printf("|  %s   |  %4d    |\n", L->data.Name, L->data.MemorySize);printf("%s页表信息如下:\n|   页号   |   块号   | 是否分配 |\n", L->data.Name);for (i = 0; i < L->data.pPagetable->length; i++)printf("|  %4d    |  %4d    |  %4s    |\n", i , L->data.pPagetable->elem[i].BlockNum,L->data.pPagetable->elem[i].DistbutSt == Allocated?  "是" : "否");L = L->Next;}printf(" ----------------------------------------\n");
}void PrintPartTable(PartTable L)
{int i = 0, j = 0;printf(" ----------------------------------------\n");printf("|分区号 | 起始位置 | 分区大小 | 是否分配 |\n");for (i = 0; i < L.length; ++i)printf("|  %2d   |  %4d    |  %4d    |  %4s    |\n",i , L.elem[i].PartStartAddr, PageSize , strcmp(L.elem[i].Name, "") ? L.elem[i].Name :"否");printf(" ----------------------------------------\n");
}

main

#include "MemoryManage.h"/*   实验08  基本分页   */void InputPCBData(PCBList * pPCBdata)
{PCBType e = {{0}, 0, NULL};strcpy(e.Name,"P1");e.MemorySize = 16;InitList_y(&(e.pPagetable));LoadPages(e.pPagetable, e.MemorySize);InsertProcess(*pPCBdata,e);strcpy(e.Name,"P2");e.MemorySize = 32;InitList_y(&(e.pPagetable));LoadPages(e.pPagetable, e.MemorySize);InsertProcess(*pPCBdata,e);strcpy(e.Name,"P3");e.MemorySize = 48;InitList_y(&(e.pPagetable));LoadPages(e.pPagetable, e.MemorySize);InsertProcess(*pPCBdata,e);strcpy(e.Name,"P4");e.MemorySize = 96;InitList_y(&(e.pPagetable));LoadPages(e.pPagetable, e.MemorySize);InsertProcess(*pPCBdata,e);strcpy(e.Name,"P5");e.MemorySize = 100;InitList_y(&(e.pPagetable));LoadPages(e.pPagetable, e.MemorySize);InsertProcess(*pPCBdata,e);
}void SettingPage(PartTable * pPartdata)
{PartiType se = {0, {0}};int Num = (512 - 16) / PageSize , i;for (i = 0; i < Num; ++i){se.PartStartAddr = 16 + i * PageSize;InsertTable_f(pPartdata, i + 1, se);}
}
//0 - 15Kb 操作系统占用  总大小512KB
int main(void)
{PCBList PCBdata;		//PCBdata里面存放原始PCB数据PartTable partTable;	//分区表char PcbName[NAME_MAXSIZE] = {0}, choice;PCBType PCBe = {{0}, 0, NULL};PartiType Parte = {0, 0};PCBType *pcb = NULL;LNode *p; int i, size, pos, arr[20] = {0}, k = 0;InitList_f(&partTable);SettingPage(&partTable);InitLinkList(&PCBdata);InputPCBData(&PCBdata);InitAllocation(PCBdata, &partTable);PrintProQueue(PCBdata);PrintPartTable(partTable);while(true){system("cls");PrintProQueue(PCBdata);PrintPartTable(partTable);printf(" ================================================\n");printf("|           1.结 束 进 程                        |\n");printf("|           2.添 加 进 程                        |\n");printf("|           3.退 出 系 统                        |\n");printf(" ================================================\n");printf("请选择:");fflush(stdin);scanf("%c",&choice);switch (choice){case '1':printf("要结束的进程名:");scanf("%s",PcbName);for (p = PCBdata->Next, i = 1; p && strcmp(PcbName, p->data.Name); i++, p = p->Next);if(!p){printf("进程名输入错误!\n");break;}DeleteProsess(PCBdata, i, &PCBe);k = 0;for(i = 0; i < partTable.length; i++){if(!strcmp(PcbName, partTable.elem[i].Name)){arr[k++] = i;}}FreeMemory(arr, k, &partTable);SearchSpace(PCBdata, &partTable);break;case '2':printf("请输入添加的进程名,进程所占内存大小:");scanf("%s%d",PcbName , &size);strcpy(PCBe.Name, PcbName);PCBe.MemorySize = size;InitList_y(&(PCBe.pPagetable));LoadPages(PCBe.pPagetable, PCBe.MemorySize);if(SelectPart(&(PCBe), &partTable, arr))MallocMemory(&(PCBe), &partTable, arr);InsertProcess(PCBdata, PCBe);break;case '3':return 0;default:printf("选择项输入错误,重新选择!\n");break;}PrintProQueue(PCBdata);PrintPartTable(partTable);system("pause");}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用正则表达式和shell命令列表

取当前目录下普通文件的后缀名列表&#xff1a; ls -l | awk /^-/{print $NF} |awk -F. {print $NF}|awk !/^$/ 匹配0和正整数的正则表达式&#xff08;除0以外&#xff0c;其它数字不能以0开头&#xff09;&#xff1a; (^0$)|(^[0-9]\d*$) 匹配中文字符的正则表达式&#xff…

无限踩坑系列(7)-Latex使用Tips

Latex常用命令1.latex注释2.图片左边对齐3.字母头上加声调4.脚注5.公式中加空格6.字体加粗体7.公式换行8.\textsuperscript{*}9.\begin{itemize}10.\operatorname{trace}11.\noindent12.\textcircled{}圆圈数字一些TIPs1.latex注释 单行使用百分号%注释 多行使用如下命令,在编…

在CentOS6.2下安装DNS服务软件Bind并快速配置简单实例

[实践Ok]在CentOS6.2下安装DNS并快速配置实例&#xff0c;共八步&#xff0c;心路历程如下&#xff1a;背景介绍&#xff1a;在日常的开发中&#xff0c;往往会在测试机和外网的Http的Url实际接口是不一样的&#xff0c;在测试机一个Url地址&#xff0c;在外网中又是一个地址。…

模拟动态分区分配

介绍 list.h #ifndef _List_h_ #define _List_h_#include "Data.h"//******* 链表 *******// Status InitLinkList(LinkList *L); void PCBAssign(PCBType *e1, PCBType e2); Status GetElemt_L(LinkList L,int i,PCBType *e); Status ListIn…

python模块(4)-Collections

collections1.collection.counter(list)2.collections.defaultdict()3.collection.dequecollections是Python内建的一个集合模块&#xff0c;提供了许多有用的集合类。collections在python官方文档中的解释是High-performance container datatypes1.collection.counter(list) …

js知识点汇总

1.本门课的作用&#xff08;JavaScript的作用&#xff09;所有基于Web的程序开发基础 2.一种计算机客户端脚本语言&#xff0c;主要在Web浏览器解释执行。 3.浏览器中Javascript&#xff0c;用于与用户交互&#xff0c;以及实现页面中各种动态特效 4.在HTML文件中&#xff0…

redis——内存概述

Redis通过自己的方法管理内存,&#xff0c;主要方法有zmalloc(),zrealloc()&#xff0c; zcalloc()和zfree(), 分别对应C中的malloc(), realloc()、 calloc()和free()。相关代码在zmalloc.h和zmalloc.c中。 Redis自己管理内存的好处主要有两个&#xff1a;可以利用内存池等手段…

Windows下如何用C语言清空特定文件夹中的所有文件

#include "iostream.h" //由于该博客系统发布是不能显示正常&#xff0c;代码如需调试&#xff0c;只需将改成""即可 #include "string.h" #include "stdlib.h" #include "time.h" #include "math.h" #include…

MachineLearning(5)-去量纲:归一化、标准化

去量纲&#xff1a;归一化、标准化1.归一化(Normalization)1.1 Min-Max Normalization1.2 非线性Normalization2.标准化(Standardlization)2.1 Z-score Normalization3.标准化在梯度下降算法中的重要性本博文为葫芦书《百面机器学习》阅读笔记。去量纲化 可以消除特征之间量纲的…

GDB调试技术(一)

启动GDB的方法有以下几种: 1、gdb <program> program也就是你的执行文件,一般在当然目录下。 2、gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。 3、

GDB调试技术(二)

1) 恢复程序运行和单步调试 当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。 continue [ignore-count] c [ignore-count] fg [ignore-count] 恢复程序运行,直到程序结束,或是下一个断点到…

关于Java中String的问题

String 对象的两种创建方式&#xff1a; String str1 "abcd";//先检查字符串常量池中有没有"abcd"&#xff0c;如果字符串常量池中没有&#xff0c;则创建一个&#xff0c;然后 str1 指向字符串常量池中的对象&#xff0c;如果有&#xff0c;则直接将 st…

学点数学(3)-函数空间

函数空间1.距离&#xff1a;从具体到抽象2.范数3.内积4.拓扑本博文为观看《上海交通大学公开课-数学之旅-函数空间 》所整理笔记&#xff0c;公开课视频连接&#xff1a;http://open.163.com/newview/movie/free?pidM8PTB0GHI&midM8PTBUHT0数学中的空间 是 大家研究工作的…

Makefile编写详解--项目开发

预备知识&#xff1a; gcc 的3个参数&#xff1a; 1. -o 指定目标文件 gcc sources/main.c -o bin/main 2. -c 编译的时候只生产目标文件不链接 gcc -c sources/main.c -o obj/main.o 3. -I 主要指定头文件的搜索路径 gcc -I headers -c main.c -o main.o 4. -l 指定静…

如何判断对象已经死亡

引用计数 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它&#xff0c;计数器就加 1&#xff1b;当引用失效&#xff0c;计数器就减 1&#xff1b;任何时候计数器为 0 的对象就是不可能再被使用的。 这个方法实现简单&#xff0c;效率高&#xff0c;但是目前主流…

XML常见的操作

1. 创建XML文档 &#xff08;1&#xff09;创建一个XML文档非常简单&#xff0c;其流程如下&#xff1a; ① 用xmlNewDoc函数创建一个文档指针doc。 ② 用xmlNewNode函数创建一个节点指针root_node。 ③ 用xmlDocSetRootElement将root_node设置为doc的根结点。…

算法(2)-二叉树的遍历(递归/迭代)python实现

二叉树的遍历1.深度优先DFS1.1 DFS 递归解法1.1.1先序遍历1.1.2中序遍历1.1.3后序遍历1.2 DFS迭代解法1.2.1先序遍历1.2.2中序遍历1.2.3后序遍历2.广度优先BFS3.二叉树的最大深度3.1递归3.2迭代4.翻转二叉树4.1递归4.1迭代5.合并两棵二叉树5.1递归5.2迭代有两种通用的遍历树的策…

libxml的安装和相关数据结构详解

1安装 一般如果在安装系统的时候选中了libxml开发库的话&#xff0c;系统会默认安装。如果没有安装&#xff0c;可以按如下步骤进行手工安装。 ① 从xmlsoft站点或ftp(ftp.xmlsoft.org)站点下载libxml压缩包 (libxml2-xxxx.tar.gz) ② 对压缩包进行解压缩 tar xvzf …

内核中的 likely() 与 unlikely()

在 2.6 内核中&#xff0c;随处可以见到 likely() 和 unlikely() 的身影&#xff0c;那么为什么要用它们&#xff1f;它们之间有什么区别&#xff1f; 首先要明确&#xff1a; if(likely(value)) 等价于 if(value) if(unlikely(value)) 也等价于 if(value) 也就是说 likely()…

python外卷(12)-sort(),sorted(),ord(),chr()

Python内置函数1.sort()&#xff0c;sorted()2.ord(), chr()1.sort()&#xff0c;sorted() sort() 是list的方法&#xff0c;对已经存在的列表进行操作&#xff0c;无返回值 a[3,2,4,1] b["c","a","b"] print (a.sort(),b.sort()) # 输出 (Non…