Поиск SC_PAGE_SIZE с использованием Python в Windows - PullRequest
4 голосов
/ 13 января 2012

Я работаю в этой смешанной среде, где я работаю на компьютере с Windows, используя Simics и Cygwin для запуска некоторого кода в среде, подобной Unix. Я кодирую на C, но мне интересно попытаться сделать свое решение на Python. В среде Unix найти SC_PAGE_SIZE вы можете просто:

#Python-2.7, unix environment
page_size = os.sysconf("SC_PAGE_SIZE")

Если вы кодируете в c, вы можете сделать:

#C, unix environment
size_t page_size = (size_t) sysconf (_SC_PAGESIZE);

Однако при использовании python в Windows os.sysconf не существует, и я не смог найти замену. Что я могу использовать в Python, чтобы найти PAGE_SIZE среды.

Примечание: я знаю, вы можете спросить, почему я использую настройку как есть, и это не мой выбор Это домашнее задание с работы. Вопрос, который я задаю, для моей же пользы, а не для домашней работы.

Ответы [ 4 ]

8 голосов
/ 07 декабря 2012

Попробуйте:

import mmap

print mmap.PAGESIZE
1 голос
/ 11 октября 2012

Единственный эквивалент, который я смог найти, был в C, но если я скомпилирую код и затем выполню его из python, я смогу получить результат, который искал. К сожалению, на данный момент в Windows нет команды python, которая бы работала так же просто, как версия для Unix, но это, по крайней мере, дает мне результат.

int main(void) {
        SYSTEM_INFO si;
        GetSystemInfo(&si);

        printf("%u", si.dwPageSize);

        return 0;
}
1 голос
/ 13 января 2012

Я не системный эксперт, поэтому я не знаю, что соответствует SC_PAGE_SIZE в WindowsОднако вы можете использовать WMI для запроса производительности системы.

Вот пример, который должен дать много вещей.Можете ли вы найти то, что вы ищете:

import win32com.client

import unicodedata
def _(text):
    if type(text) is unicode:
        return unicodedata.normalize('NFKD', text).encode('ascii','ignore')
    return text

def to_kb(x):
    if x:
        return int(x)/1024
    return x

strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_Process")


for objItem in colItems:
    print "------------------------------------------"
    print "Command Line: ", _(objItem.CommandLine)
    print "Process Id: ", objItem.ProcessId

    print "Handle: ", objItem.Handle
    print "Handle Count: ", objItem.HandleCount
    print "Maximum Working Set Size: ", to_kb(objItem.MaximumWorkingSetSize)
    print "Minimum Working Set Size: ", to_kb(objItem.MinimumWorkingSetSize)
    print "Page Faults: ", objItem.PageFaults
    print "PageFile Usage: ", objItem.PageFileUsage
    print "Peak PageFile Usage: ", objItem.PeakPageFileUsage
    print "Peak Virtual Size: ", objItem.PeakVirtualSize
    print "Peak Working Set Size: ", objItem.PeakWorkingSetSize
    print "Private Page Count: ", objItem.PrivatePageCount
    print "Quota NonPaged Pool Usage: ", objItem.QuotaNonPagedPoolUsage
    print "Quota Paged Pool Usage: ", objItem.QuotaPagedPoolUsage
    print "Quota Peak NonPaged Pool Usage: ", objItem.QuotaPeakNonPagedPoolUsage
    print "Quota Peak Paged Pool Usage: ", objItem.QuotaPeakPagedPoolUsage
    print "Virtual Size: ", objItem.VirtualSize
    print "Working Set Size: ", to_kb(objItem.WorkingSetSize)
    print "Write Operation Count: ", objItem.WriteOperationCount
    print "Write Transfer Count: ", objItem.WriteTransferCount
0 голосов
/ 15 января 2018

Это можно сделать с помощью модуля ctypes:

from ctypes import Structure, byref, windll
from ctypes.wintypes import WORD, DWORD, LPVOID


class SYSTEM_INFO(Structure):
    _fields_ = [
        ("wProcessorArchitecture", WORD),
        ("wReserved", WORD),
        ("dwPageSize", DWORD),
        ("lpMinimumApplicationAddress", LPVOID),
        ("lpMaximumApplicationAddress", LPVOID),
        ("dwActiveProcessorMask", DWORD),
        ("dwNumberOfProcessors", DWORD),
        ("dwProcessorType", DWORD),
        ("dwAllocationGranularity", DWORD),
        ("wProcessorLevel", WORD),
        ("wProcessorRevision", WORD),
    ]


si = SYSTEM_INFO()
windll.kernel32.GetSystemInfo(byref(si))
print(si.dwPageSize)
...