Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР-5 ОС

.docx
Скачиваний:
14
Добавлен:
10.03.2021
Размер:
66.37 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

Ордена Трудового Красного Знамени

федеральное государственное бюджетное образовательное учреждение

высшего образования

Московский технический университет связи и информатики

----------------------------------------------------------------------------------------------

Кафедра Математической кибернетики и информационных технологий

ЛАБОРАТОРНАЯ РАБОТА № 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 - Результат выполнения

Соседние файлы в предмете Операционные системы