Sistemas Operativos. Gestão de memória no Windows NT

Documentos relacionados
Gestão de Memória algoritmos e políticas

Sumário. Estruturas de suporte à paginação Entrada de tabela de páginas Visão geral da tradução de um endereço virtual

Gestão de memória - Memory Management Unit (MMU)

Algoritmos de Gestão de Memória

Gestão de memória - Memory Management Unit (MMU)

Por dentro do Windows: Gerenciamento de Memória

Memória virtual. Sistemas de Computação

Organização de um Sistema Operativo

Sistemas Operativos. Sincronização de threads com objectos kernel no Windows. Centro de Cálculo Instituto Superior de Engenharia de Lisboa

Input/Output. Acesso síncrono e assíncrono. Jorge Martins (jmartins@isel.pt) Centro de Cálculo Instituto Superior de Engenharia de Lisboa

Capítulo 8: Memória Principal. Operating System Concepts 8 th Edition

Memória. Gestão do espaço lógico Paginação Segmentação com paginação

7 Mecanismos de gestão de memória. Prof. Ricardo Silva

CreateFile para obter identificador (handle) CloseHandle - para fechar o identificador. DeviceIOControl para efectuar a comunicação propriamente dita.

Arquitectura de Computadores

Gerência de memória III

Memoria. UNIVERSIDADE DA BEIRA INTERIOR Faculdade de Engenharia Departamento de Informática

Sistemas operacionais P A G I N A Ç Ã O D E M E M Ó R I A

INE5412 Sistemas Operacionais I

Hierarquia de memória

Sistemas Operacionais: Memória Virtual

Memória Virtual. Paulo Sérgio Almeida. Grupo de Sistemas Distribuídos Departamento de Informática Universidade do Minho

Features. 3 rd Generation Processor 386. Intel Register Set Operating Modes.

Sumário. Sistemas Operativos 1

Sistemas de Memória III

Capítulo 8: Gestão de Memória

Gerência de Memória. Gerência de memória. Conceitos Básicos. Conceitos Básicos. Conceitos Básicos. Memória: UCP. Unidade de controle

Gestão de Memória. mecanismos de gestão de memória protecção da memória algoritmos de gestão de memória. P. Ferreira/J. A. Marques - INESC/IST 01/02 1

Organização e Arquitetura de Computadores I

Introdução. Introdução aos Sistemas Operacionais Volnys Bernal. Sumário. Introdução aos Sistemas Operacionais. Sobre esta apresentação

Memória Cache: Funcionamento

Gerenciamento de Memória

Introdução. Introdução aos Sistemas Operacionais Volnys Bernal. Agenda. Introdução aos Sistemas Operacionais. Sobre estes slides

Sistemas Operacionais Memória Virtual

Gerência de Memória. Gerência de Memória Virtual. Gerência de Memória. Gerência de Memória. Gerência de Memória. Gerência de Memória 17/04/2017


Sistemas Operativos. Gestão de memória. Rui Maranhão

ORGANIZAÇÃO DE COMPUTADORES CAPÍTULO4: MEMÓRIAPRINCIPAL

13 de Maio de Aula 17

Capítulo 9: Memória Virtual. Operating System Concepts 8 th Edition

Espaço de Endereçamento

Aula 16: Memória Principal e Memória Virtual

Administração de Memória

Sistemas Operativos. Multiprogramação; Multiplexação; Memória Física; Memória virtual; Trabalho/Job - Processo/Process/Task - Thread

Introdução aos Sistemas Operacionais

LINGUAGEM C: ALOCAÇÃO DINÂMICA

Capítulo Sistemas de Memória Memória Virtual. Ch7b 1

Sistemas Operativos. Introdução. Slides adaptados dos slides do professor Jorge Martins. Centro de Cálculo Instituto Superior de Engenharia de Lisboa

Aula 16: Memória Principal e Memória Virtual

Gerenciamento de memória

AULA 14 - Memória Virtual

Boot, BIOS, Bootloader

Arquitetura de Sistemas Operacionais

Sistemas Operacionais II Unix: Memória e E/S. Geraldo Braz Junior

Introdução. Introdução aos Sistemas Operacionais Volnys Bernal. Agenda. Introdução aos Sistemas Operacionais. Sobre esta apresentação

Caching. Caches do Sistema de Ficheiros

Gerenciamento de memória

Sistemas Operacionais. Rodrigo Rubira Branco

Memória virtual. Sistemas Segmentados

Gerência da Memória. Adão de Melo Neto

Capítulo 9: Memória Virtual. Operating System Concepts 8th Edition

Função Fundamental do SO

Capítulo 9: Memória Virtual

UFRJ IM - DCC. Sistemas Operacionais I. Unidade III Memória Virtual. Prof. Antonio Carlos Gay Thomé Prof. Aux. Simone Markenson Pech 1

Aula 21 Ordenação externa

Arquitetura de Computadores. Memórias

Capítulo 6 Nível do Sistema Operacional

Hierarquia de Memória

Memória Cache. Adriano J. Holanda. 12 e 16/5/2017

Sistemas de Operação

Gerência de Memória. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 45

Sistemas de Ficheiros

PCS-2529 Introdução aos Processadores. Prof. Dr. Paulo Sérgio Cugnasca

Universidade Federal de Campina Grande Departamento de Sistemas e Computação Curso de Bacharelado em Ciência da Computação.

Universidade Federal de Campina Grande Departamento de Sistemas e Computação Curso de Bacharelado em Ciência da Computação.

Memórias Semicondutoras

Gerência de Memória. Paginação

Memória partilhada em Unix SysV

Processos. Nuno Ferreira Neves Faculdade de Ciências de Universidade de Lisboa. Fernando Ramos, Nuno Neves, Sistemas Operativos,

Reserva de memória não-contígua significa que a memória atribuída a um objecto pode ser composta de bocados espalhados pela memória física.

5 de Maio de Aula 15

EA075 Memória virtual

TI SO do Ponto de Vista do Programador de Aplicações

Introdução aos Sistemas Operacionais. Subsistema de Arquivos

Gerência de Memória. Alocação

Gerenciamento de Memória

SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar

Lista Encadeada (Linked List)

Programação Procedimental GBC /1 Prof. Renan Cattelan Prática 10. Estruturas e alocação dinâmica

Gerenciamento de memória Memória Virtual

EL68E Sistemas Embarcados Prof. Douglas RENAUX

5.2 - Armazenamento em Disco

ecos - Gestores de dispositivos

A API Win32 dos Sistemas Operativos Windows Alguns aspectos

Capítulo 11 Sistemas de Arquivos

É um sinal elétrico periódico que é utilizado para cadenciar todas as operações realizadas pelo processador.

Gerenciamento de Memória

LISTA DE EXERCÍCIOS 02

Organização e Arquitetura de Computadores I

Transcrição:

Sistemas Operativos Gestão de memória no Windows NT Windows Internals, Russinovich, cap. 9, Memory Management Windows Via C/C++, Richter, cap. 13, cap. 14. MSDN, http://msdn.microsoft.com/en-us/library/aa366779(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/ms684884(v=vs.85).aspx Centro de Cálculo Instituto Superior de Engenharia de Lisboa João Pedro Patriarca (jpatri@cc.isel.ipl.pt)

Layout da área de sistema 0x80000000 NTLDR loads the kernel, HAL, and boot drivers here. The kernel then relocates the drivers to the system PTE area. Additional system PTEs, system cache, or special pool 0xFFFFFFFF System mapped views Session space Page tables Hyperspace and process working set lists System cache structures System cache Start of paged system area System PTE area Nonpaged system area Crash dump driver area Reserved for HAL usage bib: Windows Internals, fig. 9-10, Russinovich 2

Lista de frames na base de dados PFN (Page Frame Number) PFN array de estruturas que representam as frames da memória principal Estados das frames Active (valid) Transition Standby Modified Modified no-write Free Zeroed Rom Bad As frames Bad, Active e Transition não estão em nenhuma lista Zeroed Free Standby Bad Read only Modified Modified no-write PFN Database Active Active Active. : bib: Windows Internals, fig. 9-38, Russinovich 3

Diagrama de estados das Page Frames Page read from disk or kernel allocations Demand-zero page faults Standby page list Proccess working sets Soft page faults Modified page writer Free page list Zero page thread Zero page list Working set replacement Modified page list bib: adatpado Windows Internals, fig. 9-39, Russinovich 4

Relação entre Page Tables e Page Frame Number Database Process 1 Page Table Valid Invalid: disk address Invalid: transition. : PFN Database In use Standby list Process 2 Page Table Valid Invalid: disk address Valid. : Prototype PTE In use In use Process 3 Page Table Invalid Invalid: transition Invalid: disk address. : Modified list. : bib: adaptado do livro Windows Internals, fig. 9-37, Russinovich 5

Copy-on-write Optimização com o intuito de preservar a memória física A secção.data de uma dll pode ser marcada como COPY_ON_WRITE Na primeira escrita é criada uma nova página privada marcada como Read/Write para o processo que promoveu a escrita Passos: A excepção gerada é apanhada e o gestor de memória verifica se se trata de uma página marcada como COPY_ON_WRITE Em vez de reportar a excepção como um acesso de violação aloca uma página Read/Write na memória física copia a página original para a nova página actualiza a informação de mapeamento da página executa novamente a instrução que provocou a excepção a nova execução e respectiva escrita já terá sucesso Cada processo que promova uma escrita na página obterá a sua própria cópia privada 6

Working set Carregamento Demand Paging com clustering (pre-paging). São carregadas em antecipação entre 1 a 8 páginas na vizinhança da página em falta Substituição As políticas do Windows NT tem como objectivo manter (em situações de escassez de memória) o conjunto de páginas físicas de cada processo (resident set) o mais possível próximo do seu working set. Baseiam-se na existência de limites (dinâmicos) que especificam o mínimo e máximo working set do processo. Uma thread a executar em modo kernel, denominada de Balance Set Manager, percorre periodicamente (em cada segundo) os espaços de endereçamento de cada processo (começando dos antigos e grandes até aos novos e pequenos) Primeiro, os limites mínimo e máximo dos working sets de cada processo são ajustados de acordo com o número de page faults que ocorreram no processo Depois disso são percorridas as tabelas que mapeiam o espaço de endereçamento do processo. Para cada página, se esta não tiver marcada como acedida, é incrementando um contador, associado à página. Caso contrário é feito reset ao respectivo bit, e o contador é colocado a zero Em caso de necessidade (se houver poucas page frames livres) são libertadas páginas do processo que não tenham sido acedidas há mais tempo (aquelas cujo contador está acima de determinado threshold) - variante local do algoritmo Clock bib: Slides Jorge Martins, Gestão de memória no Windows NT 7

Informação sobre memória no Task manager Memória RAM disponível para OS e aplicações Somatório das listas standby e modified Memória utilizável de imediato: somatório listas standby, free e zeroed Somatório das listas free e zeroed Total/máximo de memória committed (incluindo Paging files) 8

Subsistema Windows Windows API GetSystemInfo VOID WINAPI GetSystemInfo(LPSYSTEM_INFO psi); Kernel32.dll, Windows.h typedef struct _SYSTEM_INFO { union { DWORD dwoemid; struct { WORD wprocessorarchitecture; WORD wreserved; }; } DWORD dwpagesize; LPVOID lpminimumapplicationaddress; LPVOID lpmaximumapplicationaddress; DWORD_PTR dwactiveprocessormask; DWORD dwnumberofprocessors; DWORD dwprocessortype; DWORD dwallocationgranularity; WORD wprocessorlevel; WORD wprocessorrevision; } SYSTEM_INFO, *LPSYSTEM_INFO; Windows Data Types: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx 9

Subsistema Windows Windows API GlobalMemoryStatusEx Kernel32.dll, Windows.h BOOL WINAPI GlobalMemoryStatusEx(LPMEMORYSTATUSEX pmst); typedef struct _MEMORYSTATUS { DWORD dwlength; // sizeof (this) DWORD dwmemoryload; // [0..100] DWORDLONG ulltotalphys; // Max byte in RAM - Nonpage DWORDLONG ullavailphys; DWORDLONG ulltotalpagefile; // Max bytes in hard disk DWORDLONG ullavailpagefile; DWORDLONG ulltotalvirtual; // Max privates bytes for a process DWORDLONG ullavailvirtual; // Specific to self process DWORDLONG ullavailextendedvirtual; } MEMORYSTATUSEX, *LPMEMORYSTATUSEX; 10

Subsistema Windows Windows API GetPerformanceInfo BOOL WINAPI GetPerformanceInfo( _Out_ PPERFORMANCE_INFORMATION pperformanceinformation, _In_ DWORD cb ); typedef struct _PERFORMANCE_INFORMATION { DWORD cb; SIZE_T CommitTotal; SIZE_T CommitLimit; SIZE_T CommitPeak; SIZE_T PhysicalTotal; SIZE_T PhysicalAvailable; SIZE_T SystemCache; SIZE_T KernelTotal; SIZE_T KernelPaged; SIZE_T KernelNonpaged; SIZE_T PageSize; DWORD HandleCount; DWORD ProcessCount; DWORD ThreadCount; } PERFORMANCE_INFORMATION, *PPERFORMANCE_INFORMATION; Kernel32.dll, Windows.h 11

Subsistema Windows Windows API GetProcessMemoryInfo BOOL GetProcessMemoryInfo( HANDLE hprocess, PPROCESS_MEMORY_CONTERS ppmc, DWORD cbsize ); Psapi.dll, Psapi.h Deve ter direitos de acesso PROCESS_QUERY_INFORMATION e PROCESS_VM_READ typedef struct _PROCESS_MEMORY_COUNTERS_EX { DWORD cb; DWORD PageFaultCount; SIZE_T PeakWorkingSetSize; SIZE_T WorkingSetSize; SIZE_T QuotaPeakPagedPollUsage; SIZE_T QuotaPagedPoolUsage; SIZE_T QuotaPeakNonPagedPoolUsage; SIZE_T QuotaNonPagedPoolUsage; SIZE_T PagefileUsage; SIZE_T PeakPagefileUsage; SIZE_T PrivateUsage; } PROCESS_MEMORY_COUNTERS_EX, *PPROCESS_MEMORY_COUNTERS_EX; 12

GetSystemInfo GlobalMemoryStatusEx GetPerformanceInfo GetProcessMemoryInfo Apresenta informação global do sistema (3 primeiras funções) De 1 em 1 segundo apresenta ProcessMemoryInfo 13

Alocação de memória / Espaços de endereçamento virtual Reserved Aloca região com dimensão quase sempre múltipla de 64 KB Campo dwallocationgranularity da estrutura SYSTEM_INFO Endereço base da região alocada alinhado com a dimensão de uma página Em termos de modelo de dados interfere nas VADs apenas (não são criadas PTEs) Qualquer acesso gera violação de acesso Usado na gestão do espaço que um stack ocupa em memória Committed Aloca região com granularidade igual à dimensão da página Pode alocar sobre uma região reservada Em termos de modelo de dados interfere nas PTEs A página é alocada na memória principal apenas no primeiro acesso Free Não estão incluídas em nenhum nó da árvore de VADs 14

Virtual Address Descriptors (VADs) Range: 20000000 through 2000FFFF Protection: Read/Write Inheritance: Yes Range: 00002000 through 0000FFFF Protection: Read-only Inheritance: No Range: 4E000000 through 4F000000 Protection: Copy-on-write Inheritance: Yes Range: 32000000 through 3300FFFF Protection: Read-only Inheritance: No Range: 7AAA0000 through 7AAA00FF Protection: Read/Write Inheritance: No bib: Windows Internals, fig. 9-32, Russinovich 15

Page Faults Razões para Page Faults Acesso a página que não está residente em memória principal mas presente em disco Acesso a página presente nas listas standby ou modified Acesso a página não presente na PT Acesso a página kernel a partir de user Escrita numa página read-only Acesso a uma demand-zero page Escrita numa página guard page Escrita numa página copy-on-write Escrita numa página válida mas que ainda não foi escrita para o seu backing store Executa código numa página marcada como não executável Consequências do Page Fault Aloca uma frame e lê a página do disco ( hard page fault) Coloca a página como válida actualizando a PTE do processo ( soft page fault) Violação de acesso Violação de acesso Violação de acesso Adiciona uma página com zeros ao working set Violação guard page (se acesso ao user stack expande-o) Copia a página para uma página privada ao processo Coloca a 1 o bit dirty da PTE Violação de acesso (apenas presente em plataformas que suportem protecção de execução) 16

Subsistema Windows Windows API VirtualAlloc alocação de memória virtual LPVOID WINAPI VirtualAlloc( LPVOID pvaddress, SIZE_T dwsize, DWORD fdwallocationtype, DWORD fdwprotect ); BOOL WINAPI VirtualFree( LPVOID pvaddress, SIZE_T dwsize, DWORD dwfreetype ); Kernel32.dll, Windows.h pvaddress: endereço virtual base onde se pretende alocar a região A função retorna 0 caso não exista espaço livre para a região especificada NULL caso não seja relevante a localização da região fdwallocationtype: MEM_RESERVE [MEM_TOP_DOWN*] MEM_COMMIT Usadas em OR para reservar e commit na mesma chamada A função VirtualAlloc retorna NULL em caso de insucesso dwfreetype: MEM_DECOMMIT MEM_RELEASE: pvaddress igual ao endereço retornado pelo VirtualAlloc dwsize igual a 0 * pvaddress must be NULL 18

Atributos de protecção de uma Page Atributos de protecção PAGE_NOACCESS PAGE_READONLY PAGE_READWRITE PAGE_EXECUTE PAGE_EXECUTE_READ PAGE_EXECUTE_READWRITE PAGE_WRITECOPY PAGE_EXECUTE_WRITECOPY PAGE_NOCACHE, PAGE_WRITECOMBINE, PAGE_GUARD Descripção (violação nos acessos) Leitura, escrita e execução Escrita e execução Execução Leitura e escrita Escrita Nunhuma violação Violação na execução; Na escrita, o sistema cria cópia privada com atributos read/write para o processo Nenhuma violação; Na escrita, o mesmo de cima Podem ser combinados (OR bit a bit) com os anteriores excepto PAGE_NOACCESS PAGE_GUARD: one time shot for writes 19

VirtualAlloc Observar com o VMMap o estado das páginas nas diferentes fases do programa: Após reserva de um bloco Após commited de uma página Após acesso de escrita 20

Subsistema Windows Windows API VirtualQuery estado de uma região de páginas DWORD WINAPI VirtualQuery( LPCVOID pvaddress, PMEMORY_BASIC_INFORMATION pmbi, DWORD dwlength); DWORD WINAPI VirtualQueryEx(HANDLE hprocess,...); Kernel32.dll, Windows.h typedef struct _MEMORY_BASIC_INFORMATION { PVOID BaseAddress; PVOID AllocationBase; DWORD AllocationProtect; SIZE_T RegionSize; DWORD State; // MEM_FREE, MEM_RESERVE, MEM_COMMIT DWORD Protect;// PAGE_* (campo válido no estado MEM_COMMIT) DWORD Type; // MEM_IMAGE, MEM_MAPPED, MEM_PRIVATE } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; 21

VirtualQuery Aplicação consola equivalente à ferramenta VMMap baseado no VirtualQueryEx 22

Subsistema Windows Windows API QueryWorkingSet estado da(s) página(s) de um processo BOOL WINAPI QueryWorkingSet( _In_ HANDLE hprocess, _Out_ PVOID pv, _In_ DWORD cb ); Kernel32.dll, Windows.h typedef struct _PSAPI_WORKING_SET_INFORMATION { ULONG_PTR NumberOfEntries; PSAPI_WORKING_SET_BLOCK WorkingSetInfo[1]; } PSAPI_WORKING_SET_INFORMATION, *PPSAPI_WORKING_SET_INFORMATION; typedef union _PSAPI_WORKING_SET_BLOCK { ULONG_PTR Flags; struct { ULONG_PTR Protection :5; ULONG_PTR ShareCount :3; ULONG_PTR Shared :1; ULONG_PTR Reserved :3; ULONG_PTR VirtualPage :20; }; } PSAPI_WORKING_SET_BLOCK, *PPSAPI_WORKING_SET_BLOCK; 23

QueryWorkingSet A definir 24

Mapeamento de ficheiros no espaço de endereçamento do processo 25

Subsistema Windows Windows API (passo 1) Mapeamento de dispositivos ficheiro CreateFile Retorna INVALID_HANDLE_VALUE (-1) em vez de NULL em caso de erro HANDLE WINAPI CreateFile ( PCTSTR hfile, DWORD dwdesiredaccess, DWORD dwsharemode, PSECURITY_ATTRIBUTES psa, DWORD dwcreationdisposition, DWORD dwflagsandattributes, HANDLE htemplatefile); GetFileSizeEx SetFilePointerEx Synchronous Device I/O ReadFile WriteFile FlushFileBuffers CancelSynchronousIo 0 GENERIC_READ GENERIC_WRITE GENERIC_READ GENERIC_WRITE Kernel32.dll, Windows.h 0 FILE_SHARE_READ FILE_SHARE_WRITE FILE_SHARE_READ FILE_SHARE_WRITE CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING, OPEN_ALWAYS, TRUNCATE_EXISTING FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ENCRYPTED, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, FILE_ATTRIBUTE_OFFLINE, FILE_ATTRIBUTE_READONLY. FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_TEMPORARY 26

Subsistema Windows Windows API (passo 2) Memory Mapped Files HANDLE WINAPI CreateFileMapping( HANDLE hfile, PSECURITY_ATTRIBUTES psa, DWORD fdwprotect, DWORD dwmaximumsizehigh, DWORD dwmaximumsizelow, PCTSTR pszname); Forma para associar ficheiros presentes em disco no espaço de endereçamento de um processo Mapear um ficheiro em disco no espaço de endereçamento local Carregar em memória ficheiros EXE e DLLs Kernel32.dll, Windows.h PAGE_READONLY (GENERIC_READ) PAGE_READWRITE (GENERIC_READ GENERIC_WRITE) PAGE_WRITECOPY (GENERIC_READ ou GENERIC_READ GENERIC_WRITE) PAGE_EXECUTE_READ (GENERIC_READ e GENERIC_EXECUTE) PAGE_EXECUTE_READWRITE (GENERIC_READ, GENERIC_WRITE e GENERIC_EXECUTE) Partilha de memória entre vários processos (na ausência de ficheiro) As páginas removidas da memória principal são mantidas no ficheiro em disco 27

Subsistema Windows Windows API (passo 3) Mapeamento de uma vista do ficheiro MapViewOfFile Kernel32.dll, Windows.h PVOID WINAPI MapViewOfFile ( HANDLE hfilemappingobject, DWORD dwdesiredaccess, DWORD dwfileoffsethigh, DWORD dwfileoffsetlow, DWORD dwnumberofbytestomap); FILE_MAP_WRITE (PAGE_READWRITE), FILE_MAP_READ (PAGE_READONLY ou PAGE_READWRITE), FILE_MAP_ALL_ACCESS (o OR de todos excepto EXECUTE), FILE_MAP_COPY (PAGE_WRITECOPY), FILE_MAP_EXECUTE (PAGE_EXECUTE_READWRITE ou PAGE_EXECUTE_READ) Realiza a reserva e commit no espaço de endereçamento do processo para uma vista do ficheiro 28

Subsistema Windows Windows API (passos 4, 5 e 6) Libertação de memória e dos objectos criados BOOL WINAPI UnmapViewOfFile ( PVOID pvbaseaddress); Especiais cuidados se a vista foi mapeada com o atributo FILE_MAP_COPY Forçar a escrita em disco BOOL WINAPI FlushViewOfFile ( PVOID pvaddress, SIZE_T dwnumberofbytestoflush); Valor obtido na chamada MapViewOfFile Kernel32.dll, Windows.h CloseHandle( HANDLE h ); Usado para fechar um objecto kernel (objectos obtidos por CreateFile e CreateFileMapping) A ordem de chamada é indiferente e pode acontecer antes da chamada de UnmapViewOfFile 29

CreateFile CreateFileMapping MapViewOfFile Demo com o atributo de acesso FILE_MAP_COPY Exemplo de utilização: leitura das últimas mensagens adicionadas a um ficheiro de logs (exercício no Lab 2) 30

Bibliografia Windows Via C/C++, Richter, cap. 13, cap. 14. MSDN, http://msdn.microsoft.com/en-us/library/ee663300(v=vs.85).aspx 31