0

次の構造体を使用して、/proc//maps からの情報を格納します。

typedef struct
{
    unsigned long vm_start;
    unsigned long vm_end;
    unsigned long vm_flags;
    unsigned long vm_pgoff;
    dev_t vm_dev;
    unsigned long vm_ino;
    unsigned long vm_size;
    int vm_shares;
} map_t;

そしてベクトル:

typedef struct
{
    map_t *arr;
    int size;
    int reserved;
} map_vector_t;

ファイルからレコードを読み取ると、共有された同等の領域が見つかります。

int index = mem_mapping_find_shared(vector, map);
if (index != -1) {
    vector->arr[index].vm_shares++;
    continue;
}

map.vm_shares = 0;
int mem_mapping_find_shared(map_vector_t *vector, map_t map)
{
    int index = -1;

    for (int i = 0; index == -1 && i < vector->size; i++) {
        if (mem_mapping_is_shareable(vector->arr[i], map)) {
            index = i;
        }
    }

    return index;
}

しかし、それは遅すぎるコードです。ハッシュテーブルを使うべきだと思いますよね?どのハッシュ関数を使用できますか?

4

1 に答える 1

0

多分それは誰かに役立つでしょう:

unsigned long long mem_mapping_hash(const map_t *map)
{
    unsigned long long h = map->vm_pgoff;
    h = h * PRIME + map->vm_dev;
    h = h * PRIME + map->vm_ino;
    h = h * PRIME + map->vm_size;

    return h % PRIME;
}
于 2014-05-10T16:14:54.903 に答える