Поиск SC_PAGE_SIZE с использованием Python в Windows
Я работаю в этой смешанной среде, где я нахожусь на машине 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 ответа
Я не системный эксперт, поэтому я не знаю, что соответствует 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
Единственный эквивалент, который я смог найти, был в C, но если я скомпилирую код и затем выполню его из python, я смогу получить результат, который искал. К сожалению, на данный момент в Windows нет команды python, которая бы работала так же просто, как версия для Unix, но это, по крайней мере, дает мне результат.
int main(void) {
SYSTEM_INFO si;
GetSystemInfo(&si);
printf("%u", si.dwPageSize);
return 0;
}
Это можно сделать с 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)