#include "BitMap.h"
static QWORD qword_lowest_bit(QWORD oneData);
static BitMap* bitmap_init(BitMap* bitMap, QWORD amount);
//寻找64位中第一个为1的位
static QWORD qword_lowest_bit(QWORD oneData) // 0 ~ 63
{
QWORD n = 63; //0x
if (oneData & 0x00000000ffffffff) {
n -= 32;
oneData &= 0x00000000ffffffff;
}
if (oneData & 0x0000ffff0000ffff) {
n -= 16;
oneData &= 0x0000ffff0000ffff;
}
if (oneData & 0x00ff00ff00ff00ff) {
n -= 8;
oneData &= 0x00ff00ff00ff00ff;
}
if (oneData & 0x0f0f0f0f0f0f0f0f) {
n -= 4;
oneData &= 0x0f0f0f0f0f0f0f0f;
}
if (oneData & 0x3333333333333333) {
n -= 2;
oneData &= 0x3333333333333333;
}
if (oneData & 0x5555555555555555) {
n -= 1;
}
return n;
}
//初始化
static BitMap* bitmap_init(BitMap* bitMap, QWORD amount)
{
bitMap->qsize = (amount >> 6) + ((amount & 0x3f) ? 1 : 0);
bitMap->data = (QWORD*)malloc(bitMap->qsize << 3);
if (!bitMap->data)
return NULL;
bitMap->size = amount;
return bitMap;
}
//所有位置变为0
void BitMapClear(BitMap* bitMap)
{
memset(bitMap->data, 0, bitMap->qsize << 3);
}
//所有位置变为1
void BitMapSetAll(BitMap* bitMap)
{
memset(bitMap->data, 0xff, bitMap->qsize << 3);
}
//撤销
void BitMapDestroy(BitMap** bitMap)
{
free((*bitMap)->data);
(*bitMap)->data = NULL;
(*bitMap)->size = 0;
free(*bitMap);
*bitMap = NULL;
}
//根据一个数值,设置相应的位数为1
BitMap* CreateBitMap(QWORD amount)
{
BitMap* bmap = (BitMap*)malloc(sizeof(BitMap));
if (!bmap || !bitmap_init(bmap, amount))
return NULL;
BitMapClear(bmap);
return bmap;
}
//判断某个位是否使用,在程序中作用是判断pid是否唯一
bool BitMapIsSet(BitMap* bitMap, QWORD pos)
{
QWORD q = ((QWORD)1) << (pos & 0x3f);
return (bitMap->data[pos >> 6] & q) ? true : false;
}
//将这一位设为1
void BitMapSet(BitMap* bitMap, QWORD pos)
{
QWORD q = ((QWORD)1) << (pos & 0x3f);
bitMap->data[pos >> 6] |= q;
}
//复位
void BitMapReset(BitMap* bitMap, QWORD pos)
{
QWORD q = ((QWORD)1) << (pos & 0x3f);
bitMap->data[pos >> 6] &= ~q;
}
//寻找第一个可以使用的位(第一个可以使用的pid/第一个为0的位)
QWORD BitMapFindFirst(BitMap* bitMap, bool* isOk)
{
QWORD i = 0, res = 0;
for (; i < bitMap->qsize; ++i)
if (bitMap->data[i] ^ 0xffffffffffffffff)
break;
if (i == bitMap->qsize) {
if (isOk)
*isOk = false;
return i;
}
res = (i << 6) + qword_lowest_bit(~bitMap->data[i]);
if (isOk) {
if (res < bitMap->size)
*isOk = true;
else
*isOk = false;
}
return res;
}
没有合适的资源?快使用搜索试试~ 我知道了~
进程管理系统设计 允许n个进程并发运行的进程管理模拟系统 进程创建、撤销、阻塞、唤醒 同步控制 操作系统课程设计 c++课设
共34个文件
obj:6个
tlog:6个
cpp:5个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 135 浏览量
2023-04-30
16:41:32
上传
评论 1
收藏 8.66MB RAR 举报
温馨提示
Visual Studio 要求设计一个允许n个进程并发运行的进程管理模拟系统。该系统包括有进程创建、撤销、阻塞、唤醒;进程的同步控制。进程调度算法可以选择优先级调度,时间片轮转,短进程优先等。每个进程用一个PCB表示,其内容根据具体情况设置,系统在运行过程中应能显示或打印各进程的状态及有关参数的变化情况,以便观察进程的运行过程及系统的管理过程。每个进程控制块(类)有进程id、进程状态、进程预估时间、进程到达时间、进程完成时间、进程运行时间、进程剩余时间等变量,用于数据计算。每秒进行一次计算,附带清屏、重新显示三种状态的进程和运行状态进程的剩余时间,以及CPU和系统资源的使用情况,清晰直观展示进程P、V操作。系统中有可自由设定的CPU和资源数量,以判断进程应该处于哪个状态。运行、等待状态进程使用list容器,就绪状态进程使用multimap容器,容器内值为一个包括PCB和判断进程是否占用资源的bool值的pair对组。使用短进程优先调度方法。使用64位的BitMap标志进程,确保每个进程的pid唯一,节省内存。
资源推荐
资源详情
资源评论
收起资源包目录
进程.rar (34个子文件)
进程
进程.sln 1KB
.vs
进程
v14
.suo 57KB
进程.vcxproj.filters 2KB
进程.vcxproj 6KB
进程.sdf 37.44MB
Debug
Show.cpp 3KB
BitMap.obj 11KB
PCB.obj 47KB
process.obj 1.76MB
进程.log 574B
进程.ilk 1.66MB
process.h 547B
BitMap.c 3KB
Schedule.obj 532KB
BitMap.h 943B
进程.tlog
CL.write.1.tlog 4KB
进程.lastbuildstate 196B
CL.command.1.tlog 10KB
link.command.1.tlog 3KB
link.read.1.tlog 3KB
link.write.1.tlog 532B
CL.read.1.tlog 156KB
Schedule.cpp 4KB
Schedule.h 2KB
process.cpp 4KB
Show.h 408B
PCB.h 2KB
vc140.idb 1.28MB
进程.pdb 2.79MB
源.obj 55KB
源.cpp 111B
vc140.pdb 900KB
Show.obj 293KB
PCB.cpp 1KB
共 34 条
- 1
资源评论
- kef1312023-12-07资源内容详细,总结地很全面,与描述的内容一致,对我启发很大,学习了。
HinomotoOniko
- 粉丝: 1831
- 资源: 139
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功