Swiftはmark-sweepアルゴリズムと関連文章の推薦を実現する

2049 ワード

本論文では,主にSwiftを用いてオブジェクト,ヘッダ,ドメイン,スタックおよび空きチェーンテーブルの定義をシミュレートし,タグとクリアの2段階アルゴリズムを実現して理解を助け,mark-sweepアルゴリズムの構想を簡単に実現し,オブジェクト割り当てプロセスを含まない.完全なコードはmark-sweep.swift
参考記事のおすすめ
  • ゴミ回収アルゴリズム実装-タグ-クリア(完全実行可能C言語コード)
  • babys-first-garbage-collector
  • understanding-and-implementing-a-garbage-collector
  • writing-a-mark-sweep-garbage-collector
  • を強くお勧めします
    ヘッダ情報定義
    class HeaderInfo {
        var name: String 
        var size: Int
        var marked: Bool
        init(_ name: String, size: Int) {
            self.name = name
            self.size = size
            marked = false
        }
    }
    

    オブジェクト定義
    class Obj {
        var head: HeaderInfo //   
        var field: Obj? // 
        init(_ headInfo: HeaderInfo) {
            head = headInfo
        }
    }
    
    

    ≪ヒープ定義|Heap Definitions|oem_src≫:メモリ内のヒープの状態をシミュレートします.
    class Heap {
        var usedSize: Int = 0
        var maxSize: Int
        private var _objs: [Obj] = [] //      
        
        init(_ maxSize: Int) {
            self.maxSize = maxSize
        }
    
        var objs: [Obj] {
            get {return _objs}
        }
        
        func appendObj(_ obj: Obj) {
            usedSize += obj.head.size
            _objs.append(obj)
        }
    }
    
    

    アイドルチェーンテーブル定義:
    class Node {
        var next: Node?
        var data: Obj?
    }
    

    タグフェーズ:
    private func markPhase() {
        for obj in roots {
            mark(obj)
        }
    }
    //     
    private func mark(_ obj: Obj) {
        if obj.head.marked == false {
            obj.head.marked = true
            if let child = obj.field {
                mark(child)
            }
        }
    }
    

    クリアフェーズ:
    private func sweepPhase() {
        for obj in heap.objs {
            if obj.head.marked {
                obj.head.marked = false
            } else {
                //            
                obj.head.name = "FreeChunk" //          
                let freeNode =  Node()
                freeNode.data = obj
                freeNode.next = freeList
                freeList = freeNode
            }
        }
    }