ЛР-5 ОС
.docx
ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Ордена Трудового Красного Знамени
федеральное государственное бюджетное образовательное учреждение
высшего образования
Московский технический университет связи и информатики
----------------------------------------------------------------------------------------------
Кафедра Математической кибернетики и информационных технологий
ЛАБОРАТОРНАЯ РАБОТА № 4
по дисциплине
ОПЕРАЦИОННЫЕ СИСТЕМЫ
«Архитектура памяти Windows»
Выполнил:
студентка Гончарова Екатерина
группа БФИ1601
Проверил:
Королькова Т.В.
ст. пр. кафедры МКиИТ
Дата 11.12.2018
Москва 2018
Название работы: Архитектура памяти Windows.
Цель работы: получение практических навыков по использованию Win32 API для исследования памяти Windows
Задание: создать программное обеспечение для приложения, которое:
выдает информацию, получаемую при использовании API GlobalMemoryStatus. При выводе информации использовать диаграммы.
Составляет карту виртуальной памяти для любого процесса.
Исходный код:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security;
namespace memory1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
MemoryStatus status = MemoryStatus.CreateInstance();
uint MemoryLoad = status.MemoryLoad;
ulong TotalPhys = status.TotalPhys;
ulong AvailPhys = status.AvailPhys;
ulong TotalPageFile = status.TotalPageFile;
ulong AvailPageFile = status.AvailPageFile;
ulong TotalVirtual = status.TotalVirtual;
ulong AvailVirtual = status.AvailVirtual;
ulong AvailExtendedVirtual = status.AvailExtendedVirtual;
listBox1.Items.Add("Всего физической памяти= " + TotalPhys / 1024 / 1024 + " MB");
listBox1.Items.Add("Объем физической памяти, доступный в данный момент " + AvailPhys / 1024 / 1024 + " MB");
listBox1.Items.Add("Всего файл подкачки= " + TotalPageFile / 1024 / 1024 + " MB");
listBox1.Items.Add("Объем файла подкачки, доступный в данный момент " + AvailPageFile / 1024 / 1024 + " MB");
listBox1.Items.Add("Всего виртуальной памяти= " + TotalVirtual / 1024 / 1024 + " MB");
listBox1.Items.Add("Объем виртуальной памяти, доступный в данный момент " + AvailVirtual / 1024 / 1024 + " MB");
listBox1.Items.Add("Используется памяти данным процессом: " + MemoryLoad + "байт");
List<ulong> memorys = new List<ulong>() { TotalPhys, AvailPhys };
List<ulong> statuses = new List<ulong>() { TotalPageFile, AvailPageFile};
List<ulong> virt = new List<ulong>() { TotalVirtual, AvailVirtual };
string[] seriesArray = { "TotalPhys", "AvailPhys" };
string[] seriesArray2 = { "TotalPageFile", "AvailPageFile"};
string[] seriesArray3 = { "TotalVirtual", "AvailVirtual" };
chart1.Series["Series1"].Points.DataBindXY(seriesArray2, statuses);
chart2.Series["Series1"].Points.DataBindXY(seriesArray, memorys);
chart3.Series["Series1"].Points.DataBindXY(seriesArray3, virt);
}
private void button2_Click(object sender, EventArgs e)
{
//System.IO.File.Open(("C:\Users\goldm_000\Desktop\Project\OS_lab4\Debug\OS_lab4.exe",);
System.Diagnostics.Process MyProc = new System.Diagnostics.Process();
MyProc.StartInfo.FileName = @"C:\Users\User\source\repos\memory1\Debug\memory2.exe";
MyProc.Start();
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class MemoryStatus
{
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool GlobalMemoryStatusEx([In, Out] MemoryStatus lpBuffer);
private uint dwLength;
public uint MemoryLoad;
public ulong TotalPhys;
public ulong AvailPhys;
public ulong TotalPageFile;
public ulong AvailPageFile;
public ulong TotalVirtual;
public ulong AvailVirtual;
public ulong AvailExtendedVirtual;
private static volatile MemoryStatus singleton;
private static readonly object syncroot = new object();
public static MemoryStatus CreateInstance()
{
if (singleton == null)
lock (syncroot)
if (singleton == null)
singleton = new MemoryStatus();
return singleton;
}
[SecurityCritical]
private MemoryStatus()
{
dwLength = (uint)Marshal.SizeOf(typeof(MemoryStatus));
GlobalMemoryStatusEx(this);
}
}
}
Программа вторая:
#include "pch.h"
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <locale>
#include <iomanip>
#define cin wcin
using namespace std;
void ShowProcessEntry(PROCESSENTRY32 &entry) {
wcout << "ID " << entry.th32ProcessID;
wcout << " | " << entry.szExeFile << endl;
}
void processList()
{
PROCESSENTRY32 peProcessEntry;
HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
//cout << "\nSnapshot ID = " << hSnapshot;
cout << endl << "********* Процессы *********" << endl;
if (INVALID_HANDLE_VALUE == hSnapshot) {
return;
}
peProcessEntry.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot, &peProcessEntry);
do {
//cout << endl << "********* Процесс *********\n" << endl;
ShowProcessEntry(peProcessEntry);
} while (Process32Next(hSnapshot, &peProcessEntry));
CloseHandle(hSnapshot);
cout << "********* Конец данных о процессах *********" << endl;
}
void coutAddress(DWORD address)
{
cout << hex << "0x" << setfill('0') << setw(8) << address << setfill(' ') << dec;
}
void getMapProcess(DWORD id)
{
HANDLE hHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id);
MEMORY_BASIC_INFORMATION mbi;
DWORD finAddress = 0x7FFFFFFF;
for (DWORD bAddress = 0; bAddress < 0x7FFFFFFF; bAddress += mbi.RegionSize)
{
VirtualQueryEx(hHandle, (void*)bAddress, &mbi, sizeof(mbi));
cout << "\nБазовый адрес области: "; coutAddress((DWORD)mbi.BaseAddress);
cout << "\nРазмер области:"; cout << hex << "0x" << mbi.RegionSize << dec;
if (mbi.State != MEM_FREE)
{
cout << "\nБазовый адрес выделенной области: "; cout <<((DWORD)mbi.AllocationBase);
}
switch (mbi.State)
{
case MEM_FREE:
cout << "\nState: Free\n";
break;
case MEM_RESERVE:
cout << "\nState: Reserve;\tType: ";
switch (mbi.Type)
{
case MEM_IMAGE:
cout << "Image";
break;
case MEM_MAPPED:
cout << "Mapped";
break;
case MEM_PRIVATE:
cout << "Private";
break;
default:
cout << "Unknown";
break;
}
cout << "\n";
break;
case MEM_COMMIT:
cout << "\nState: Reserve;\tType: ";
switch (mbi.Type)
{
case MEM_IMAGE:
cout << "Image";
break;
case MEM_MAPPED:
cout << "Mapped";
break;
case MEM_PRIVATE:
cout << "Private";
break;
default:
cout << "Unknown";
break;
}
break;
cout << "\nProtect: ";
switch (mbi.Protect)
{
case PAGE_EXECUTE:
cout << "Execute";
break;
case PAGE_NOACCESS:
cout << "No access";
break;
case PAGE_READONLY:
cout << "Read only";
break;
case PAGE_READWRITE:
cout << "Read/write";
break;
case PAGE_WRITECOPY:
cout << "Writecopy";
break;
default:
cout << "Unknown";
break;
}
break;
cout << "\n";
default:
cout << "\nState: Unknown\n";
break;
}
if (tolower(_getch()) == 'q')
break;
}
}
int main(int argv, char **argc)
{
setlocale(LC_ALL, "rus");
cout.imbue(locale("rus_rus.1251"));
int id;
system("cls");
processList();
cout << "Введите ID:";
cin >> id;
if (id)
getMapProcess(id);
cout << "Карта процесса успешно построена" << endl;
system("pause");
return 1;
}
Рисунок 1 - Результат выполнения