// main.swift
// 成组链接法----Swift
//
// Created by wejudging on 2018/12/11.
// Copyright © 2018 wejudging. All rights reserved.
//
import Foundation
//盘块的大小
let BLOCK_SIZE:Int = 4
//盘块分组大小
let GROUP_SIZE:Int = 3
//盘块数
let BLOCKNUM:Int = 7
struct Block {
//指向栈底
var base:UnsafeMutablePointer?
//指向盘块号栈的顶部
var top:UnsafeMutablePointer?
}
var m:Block=Block.init(base: UnsafeMutablePointer.allocate(capacity: BLOCK_SIZE*8), top: UnsafeMutablePointer.allocate(capacity: BLOCK_SIZE*8))
//定义内存盘块的堆栈
var MemoryBlock:Block = Block.init(base: UnsafeMutablePointer.allocate(capacity: BLOCK_SIZE*8), top: UnsafeMutablePointer.allocate(capacity: BLOCK_SIZE*8))
//定义全局的系统盘块数组
var DiskBlock:[Block] = [Block].init(repeating: m, count: BLOCKNUM)
//盘块分组的数量,随着分配和回收而可能发生动态变化
var GroupNumber:Int = 0
//分配和回收的算法共享Copy()函数
var CopyPattern:Bool = true
//系统现有的空闲盘块数量(计数)
var SpareBlockNumber:Int = 0
//为盘块(包括内存盘块)分配空间,并进行部分初始化工作
func InitBlock(){
for i in 0 ..< BLOCKNUM {
DiskBlock[i].base = UnsafeMutablePointer.allocate(capacity: BLOCK_SIZE*8)
// print(DiskBlock[i].base!)
DiskBlock[i].top = DiskBlock[i].base!+1
//print(DiskBlock[i].top)
DiskBlock[i].base?.pointee = 0
}
MemoryBlock.base = UnsafeMutablePointer.allocate(capacity: BLOCK_SIZE*8)
MemoryBlock.top = MemoryBlock.base!+1
MemoryBlock.base?.pointee = 0
}
//初始化系统磁盘的盘块的成组链接情况,这里为了简单直观起见,先按盘块号由小到大的顺序进行连接
func InitialAllocation() {
//程序运行中可以动态从控制台进行修改(分配或者回收
GroupNumber=0
//空闲盘块的数目初始置为0
SpareBlockNumber = 0
for j in 0 ..< (BLOCKNUM % GROUP_SIZE == 0 ? BLOCKNUM/GROUP_SIZE : BLOCKNUM/GROUP_SIZE + 1){
for i in 0 ..< GROUP_SIZE{
if(j==0)
{ MemoryBlock.top!.pointee = i
MemoryBlock.top! += 1
MemoryBlock.base!.pointee += 1
//空闲盘块的数目加一
SpareBlockNumber += 1
}
else
{
if j != (BLOCKNUM % GROUP_SIZE == 0 ? BLOCKNUM/GROUP_SIZE : BLOCKNUM/GROUP_SIZE + 1)-1
{
DiskBlock[(j-1)*GROUP_SIZE].top!.pointee = j*GROUP_SIZE+i
DiskBlock[(j-1)*GROUP_SIZE].top! += 1
DiskBlock[(j-1)*GROUP_SIZE].base!.pointee += 1
//空闲盘块的数目加一
SpareBlockNumber += 1
}
else{
if BLOCKNUM % GROUP_SIZE > i{
DiskBlock[(j-1)*GROUP_SIZE].top!.pointee = j*GROUP_SIZE+i
DiskBlock[(j-1)*GROUP_SIZE].top! += 1
DiskBlock[(j-1)*GROUP_SIZE].base!.pointee += 1
//空闲盘块的数目加一
SpareBlockNumber += 1
}
}
}
}
GroupNumber += 1
}
}
func Show() {
var FirstBlockID = 0 , GroupID = 0 , IsFirstGroup:Bool = true
for _ in 0..
Swift4实现成组链接法
最新推荐文章于 2022-09-30 18:34:03 发布