Interroger la mémoire physique totale sous Windows avec Golang


user2675699:

Essayer d'obtenir la mémoire physique totale à l'aide de Go sur Windows, mais vous ne savez pas quel (s) package (s) utiliser et quels appels effectuer. Je pense que cela peut être fait avec syscall. Préfère également ne pas s'interfacer avec C pour ce faire.

SirDarius:

Le godoc en ligne officiel du paquet syscall à l' adresse https://golang.org/pkg/syscall/ semble documenter les API Linux, il est donc quelque peu difficile de trouver les ressources en ligne.

La première chose à faire est d'exécuter godoc sur la plateforme Windows, ou sur n'importe quelle plateforme en modifiant les valeurs de GOOSet GOARCH.

Par exemple, les commandes suivantes exécutées dans un shell Linux permettent à godoc de croire qu'il fonctionne sous Windows, et donc de documenter les fichiers correspondants:

export GOOS=windows
export GOARCH=amd64
godoc -http=:8080

L'accès à http: // localhost: 8080 / pkg / syscall / dans un navigateur affiche la documentation de l'API Windows syscall.

Une recherche rapide révèle une fonction intéressante sur MSDN, à savoir GetPhysicallyInstalledSystemMemory(voir https://msdn.microsoft.com/en-us/library/windows/desktop/cc300158(v=vs.85).aspx ).

Apparemment, cette fonction n'existe pas dans le package syscall de Windows Go, il n'est donc pas possible de l'appeler directement.

Puisque la page MSDN montre que cette fonction est présente dans kernel32.dllune solution donnée par cette page ( https://github.com/golang/go/wiki/WindowsDLLs ) existe, cela n'implique pas d'interfaçage avec C.
Adapter la technique à cette fonction nous donne le code suivant:

//+build windows
package main

import (
    "fmt"
    "syscall"
    "unsafe"
)

func main() {
    var mod = syscall.NewLazyDLL("kernel32.dll")
    var proc = mod.NewProc("GetPhysicallyInstalledSystemMemory")
    var mem uint64

    ret, _, err := proc.Call(uintptr(unsafe.Pointer(&mem)))
    fmt.Printf("Ret: %d, err: %v, Physical memory: %d\n", ret, err, mem)
}

Lorsqu'il est exécuté, cela génère:

Ret: 1, err: L’opération a réussi., Physical memory: 16777216

La valeur est donnée en kilo-octets, donc divisez par 1048576 (1024 * 1024) pour obtenir une valeur en gigaoctets.

Articles connexes


Alias de la mémoire physique sous Windows

l'ombre de la lune J'ai deux fils et un grand ensemble de données. Thread R lit en permanence le jeu de données et présente à l'utilisateur une vue des données. Thread W reçoit en permanence des données distantes, y effectue des travaux et les publie dans l'en

Obtenez la mémoire physique totale en Python

Justin : Comment puis-je obtenir la mémoire physique totale dans Python d'une manière indépendante de la distribution? Je n'ai pas besoin de mémoire utilisée, juste de la mémoire physique totale. Corey Goldberg: votre meilleur pari pour une solution multiplate

limiter la mémoire physique sous linux

majid hajibaba Je veux tester un programme qui a besoin d'un système avec 512 Mo de RAM. Mais mon système a 1 Go de RAM. Ce n'est pas possible de détacher physiquement la RAM de la carte mère et je ne veux pas utiliser VM ou docker. Comment puis-je limiter ou

Get-Process avec utilisation totale de la mémoire

Aaron $Processes = get-process -computername $tag1 | Group-Object -Property ProcessName foreach($Process in $Processes) { $Obj = New-Object psobject $Obj | Add-Member -MemberType NoteProperty -Name Name -Value $Process.Name $Obj | Add-Member -Membe