Logo GenDocs.ru

Поиск по сайту:  

Загрузка...

Менеджер памяти - файл 1.doc


Менеджер памяти
скачать (279.5 kb.)

Доступные файлы (1):

1.doc280kb.05.02.2012 08:14скачать

содержание

1.doc

Российский государственный аграрный университет – МСХА

им. К.А. Тимирязева


Кафедра прикладной информатики


Отчет

по дисциплине:

«Операционные системы, среды и оболочки»
Тема:

«Разработка менеджера памяти»
Выполнила

студентка 207 группы

учетно-финансового факультета

Шубина Е. А.

Проверил ст. преподаватель

Мастяев Ф. А.

Москва 2009

Содержание



Введение 3

I.Основная часть 3

1.Структура приложения 3

2.Интерфейсы управления 4

II.Контрольный пример 5

III.Выводы 8

IV.Источники информации 8

V.Приложения 9

1.Исходный код 9

2.Скриншоты 15

3.Результаты прогонов контрольного примера 15

4.Статистика разработки приложения 16



Введение



Целью этой работы является разработка менеджера памяти, который будет являться «надстройкой» над диспетчером процессов.

Приложение должно быть создано в среде программирования Delphi, на языке ObjectPasсal.

В приложении должно быть: объем свободной и используемой памяти (RAM), объем свободной и используемой памяти (файл подкачки), объем выделенной и используемой памяти.

Приложение «менеджер памяти» будет реализован уже в ранее созданном приложении «диспетчер задач», и занимать отдельную вкладку.

  1. ^

    Основная часть

    1. Структура приложения


Код этого приложения содержится в Unit TaskManager диспетчера процессов, располагается на отдельной вкладке, которая называется «менеджер памяти».
    1. ^

      Интерфейсы управления



Поля отображения состояния памяти

При нажатии кнопки отображается состояние физической и виртуальной памяти


Рис.1 Вид приложения
При запуске приложения открывается диспетчер процессов, при переходе на вкладку «Менеджер памяти» можно увидеть два поля, в одном отображается состоянии физической памяти в мегабайтах, во втором поле – состояние виртуальной памяти при нажатии на кнопку «Показать/обновить». При повторном нажатии на нее – отображаемые данные обновляются.

  1. ^

    Контрольный пример




Рис.2. При запуске приложения


Рис.3. Переход к «Менеджеру памяти»



Рис.4. Вид приложения при нажатии на кнопку «Показать/обновить»


Рис.5. Вид приложения с обновленными данными после повторного нажатия на кнопку



Рис.6. Обновленные данные после 3-го нажатия на кнопку «показать/обновить»

  1. Выводы


Было создано приложение «Менеджер памяти», в котором реализовано следующее:

    1. Отображение состояния памяти RAM – всего, доступно, используется

    2. Отображение состояния виртуальной памяти – всего, доступно, используется.

Не было сделано: файл подкачки и отображение состояния выделенной и используемой памяти, возможно, это будет сделано при доработке приложения.
^

  1. Источники информации


1. Бобровский С.И. Delphi7. Учебный курс. - СПб.: Питер, 2003.

2. Е.Марков «Delphi. Быстрый старт»

3. Шпак Ю.А. Delphi7 на примерах. – Юниор, 2003

  1. ^

    Приложения

    1. Исходный код


unit TaskManager;
interface
uses

Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,

Dialogs, ComCtrls, TeEngine, ExtCtrls, TeeProcs, StdCtrls,

Menus, tlhelp32, Grids, registry;
type

Tmainform = class(TForm)

PageControl: TPageControl;

appsheet: TTabSheet;

processsheet: TTabSheet;

speedsheet: TTabSheet;

Timer: TTimer;

killappbtn: TButton;

newbtn: TButton;

killprocessbtn: TButton;

all: TGroupBox;

flowscountlb: TLabel;

processcountlb: TLabel;

processcount: TLabel;

flowscount: TLabel;

applist: TStringGrid;

processlist: TStringGrid;

cpuspeedlb: TLabel;

cpuspeed: TLabel;

memsheet: TTabSheet;

Physmem: TGroupBox;

physmemalllb: TLabel;

physmemavalb: TLabel;

physmemloadlb: TLabel;

physmemload: TLabel;

physmemava: TLabel;

physmemall: TLabel;

Virtmem: TGroupBox;

virtmemalllb: TLabel;

virtmemavalb: TLabel;

virtmemloadlb: TLabel;

virtmemava: TLabel;

virtmemall: TLabel;

Showbtn: TButton;

virtmemload: TLabel;

procedure FormCreate(Sender: TObject);

procedure killprocessbtnClick(Sender: TObject);

procedure realtimeClick(Sender: TObject);

procedure TimerTimer(Sender: TObject);

procedure killappbtnClick(Sender: TObject);

procedure newbtnClick(Sender: TObject);

procedure showmembtnClick(Sender: TObject);
private

{ Private declarations }

public

{ Public declarations }

function EnablePrivilege(const Value: Boolean; privilegename:string): Boolean;

procedure processinfotogrid(procinfogrid:TStringGrid);

function getpriority(id:THandle):string;

function killproc(id:THandle):boolean;

procedure setpriority(id:THandle;prclass:Cardinal);

function ThrCount(procinfogrid:TStringGrid):word;

procedure CurrentInfo;

function CurrentProcessorSpeed:string;

function OfficialCPUSpeed:string;

procedure AppInfoToGrid(grid:TStringGrid);

function killtaskfunc:boolean;

procedure WindowNotWorking(grid:TStringGrid);

end;
var

mainform: Tmainform;
implementation
uses NewTask;
{$R *.dfm}
function TMainForm.EnablePrivilege(const Value: Boolean; privilegename:string): Boolean;

var

hToken: THandle;

tp: TOKEN_PRIVILEGES;

d: DWORD;
begin

Result := False;

if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) then

begin

tp.PrivilegeCount := 1;

LookupPrivilegeValue(nil, pchar(privilegename), tp.Privileges[0].Luid);

if Value then

tp.Privileges[0].Attributes := $00000002

else

tp.Privileges[0].Attributes := $80000000;

AdjustTokenPrivileges(hToken, False, tp, SizeOf(TOKEN_PRIVILEGES), nil, d);

if GetLastError = ERROR_SUCCESS then

begin

Result := True;

end;

CloseHandle(hToken);

end;

end;
procedure TMainForm.WindowNotWorking(grid:TStringGrid);

var i:word;

res:dword;

begin

for i:=1 to grid.RowCount-1 do

if SendMessageTimeOut(strtoint(applist.Cells[1,i]),WM_NULL,0,0,SMTO_NORMAL or SMTO_ABORTIFHUNG,50, res)=1 then grid.Cells[2,i]:='Работает' else grid.Cells[2,i]:='Не отвечает';

end;
function TMainForm.OfficialCPUSpeed:string;

var reg:TRegistry;

begin

reg:=tregistry.Create;

reg.RootKey:=HKEY_LOCAL_MACHINE;

reg.OpenKey('hardware\description\system\centralprocessor\0',false);

OfficialCPUSpeed:=inttostr(reg.readinteger('~mhz'))+' Mhz';

reg.CloseKey;

reg.Destroy;

end;
function TMainForm.CurrentProcessorSpeed:string;

var TimerHi, TimerLo: DWORD;

Res:double;

PriorityClass, Priority: integer;

begin

application.ProcessMessages ;

PriorityClass := GetPriorityClass(GetCurrentProcess);

Priority := GetThreadPriority(GetCurrentThread);

SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);

SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

Sleep(10);

asm

dw 310Fh // rdtsc

mov TimerLo, eax

mov TimerHi, edx

end;

Sleep(500);

asm

dw 310Fh // rdtsc

sub eax, TimerLo

sbb edx, TimerHi

mov TimerLo, eax

mov TimerHi, edx

end;

SetThreadPriority(GetCurrentThread, Priority);

SetPriorityClass(GetCurrentProcess, PriorityClass);

Res := TimerLo / (1000.0 * 500);

CurrentProcessorSpeed:= Format(' %f MHz', [res]);

end;
function TMainForm.getpriority(id:THandle):string;

var hproc:THandle;

priority:cardinal;

h:byte;

begin

h:=0;

hproc:=OpenProcess(PROCESS_ALL_ACCESS,false,id);

priority:=GetPriorityClass(hproc);

if priority=IDLE_PRIORITY_CLASS then begin h:=1; getpriority:='Низкий';end;

if priority=NORMAL_PRIORITY_CLASS then begin h:=1; getpriority:='Средний';end;

if priority=HIGH_PRIORITY_CLASS then begin h:=1; getpriority:='Высокий';end;

if priority=REALTIME_PRIORITY_CLASS then begin h:=1;getpriority:='Абсолютный';end;

if h<>1 then getpriority:='Средний';

CloseHandle(hproc);

end;
procedure TMainForm.processinfotogrid(procinfogrid:TStringGrid);

var hsnap: Thandle;

procentry: TProcessEntry32;

k:byte;

begin

k:=1;

hsnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);

procentry.dwSize:=sizeof(procentry);

Process32First(hsnap,procentry);

repeat

with procinfogrid do

begin

if k>rowcount-1 then

rowcount:=rowcount+1;

cells[0,k]:=procentry.szexefile;

cells[1,k]:=inttostr(procentry.th32ProcessID);

cells[2,k]:=inttostr(procentry.cntThreads);

cells[3,k]:=GetPriority(procentry.th32processid);

end;

k:=k+1;

until Process32Next(hsnap,procentry)<>true;

if k<procinfogrid.RowCount then procinfogrid.RowCount:=k;

CloseHandle(hsnap);

end;
function TMainForm.killproc(id:THandle):boolean;

var hproc:THandle;

m:boolean;

begin

hproc:=OpenProcess(PROCESS_ALL_ACCESS,false,id);

m:=TerminateProcess(hproc,0);

if m=false then killproc:=false else killproc:=true;

CloseHandle(hproc);

end;
procedure TMainForm.setpriority(id:THandle;prclass:Cardinal);

var hproc:THANDLE;

begin

hproc:=OpenProcess(PROCESS_ALL_ACCESS,false,id);

SetPriorityClass(hproc,prclass);

CloseHandle(hproc);

end;
function TMainForm.ThrCount(procinfogrid:TStringGrid):word;

var k:word;

i:byte;

begin

k:=0;

for i:=1 to procinfogrid.RowCount-1 do

k:=k+strtoint(procinfogrid.cells[2,i]);

thrcount:=k;

end;
procedure Tmainform.showmembtnClick(Sender: TObject);

var memstat:tmemorystatus;

begin

memstat.dwLength := SizeOf(MemStat);

GlobalMemoryStatus(MemStat);

with memStat do begin

physmemload.Caption :=Format('%0.3f ',[(dwTotalPhys-dwAvailPhys) div 1024 /1024]);

physmemall.Caption := Format('%0.3f ',[dwTotalPhys div 1024 / 1024]);

physmemava.Caption := Format('%0.3f ',[dwAvailPhys div 1024 / 1024]);

virtmemall.Caption := Format('%0.3f ',[dwTotalPageFile div 1024 / 1024]);

virtmemava.Caption := Format('%0.3f ',[dwAvailPageFile div 1024 / 1024]);

virtmemload.Caption:= Format('%0.3f ',[(dwTotalPageFile-dwAvailPageFile) div 1024 /1024]);


end;
end;
procedure TMainForm.CurrentInfo;

begin

application.ProcessMessages;

processinfotogrid(processlist);

AppInfoToGrid(applist);

processcount.caption:=inttostr(processlist.rowcount-1);

flowscount.Caption:=inttostr(thrcount(processlist));

cpuspeed.Caption:=' '+OfficialCPUSpeed;

WindowNotWorking(applist);

end;
function AddWinInfo(WinHandle: HWnd; list:TStringList): Boolean;

stdcall;

var WinCaption: array[0..255] of Char;

begin

Result:=True;

if isWindowVisible(WinHandle) then

if GetWindow(WinHandle,GW_OWNER)=0 then

begin

GetWindowText(WinHandle,WinCaption,SizeOf(WinCaption));

if (WinCaption<>'') then

List.Add(inttostr(WinHandle));

end;

end;
procedure TMainForm.AppInfoToGrid(grid:TStringGrid);

var descript:TStringList;

WinCaption:array[0..255] of char;

i:word;
begin

descript:=TStringList.Create;

with descript do

begin

Clear;

EnumWindows(@AddWinInfo,LParam(descript));

end;

for i:=0 to descript.Count-1 do

begin

if i+1>grid.RowCount-1 then grid.RowCount:=grid.RowCount+1;

GetWindowText(strtoint(descript.strings[i]),WinCaption,SizeOf(WinCaption));

grid.Cells[0,i+1]:=WinCaption;

grid.Cells[1,i+1]:=descript.strings[i];

end;

if grid.RowCount>i+1 then grid.RowCount:=i+1;

descript.Destroy;

end;
function TMainForm.killtaskfunc:boolean;

var hproc:THandle;

id:Cardinal;

begin

GetWindowThreadProcessId(strtoint(applist.Cells[1,applist.row]),id);

hproc:=OpenProcess(PROCESS_ALL_ACCESS,false,id);

if TerminateProcess(hproc,0) then Result:=true else Result:=false;

applist.RowCount:=applist.RowCount-1;

closehandle(hproc);

end;
procedure Tmainform.FormCreate(Sender: TObject);

begin

EnablePrivilege(true,'SeDebugPrivilege');

EnablePrivilege(true,'SeShutdownPrivilege');

pagecontrol.ActivePageIndex:=0;

with applist do

begin

cells[0,0]:='Задача';

cells[1,0]:='ID';

cells[2,0]:='Состояние'

end;

with processlist do

begin

cells[0,0]:='Процесс';

cells[2,0]:='Кол-во потоков';

cells[3,0]:='Приоритет';

end;

CurrentInfo;

end;
procedure Tmainform.killprocessbtnClick(Sender: TObject);

var ok:boolean;

begin

ok:=killproc(strtoint(processlist.Cells[1,processlist.Row]));

if ok=false then MessageBox(mainform.Handle,'Невозможно завершение данного процесса','Ошибка',MB_OK);

processlist.RowCount:=processlist.RowCount-1;

end;
procedure Tmainform.realtimeClick(Sender: TObject);

begin

setpriority(strtoint(processlist.Cells[1,processlist.row]),REALTIME_PRIORITY_CLASS);

end;
procedure Tmainform.TimerTimer(Sender: TObject);

begin

processinfotogrid(processlist);

CurrentInfo;

end;
procedure Tmainform.killappbtnClick(Sender: TObject);

begin

if killtaskfunc=false then MessageBox(mainform.Handle,'Не возможно снять задачу!','Ошибка',0);

end;
procedure Tmainform.newbtnClick(Sender: TObject);

begin

NewTaskForm.showmodal;

end;
end.

    1. Скриншоты




Рис.7. При запуске приложения Рис.8. Приложение в работе




Рис.9. Обновление данных Рис.10. Повторное обновление данных
    1. ^

      Результаты прогонов контрольного примера


В результате нескольких прогонов контрольного примера, ошибок в работе приложения выявлено не было. Каждый раз при запуске приложения при нажатии на кнопку отображалось состояние физической и виртуальной памяти, а при повторных нажатиях на кнопку – обновлялось. При сравнении с диспетчером задач Windows разницы в значениях состояния той или иной памяти выявлено не было.
    1. ^

      Статистика разработки приложения


На разработку приложения потребовалось – в среднем 4 часа, на тестирование программы – примерно 1 час.

Написание отчета заняло чуть больше 2-х часов.


Скачать файл (279.5 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации