os.Getpagesize în Go

Returnează dimensiunea unei pagini de memorie a sistemului, în octeți (de obicei 4096 sau 16384).

Sintaxă
func Getpagesize() int

Ce face os.Getpagesize

Sistemul de operare împarte memoria în pagini de dimensiune fixă. os.Getpagesize spune cât are una: 4096 octeți pe majoritatea sistemelor Linux x86, 16384 pe Mac-urile cu procesor Apple.

Valoarea contează rar în programele obișnuite; o folosești când aloci buffer-e aliniate, lucrezi cu fișiere mapate în memorie (mmap) sau vrei să alegi o dimensiune bună de buffer pentru citire.

Ce returnează

Dimensiunea paginii, în octeți.

Exemple

Exemplul 1: Dimensiunea paginii

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println("pagina de memorie:", os.Getpagesize(), "octeți")
}

Rezultat pe Linux x86-64 (pe un Mac cu procesor Apple: 16384)

pagina de memorie: 4096 octeți

Exemplul 2: Buffer multiplu de pagină

Rotunjim o dimensiune dorită în sus, la un multiplu al paginii.

package main

import (
    "fmt"
    "os"
)

func main() {
    pagina := os.Getpagesize()
    dorit := 10000
    rotunjit := (dorit + pagina - 1) / pagina * pagina

    fmt.Println("multiplu de pagină:", rotunjit%pagina == 0)
    fmt.Println("cel puțin cât am cerut:", rotunjit >= dorit)
    fmt.Println("putere a lui 2:", pagina&(pagina-1) == 0)
}

Rezultat

multiplu de pagină: true
cel puțin cât am cerut: true
putere a lui 2: true

Greșeli frecvente

  • Scrii 4096 direct în cod ca dimensiune a paginii. Pe alte procesoare (Apple, unele ARM) pagina este mai mare.

Comenzi înrudite

  • os.Getpid: Getpid returnează ID-ul procesului curent; Getppid, ID-ul procesului care l-a pornit (părintele).
  • os.Hostname: Returnează numele calculatorului (host name) raportat de sistemul de operare.