Здравствуйте Гость [ Вход | Регистрация ] | Форум в сети 6726-й день

Шановні користувачі! Запрошуємо вас до офіційного телеграм-канала 0day Community. Тут ви зможете поспілкуватися одне з одним та дізнатися про останні новини щодо роботи ресурса, поставити запитання до адміністрації, тощо. Перейти до телеграм-канала можна відсканувавши QR-код або натиснувши на посилання: @zeroday_ua

 Нужна помощь в написании программы, Системное программирование

Yarik-Jedi
Apr 26 2006, 20:29
  
Пост #1

Благодарности: 20186

Репутация:   892  
Lightsaber Expert
****

Группа: Пользователи
Сообщений: 2 583
С нами с: 16-March 06


Аллокатор памяти общего назначения

Задание на работу
~~~~~~~~~~~~~~~~~

1. Выделить блок памяти любым доступным способом. По необходимости
можно выделить ещё один блок памяти (намного меньшего размера).

2. Разработать набор функций, которые будут выполнять перечисленные
ниже действия в пределах адресов выделенного блока памяти.

3. При разработке функций использовать только арифметические операции
и операции работы с указателями. Любую память можно выделять только
внутри выделенного блока памяти.

Описание функций
~~~~~~~~~~~~~~~~

Значение аргументов:

addr -- это адрес первого байта выделенной памяти;

size -- это размер выделенной памяти в байтах.

Перечень функций и их свойств, разрешается использовать только
приведенные аргументы:

void *mem_alloc(size_t size);
выделить память заданного размера size, если памяти нет,
то вернуть NULL.

void *mem_realloc(void *addr, size_t size);
изменить размер памяти по адресу addr до size, вернуть новый
адрес памяти, если размер изменить нельзя, то оставить память
по адресу addr без изменения и вернуть NULL.

void mem_free(void *addr);
вернуть память, выделенную по адресу addr.

Адреса памяти, возвращаемые функциями mem_alloc() и mem_realloc()
должны быть выровнены на 4 байта.


Примечания
~~~~~~~~~~

В задании приведены прототипы функций на языке C, в которых (void *) это
указатель, size_t это целочисленный беззнаковый тип, void обозначает
отсутствие возвращаемого значения, NULL некоторый адрес, который
не может иметь ни один блок памяти. Работу можно выполнить на любом
языке.

В первом пункте задания говорится "выделить блок памяти любым доступным
способом", это означает, что память можно выделить любой функцией
типа malloc(), sbrk(), mmap() или задать массивом необходимого размера.

Если память выделена функциями mem_alloc() или mem_realloc(), то
то её нельзя переносить куда либо до вызова mem_free() или mem_realloc(),
если mem_realloc() вернула другой адрес.

===================================================================

Вот собствеенно такая муть. Если есть желающие помочь (и, возможно, повысить свою квалификацию :rolleyes: ) - пишите. В принципе ничего сложного тут нет. Язык С/C++ (но лучше Java или Pascal(Delphi).

P.S. Естественно не за 'спасибо'. wink.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов(1 - 11)
Olostan
Apr 26 2006, 23:15
  
Пост #2

Благодарности: 4

Репутация:   5  
Дух


Группа: Пользователи
Сообщений: 49
С нами с: 11-March 06


Когда-то очень давно я делал для какого-то америкоса по заказу на РентАКодере нечто подобное, но только на чистом С (задача была - не использовать никаких ф-ций кроме выделения памяти).

Если интересует - могу _попытаться_ найти. Пиши в аську.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Andrej
Apr 28 2006, 22:29
  
Пост #3



Репутация:   20  
Дух


Группа: Пользователи
Сообщений: 120
С нами с: 7-April 06


Есть готовый самописный (в прошлом семестре на дисциплине Операционные системы писал) менеджер памяти (язык C). Все три функции в нём реализованы, отлажены и оттестированы. работают как часы wink.gif
Могу выложить код прямо здесь. Или как будет удобнее по-другому?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Yarik-Jedi
May 6 2006, 20:54
  
Пост #4

Благодарности: 20186

Репутация:   892  
Lightsaber Expert
****

Группа: Пользователи
Сообщений: 2 583
С нами с: 16-March 06


(Andrej @ Apr 28 2006, 23:29) Перейти к цитате

Есть готовый самописный (в прошлом семестре на дисциплине Операционные системы писал) менеджер памяти (язык C). Все три функции в нём реализованы, отлажены и оттестированы. работают как часы wink.gif
Могу выложить код прямо здесь. Или как будет удобнее по-другому?


Куда ты пропал? sad.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Andrej
May 6 2006, 21:18
  
Пост #5



Репутация:   20  
Дух


Группа: Пользователи
Сообщений: 120
С нами с: 7-April 06


(Yarik-Jedi @ May 6 2006, 22:54) Перейти к цитате

Куда ты пропал? sad.gif

Чуть не забыл)) Я просто сообщение глянул, но так как времени отправлять не было, отложил это дело на следующий вечер. И забыл... :-[ Высылаю.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Andrej
May 6 2006, 21:28
  
Пост #6



Репутация:   20  
Дух


Группа: Пользователи
Сообщений: 120
С нами с: 7-April 06


На всякий случай продублирую здесь.
  
// *****************************************************************************
//! \file   My_alloc.c
//! \brief  Realizaciya menedjera pamyati
//! \author Lysenko A.A. SPb ETU gr. 3352
//! \date   08.Dec.2005 - 08.Dec.2005
// *****************************************************************************

#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>

// =============================================================================
// struktura upravleniya blokom pamyati
struct BlockInfo
{
   unsigned char bOccupied; // flag zanyatosti / svobodnosti
                            //          1            0
   size_t        nSize;     // razmer bloka
};

static void* FirstBlock;       // ukazatel' na pervy'y blok pamyati
static void* FirstFree;        // ukazatel' na pervy'y svobodny'y blok pamyati
static char  InitFlag = 0;     // flag inicializacii menedjera

const size_t MAX_MEMORY_SIZE = 0x100000; // 1 MB

// =============================================================================
// INICIALIZAROVAT'' MENEDJER PAMYATI
void MallocInit()
{
   InitFlag = 1;
   FirstFree = FirstBlock = malloc(MAX_MEMORY_SIZE);
   struct BlockInfo* pt = (struct BlockInfo*)FirstFree;
   pt->bOccupied = 0;
   pt->nSize = MAX_MEMORY_SIZE - sizeof(struct BlockInfo);
}

// =============================================================================
// OSVOBODIT'' VY'DELENNY'Y BLOK PAMYATI
void mfree(void* block)
{
   if ( (!block) || (!InitFlag) ) { return;}
   struct BlockInfo* ptCur = block - sizeof(struct BlockInfo);
   ptCur->bOccupied = 0;
   // ESLI SLEDUYUSCH'IY BLOK SVOBODEN - OB``EDENIT'' V ODIN
   struct BlockInfo* ptNext = block + ptCur->nSize;
   // ESLI PAMYATI BOLSHE NET
   if ( ptNext != (FirstBlock + MAX_MEMORY_SIZE) )
   {
      if (!ptNext->bOccupied)
      {
         ptCur->nSize += (ptNext->nSize + sizeof(struct BlockInfo));
      }
   }
   // PEREMESTIT'' UKAZATEL'' NA PERVY'Y SVOBODNY'Y BLOK, ESLI NUJNO
   if (!FirstFree)
   {
      FirstFree = ptCur;
   }
   else if ((void*)ptCur < FirstFree)
   {
      FirstFree = ptCur;
   }
}

// =============================================================================
// VY'DELIT'' BLOK PAMYATI
void* mmalloc(size_t size)
{
   // INICIALIZIROVAT'' MENEDJER
   if (!InitFlag){ MallocInit(); }
   // PROVERIT'', EST'' LI SVOBODNAYA PAMYAT''
   if (!FirstFree)
   {
      return NULL;
   }
   else
   {
      struct BlockInfo* ptBlock = (struct BlockInfo*)FirstFree;
      char allocated = 0;
      while (!allocated)
      {
         if (!ptBlock->bOccupied)
         {
            if (ptBlock->nSize >= size)
            {
               ptBlock->bOccupied = 1;
               size_t tail = ptBlock->nSize - size;
               ptBlock->nSize = size;
               // ESLI OSTAVSHEYSYA PAMYATI NE HVATAET DLYA BlockInfo - "OTDAE'M EE' POL''ZOVATELYU"
               if (tail < sizeof(struct BlockInfo))
               {
                  ptBlock->nSize += tail;
               }
               else
               {
                  struct BlockInfo* ptFree = (void*)ptBlock + ptBlock->nSize
                                             + sizeof(struct BlockInfo);
                  ptFree->bOccupied = 0;
                  ptFree->nSize = tail - sizeof(struct BlockInfo);
               }
               // SFORMIROVAT'' UKAZATEL'', KOTORY'Y VOZVRASCH'EM POL''ZOVATELYU
               ptBlock = (void*)ptBlock + sizeof(struct BlockInfo);
               allocated = 1;
            }
         }
         if (allocated)
         {
            // PEREMESTIT'' UKAZATEL'' NA PERVY'Y SVOBODNY'Y BLOK, ESLI NUJNO
            if ( ((void*)ptBlock - sizeof(struct BlockInfo)) == FirstFree )
            {
               struct BlockInfo* ptFree = (struct BlockInfo*)FirstFree;
               while (ptFree)
               {
                  if (!ptFree->bOccupied)
                  {
                     FirstFree = (void*)ptFree;
                     ptFree = NULL;
                     continue;
                  }
                  // ESLI ESCH'E' NE VSYA PAMYAT'' PROSMOTRENA, PEREYTI K SLEDUYUSCH'EMU BLOKU
                  if ( ((void*)ptFree + ptFree->nSize + sizeof(struct BlockInfo))
                     != (FirstBlock + MAX_MEMORY_SIZE) )
                  {
                     ptFree = (void*)ptFree + ptFree->nSize + sizeof(struct BlockInfo);
                  }
                  else
                  {
                     // INACHE FirstFree BUDET NULL
                     FirstFree = ptFree = NULL;
                  }
               }
            }
         }
         else
         {
            // ESLI ESCH'E' NE VSYA PAMYAT'' PROSMOTRENA, PEREYTI K SLEDUYUSCH'EMU BLOKU
            if ( ((void*)ptBlock + ptBlock->nSize + sizeof(struct BlockInfo))
                  != (FirstBlock + MAX_MEMORY_SIZE) )
            {
               ptBlock = (void*)ptBlock + ptBlock->nSize + sizeof(struct BlockInfo);
            }
            else
            {
               // INACHE VERNUT'' NULL
               ptBlock = NULL;
               allocated = 1;
            }
         }
      }
      return (void*)ptBlock;
   }
}

// =============================================================================
// PEREVY'DELIT'' BLOK PAMYATI
void* mrealloc(void* block, size_t size)
{
   // ESLI block == NULL, deystvuem, kak mmalloc()
   if ( (block == NULL) || (!InitFlag) )
   {
      return mmalloc(size);
   }

   struct BlockInfo* ptBlock = (block - sizeof(struct BlockInfo));
   // ESLI NUJNO UMEN''SHIT'' RAZMER PAMYATI
   if (ptBlock->nSize > size)
   {
      size_t tail = ptBlock->nSize - size;
      ptBlock->nSize = size;
      // ESLI OSTAVSHEYSYA PAMYATI NE HVATAET DLYA BlockInfo - "OTDAE'M EE' POL''ZOVATELYU"
      if (tail < sizeof(struct BlockInfo))
      {
         ptBlock->nSize += tail;
      }
      else
      {
         struct BlockInfo* ptFree = (void*)ptBlock + ptBlock->nSize
                                    + sizeof(struct BlockInfo);
         ptFree->bOccupied = 1;
         ptFree->nSize = tail - sizeof(struct BlockInfo);
         ptFree = (void*)ptFree + sizeof(struct BlockInfo);
         mfree(ptFree);
      }
      return block;
   }
   else if (ptBlock->nSize == size)
   {
      // KOMU-TO NECHEGO DELAT''
      return block;
   }
   else
   {
      struct BlockInfo* ptNext = (block + ptBlock->nSize);
      // ESLI PAMYATI BOLSHE NET
      if ( ptNext == (FirstBlock + MAX_MEMORY_SIZE) )
      {
         return NULL;
      }
      // RYADOM EST'' SVOBODNY'Y PODHODYASCH'IY BLOK
      if ( (!ptNext->bOccupied) &&
           ((ptBlock->nSize + ptNext->nSize + sizeof(struct BlockInfo)) >= size) )
      {
         size_t tail = ptBlock->nSize + ptNext->nSize + sizeof(struct BlockInfo)
                       - size;
         ptBlock->nSize = size;
         // ESLI OSTAVSHEYSYA PAMYATI NE HVATAET DLYA BlockInfo - "OTDAE'M EE' POL''ZOVATELYU"
         if (tail < sizeof(struct BlockInfo))
         {
            ptBlock->nSize += tail;
         }
         else
         {
            struct BlockInfo* ptFree = (void*)ptBlock + ptBlock->nSize
                                       + sizeof(struct BlockInfo);
            ptFree->bOccupied = 1;
            ptFree->nSize = tail - sizeof(struct BlockInfo);
            ptFree = (void*)ptFree + sizeof(struct BlockInfo);
            mfree(ptFree);
         }
         return block;
      }
      else
      {
         ptNext = (struct BlockInfo*)mmalloc(size);
         // ESLI UDALOS'' VY'DELIT'' NOVY'Y BLOK, UDALYAEM PEREDANNY'Y
         if (ptNext)
         {
            mfree(block);
            return ptNext;
         }
         // INACHE PEREDANNY'Y OSTAE'TSYA BEZ IZMENENIY
         else
         {
            return NULL;
         }
      }
   }
}

// =============================================================================
// O4ISTIT' VES' MASSIV PAMYATI - "UBORKA MUSORA"
void MallocUninit()
{
   InitFlag = 0;
   free(FirstBlock);
}

Если вдруг что-то в коде не ясно, спрашивай.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Yarik-Jedi
May 10 2006, 1:59
  
Пост #7

Благодарности: 20186

Репутация:   892  
Lightsaber Expert
****

Группа: Пользователи
Сообщений: 2 583
С нами с: 16-March 06


Большое спасибо. Попробую сдать, если получится. :rolleyes:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Rumata
May 10 2006, 16:58
  
Пост #8

Благодарности: 72

Репутация:   26  
Благородный дон


Группа: Пользователи
Сообщений: 199
С нами с: 18-March 06
Меценат


Эх, позновато пишу, но лучше поздно, чем никогда smile.gif
Вам что, на полном серьезе предлагают с использованием Java выделить вполне определенный блок памяти по заданному адресу? wink.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Andrej
May 10 2006, 17:22
  
Пост #9



Репутация:   20  
Дух


Группа: Пользователи
Сообщений: 120
С нами с: 7-April 06


(Yarik-Jedi @ May 10 2006, 3:59) Перейти к цитате

Большое спасибо. Попробую сдать, если получится. :rolleyes:

Пожалуйста.
Можно и в репутацию килограмчик накинуть drinks.gif
Должно получится - я сдал вообще без проблем d.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Yarik-Jedi
May 11 2006, 18:18
  
Пост #10

Благодарности: 20186

Репутация:   892  
Lightsaber Expert
****

Группа: Пользователи
Сообщений: 2 583
С нами с: 16-March 06


(Rumata @ May 10 2006, 17:58) Перейти к цитате

Эх, позновато пишу, но лучше поздно, чем никогда smile.gif
Вам что, на полном серьезе предлагают с использованием Java выделить вполне определенный блок памяти по заданному адресу? wink.gif


Нам сказали написать на любом языке программирования, но сказали, что лучше всего это на С сделать. Но поскольку я с ним очень слабо дружу, для лучшего понимания хотелось бы на Delphi/Java. :rolleyes:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Rumata
May 11 2006, 18:34
  
Пост #11

Благодарности: 72

Репутация:   26  
Благородный дон


Группа: Пользователи
Сообщений: 199
С нами с: 18-March 06
Меценат


(Yarik-Jedi @ May 11 2006, 19:18) Перейти к цитате

Нам сказали написать на любом языке программирования, но сказали, что лучше всего это на С сделать. Но поскольку я с ним очень слабо дружу, для лучшего понимания хотелось бы на Delphi/Java. :rolleyes:

В Java память для основных типов данных (boolean, char, byte, short, etc.) выделяется исключительно в стеке, а для объектов (экземпляров классов) -- в куче (при этом, как правило, единым блоком она не выделяется).
Выделение памяти -- прерогатива виртуальной машины, и у программиста нет возможности управлять этим процессом.

Сообщение отредактировал Rumata - May 11 2006, 18:38
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Andrej
May 11 2006, 21:09
  
Пост #12



Репутация:   20  
Дух


Группа: Пользователи
Сообщений: 120
С нами с: 7-April 06


"лучше всего это на С сделать"
Это сказали правильно. Для работы с памятью (а менеджер памяти это оно и есть) C - то что доктор прописал. Delpi(Pascal) я использовал последний раз уж очень давно, так что даже и не берусь судить, как там с этим делом, но какая-то прямая работа с памятью там точно есть.

Когда искал материал для лабы, все примеры были только на C.
Вобщем, когда сдашь, напиши, как всё прошло))
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic

 



- Упрощённая версия
Сейчас: 13th August 2024 - 23:40
Сайт не розміщує електронні версії творів, а займається лише колекціонуванням та каталогізацією посилань, що публікуються нашими користувачами. Якщо Ви є правовласником якоїсь частини опублікованого матеріалу та не бажаєте, щоб посилання на нього знаходилось в нашому каталозі, зв’яжіться з нами і ми видалимо його. Файли для обміну надані користувачами сайту і адміністрація не несе відповідальності за їх вміст.