С помощью функций winapi определить информацию об оперативной памяти c
1) Версию ОС (функция GetVersionEX()):
2) Системный каталог GetSystemDirectory());
Также добавить разработаную программу функцию, которая определяет название компьютера и псевдоним, текущего пользователя (функции: GetComputerName(), GetUserName())
Ребят, помогите, буду очень рад!)
@echo off
echo Внимание, сейчас будет выполнен сбор данных о вашей системе
systeminfo
pause Сбор информации завершен. Для продолжения нажмите ENTER
void main()
char svBuffer[512];
DWORD dwBufSize;
char svReply[512];
dwBufSize = MAX_COMPUTERNAME_LENGTH+1;
if(!GetComputerName(svBuffer, &dwBufSize))
printf("Could not retrieve machine name.\n");
else
wsprintf(svReply, "System info for machine '%.400s'\n", svBuffer);
printf(svReply);
>
// Send back processor info
SYSTEM_INFO sysInfo;
lstrcpy(svReply, "Processor: ");
GetSystemInfo(&sysInfo);
switch (sysInfo.dwProcessorType) case PROCESSOR_INTEL_386:
lstrcat(svReply, "I386\n");
break;
case PROCESSOR_INTEL_486:
lstrcat(svReply, "I486\n");
break;
case PROCESSOR_INTEL_PENTIUM:
lstrcat(svReply, "I586\n");
break;
case PROCESSOR_MIPS_R4000:
lstrcat(svReply, "MIPSR4000\n");
break;
default:
lstrcat(svReply, "UNKNOWN\n");
break;
>
OSVERSIONINFO osvi;// Send back OS version info
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&osvi) == FALSE)
lstrcpy(svReply, "Could not get version info.\n");
else switch(osvi.dwPlatformId) case VER_PLATFORM_WIN32s:
lstrcpy( svBuffer, "Win32s on Windows 3.1");
break;
case VER_PLATFORM_WIN32_WINDOWS:
lstrcpy( svBuffer, "Win32 on Windows 95");
break;
case VER_PLATFORM_WIN32_NT:
lstrcpy( svBuffer, "Windows NT");
break;
default:
lstrcpy( svBuffer, "Windows?");
break;
>
wsprintf( svReply, "%s v%d.%d build %d\n", svBuffer, (int)osvi.dwMajorVersion, (int)osvi.dwMinorVersion, (int)LOWORD(osvi.dwBuildNumber));
if(lstrlen(osvi.szCSDVersion)) lstrcat(svReply, " - ");
lstrcat(svReply, osvi.szCSDVersion);
lstrcat(svReply, "\n");
>
>
printf(svReply);
// Send back global memory usage
MEMORYSTATUS memstat;
DWORD dw,dw2,dw3,dw4;
char c;
int x;
GlobalMemoryStatus(&memstat);
wsprintf(svReply, "Memory: %dM in use: %d%% Page file: %dM free: %dM\n", memstat.dwTotalPhys/1024/1024, memstat.dwMemoryLoad, memstat.dwTotalPageFile/1024/1024, memstat.dwAvailPageFile/1024/1024 );
printf(svReply);
for (c = 'C'; c wsprintf(svReply, "%c:\\", c);
x = GetDriveType(svReply);
lstrcat( svReply, " - ");
switch (x) case 0:
lstrcat(svReply, "Unable to determine.\n");
break;
case 1:
svReply[0]='\0';
break;
case DRIVE_REMOVABLE:
lstrcat(svReply, "Removable\n");
break;
case DRIVE_FIXED:
lstrcat(svReply, "Fixed");
wsprintf(svBuffer, "%c:\\", c);
if (GetDiskFreeSpace(svBuffer, &dw, &dw2, &dw3, &dw4)) wsprintf(svBuffer, " Sec/Clust: %u Byts/Sec: %u, Bytes free: %u/%u\n", (unsigned int)dw, (unsigned int)dw2, (unsigned int)(dw3*dw2*dw), (unsigned int)(dw4*dw2*dw));
lstrcat(svReply, svBuffer);
> else lstrcat(svReply,"\n");
break;
case DRIVE_REMOTE:
lstrcat(svReply, "Remote\n");
break;
case DRIVE_CDROM:
lstrcat(svReply, "CD-ROM\n");
break;
case DRIVE_RAMDISK:
lstrcat(svReply, "Ramdisk\n");
break;
default:
lstrcat(svReply, "Unknown type!\n");
break;
>
if(lstrlen(svReply))
printf(svReply);
>
getch();
>
OSVERSIONINFO info;
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!GetVersionEx(&info)) wprintf(L"version: unavailable\n");
else wprintf(L"version: %d.%d.%d, %s\n", info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber, info.szCSDVersion);
DWORD size = GetSystemDirectory(NULL, 0);
LPWSTR buf = (LPWSTR)malloc(size * sizeof(WCHAR));
wprintf(L"system directory: %s\n", GetSystemDirectory(buf, size) ? buf : L"unavailable");
free(buf);
size = 0;
GetComputerName(buf, &size);
buf = (LPWSTR)malloc(size * sizeof(WCHAR));
wprintf(L"name: %s\n", GetComputerName(buf, &size) ? buf : L"unavailable");
free(buf);
size = 0;
GetUserName(buf, &size);
buf = (LPWSTR)malloc(size * sizeof(WCHAR));
wprintf(L"user: %s\n", GetUserName(buf, &size) ? buf : L"unavailable");
free(buf);
Определение информации об оперативной и о памяти на одном из жестких дисков
С помощью функций WinAPI определить информацию об оперативной памяти и информацию о памяти на одном.
Получить информацию о оперативной памяти через wmi
Всем привет! Подскажите. Как можно узнать сколько оперативной памяти свободно через WMI? Как узнать.
Как программно получить информацию о видеокарте, процессоре, оперативной памяти и материнской плате
Привет, ребята, не знаю, куда писать, поэтому пишу сюда. Прошу прощение, что не по теме. Надеюсь.
Есть ли ДВД плееры, которые читают информацию с внешних жестких дисков
Меня все таки заинтересовал данный вопрос, так как на переносном жестком диске я создал свою.
Но некоторые личности говорят, что они неправильны,говорят что копипастят текст программы,а она выдает неправильные данные,хотя у меня все правильно работает.Возможно ли такое?)
printf ("%ld percent of memory in use \n",statex.dwMemoryLoad); printf ("%ld sizeof bytes\n",statex.dwLength); printf ("%*ld %s bytes of physical memory \n",WIDTH, statex.dwTotalPhys/DIV); printf ("%*ld %s free physical memory bytes\n",WIDTH, statex.dwAvailPhys/DIV); printf ("%*ld %s bytes of paging file \n",WIDTH, statex.dwTotalPageFile/DIV); printf ("%*ld %s free bytes of paging file \n",WIDTH, statex.dwAvailPageFile/DIV); printf ("%*ld %s user bytes of address space \n",WIDTH, statex.dwTotalVirtual/DIV); printf ("%*ld %s free user bytes \n",WIDTH, statex.dwAvailVirtual/DIV);
Это вообще как. Аргументы не соответствуют форматной строке. НЕ может это правильно работать. Ну никак.
Заходим по первой ссылке данной Maxwe11 открываем(или она уже открыта) вкладку дополнительная информация, и смотрим что чему соответсвует.
Ахтунг. См. внимательно описание параметра
lpTotalNumberOfBytes
A pointer to a variable that receives the total number of bytes on a disk that are available to the user who is associated with the calling thread.
This parameter can be NULL.
If per-user quotas are being used, this value may be less than the total number of bytes on a disk.
To determine the total number of bytes on a disk or volume, use IOCTL_DISK_GET_LENGTH_INFO.
Вооот))спасибо,вторая работает первая нет)мм как избавиться от этого дефекта?
Добавлено через 5 минут
все спасибо понял исправил))огромное спасибо)
Добавлено через 2 минуты
Добавляем туда какую-то переменную int,например k; int k; присваеваем этой переменной значение GetDiskFreeSpaceEx, тоесть k=GetDiskFreeSpaceEx(0,
(PULARGE_INTEGER)&FreeBytesAvailable,
(PULARGE_INTEGER)&TotalNumberOfBytes,
(PULARGE_INTEGER)&TotalNumberOfFreeBytes
);
и если это к!=0 то выполняем другие условия) тоесть if(k!=0) то выполняем в ином случае функция вызвана неправильно)я правильно понял?)
Добавлено через 8 минут
printf("Свободная память: %lf Гб\n",(long double)TotalNumberOfFreeBytes/1024/1024/1024);
printf("Общий объем памяти: %lf Гб\n",(long double)TotalNumberOfBytes/1024/1024/1024);
printf("Доступно для использования: %lf Гб\n", (long double)FreeBytesAvailable/1024/1024/1024);
Я правильно поделил чтобы получить Гб?
Contains information about the current state of both physical and virtual memory, including extended memory. The GlobalMemoryStatusEx function stores information in this structure.
Members
The size of the structure, in bytes. You must set this member before calling
GlobalMemoryStatusEx.
A number between 0 and 100 that specifies the approximate percentage of physical memory that is in use (0 indicates no memory use and 100 indicates full memory use).
The amount of actual physical memory, in bytes.
The amount of physical memory currently available, in bytes. This is the amount of physical memory that can be immediately reused without having to write its contents to disk first. It is the sum of the size of the standby, free, and zero lists.
The current committed memory limit for the system or the current process, whichever is smaller, in bytes. To get the system-wide committed memory limit, call GetPerformanceInfo.
The maximum amount of memory the current process can commit, in bytes. This value is equal to or smaller than the system-wide available commit value. To calculate the system-wide available commit value, call GetPerformanceInfo and subtract the value of CommitTotal from the value of CommitLimit.
The size of the user-mode portion of the virtual address space of the calling process, in bytes. This value depends on the type of process, the type of processor, and the configuration of the operating system. For example, this value is approximately 2 GB for most 32-bit processes on an x86 processor and approximately 3 GB for 32-bit processes that are large address aware running on a system with 4-gigabyte tuning enabled.
The amount of unreserved and uncommitted memory currently in the user-mode portion of the virtual address space of the calling process, in bytes.
Reserved. This value is always 0.
Remarks
MEMORYSTATUSEX reflects the state of memory at the time of the call. It also reflects the size of the paging file at that time. The operating system can enlarge the paging file up to the maximum size set by the administrator.
Для получения детальной информации о состоянии памяти компьютера можно воспользоваться функцией API GlobalMemoryStatus. В функцию передается переменная типа TMemoryStatus, которая представляет собой запись, тип которой определен следующим образом:
Первое поле записи, dwLength, описывает длину записи TMemoryStatus. Поле необходимо инициализировать функцией SizeOf до обращения к функции GlobalMemoryStatus.
Второе поле, dwMemoryLoad, содержит количество использованной памяти в процентах.
Третье поле, dwTotalPhys, содержит число байт установленной на компьютере ОЗУ (физической памяти).
Поле dwAvailPhys - свободная физическая память в байтах.
Следующие два поля - dwTotalPageFile и dwAvailPageFile - показывают общий объем, который могут сохранить файлы/файл подкачки (вообще говоря, не совпадает с размером последних) и еще доступный объем из этой величины. Все в байтах.
Последние два поля относятся к виртуальной памяти. Поле dwTotalVirtual - общее число байтов виртуальной памяти, используемой в вызывающем процессе. Поле AvailVirtual - объем этой памяти, еще доступной для вызывающего процесса.
Приведу один пример использования функции GlobalMemoryStatus. На Дельфи можно реализовать следующий код получения информации о наличной памяти ОЗУ:
Функция GetRAM возвращает общее число байт физической памяти, установленной на компьютере. Эту информацию она читает из поля dwTotalPhys записи MS, имеющей тип TMemoryStatus. Перед этим вызывается API-функция GlobalMemoryStatus с параметром MS. Обратите внимание, что перед вызовом GlobalMemoryStatus инициализируется поле dwLength функцией SizeOf.
По аналогии с примером можно получить информацию об остальных параметрах памяти. Думаю, у читателей это не вызовет затруднения. Реализацию функций на Дельфи для получения информации о памяти можно найти в моем модуле SysInfo v.3.00 по адресу SysInfo2.zip. Там же содержатся функции получения и другой системной информации.
Средствами операционной системы Windows можно узнать достаточно много информации об оборудовании, памяти (функция GlobalMemoryStatus), жёстких дисках (функция GetDiskFreeSpace), сети и мониторе (функция GetSystemMetrics при различных параметрах), программном окружении (функции GetComputerName и GetUserName) и о многом другом. Подробное описание функций и примеры их использования можно найти в справочной системе MSDN.
Для определения таких параметров процессора, как фирма производитель, наличие расширений, количества и параметров кэшей команд и данных, TLB и других параметров в случае архитектур x86 используется инструкция процессора cpuid, которая имеет интерфейс на языке С/С++ __cpuid. Так для определения идентификатора процессора имеет место следующий код:
memset(CPUString, 0, sizeof(CPUString));
printf(" CPU vendor: %s\n",CPUString);
Первый параметр функции __cpuid – 4-х элементный целочисленный массив, который соответствует регистрам eax, ebx, ecx, edx после выполнения инструкции. Второй параметр функции – номер функции инструкции. Подробная информация о номерах функций инструкции cpuid и содержимом регистров приведена в документах [1,2] для процессоров Intel и AMD. Так например с помощью функций 0x80000002, 0x80000003, 0x80000004 можно узнать полное название процессора.
Задание.
1. В соответствии с вариантом задания записать представление целого числа в типе char и вещественного числа в типе float (Обязательное задание – 5 баллов).
2. С помощью функций WinAPI определить информацию об оперативной памяти (Дополнительное задание – 1 балл).
3. С помощью функций WinAPI определить информацию о памяти на одном из жёстких дисков (Дополнительное задание – 2 балла).
4. С помощью инструкции cpuid определить название процессора (Дополнительное задание – 2 балла).
5. Крайний срок сдачи – 1 апреля 2011 года.
Варианты.
1. Целое число –12, вещественное число 12.5.
2. Целое число –23, вещественное число 12.125.
3. Целое число –56, вещественное число 12.25.
4. Целое число –78, вещественное число 12.75.
5. Целое число –89, вещественное число 12.625.
6. Целое число –90, вещественное число 24.5.
7. Целое число –21, вещественное число 24.125.
8. Целое число –45, вещественное число 24.25.
9. Целое число –78, вещественное число 24.75.
10. Целое число –86, вещественное число 24.625.
Лабораторная работа № 2
Исследование кэш-памяти и обхода памяти
Цель работы.Сравнение различных способов обхода памяти, программное определение размера и степени ассоциативности кэш-памяти различных уровней.
Методические указания.
Кэш-память
Кэш-память является промежуточным хранилищем данных между процессором и оперативной памятью. Она содержит копии наиболее часто используемых блоков данных из оперативной памяти. Размер кэш-памяти составляет от нескольких килобайт до нескольких мегабайт, а скорость доступа к ней в несколько раз превосходит скорость доступа к оперативной памяти, но уступает скорости обращения к регистрам. Каждый раз, когда к ячейке оперативной памяти происходит обращение (чтение или запись), ее копия заносится в кэш-память, вытеснив при этом оттуда копию другой ячейки. Поэтому повторное обращение к той же ячейке произойдет быстрее. Значения переменных программы и небольшие массивы, для которых не нашлось места в регистрах, обычно располагаются в кэш-памяти. Большие массивы могут поместиться в кэш-память только частично. Допустим, некоторая программа производит многократную обработку элементов массива. Если построить график зависимости времени обработки массива от размера массива, то он должен иметь нелинейный характер. При превышении размера кэш-памяти время обращения к элементам массива несколько возрастет (на графике будет наблюдаться скачок). Данные из оперативной памяти в кэш-память (и обратно) считываются целыми строками. Размер кэш-строки в большинстве распространенных процессоров составляет 16, 32, 64, 128 байт. При последовательном обходе попытка чтения первого элемента кэш-строки вызывает копирование всей строки из медленной оперативной памяти в кэш. Чтение нескольких последующих элементов выполняется намного быстрее, т.к. они уже находятся в быстрой кэш-памяти. В большинстве современных микропроцессорах реализована аппаратная предвыборка данных. Ее суть состоит в том, что при последовательном обходе очередные кэш-строки копируются из оперативной памяти в кэш-память еще до того, как к ним произошло обращение. За счет этого скорость последовательного обхода данных еще возрастает.
Большинство современных микропроцессоров имеют множественно-ассоциативную (наборно-ассоциативную) организацию кэш-памяти. При множественно-ассоциативной организации кэш-память разделена на несколько банков, и каждый блок данных из оперативной памяти может быть помещен в одну из определенного множества (набора) строк кэш-памяти. Число строк в множестве определяется числом банков. Схема кэш-памяти данных первого уровня на Pentium III (16 Кб):
В какой конкретный элемент множества строка будет записана, определяется алгоритмом замещения (циклический, случайный, LRU, псевдо-LRU, …). Таким образом, блоки, отстоящие на определенное расстояние в памяти (в примере: на 2 12 B = 4096 B = 4 KB), помещаются в одно и то же множество строк. Число элементов в каждом множестве (число банков) называется степенью ассоциативности кэш-памяти. Например, кэш данных L1 в Pentium III имеет объем 16 KB, степень ассоциативности 4 (4-way set-associative), размер строки 32B:
16KB = 4-way * 4 KB = 4-way * 128 множеств * 32B
Данные, расположенные в памяти с шагом на расстоянии 4KB приходятся на одно множество. На все эти данные приходится всего 4 кэш-строки, т.е. 4 * 32 = 128 B. Если выполнять обход данных с шагом 4 KB, то из всех 16 KB кэша L1 будет использоваться всего 128 B, которые будут постоянно перезаписываться (эффект «буксования» кэша). Производительность при этом будет такая же, как при отсутствии кэш-памяти. Если вычислительная система имеет несколько уровней кэш-памяти, то у каждого уровня может быть своя степень ассоциативности. Определить степени ассоциативности кэш-памяти можно следующим способом. Выполняется обход N блоков данных суммарным объемом BlockSize, отстоящих друг от друга на величину Offset:
BlockSize должен быть не больше объема исследуемого уровня кэш-памяти. Offset должно быть кратно величине «размер кэша» / «ассоциативность», т.е. кратно размеру банка ассоциативности. Как правило, это степени двоек, так что можно взять заведомо кратное такому значению расстояние (например, 1MB). Изменяя число частей N, мы увидим, как меняется время обхода. Когда N превысит число банков, время обхода сильно возрастет.
Syntax
Читайте также: