Я работаю над проектом C, целью которого является управление блоками памяти с помощью функций динамического распределения памяти, таких как realloc и malloc и сохраните их состояние в файле с именемblock.dat. Блок основной памяти (который представляет общий объем доступной памяти) хранится в этом файле, и его следует перезаписывать каждый раз, когда процессам выделяется больше блоков памяти. При выделении памяти размер основного блока следует уменьшить и добавить новые блоки, представляющие память, выделенную процессам.
Ожидаемый результат:
Когда я выделяю память процессу, я стремлюсь:
[*]Уменьшить размер основного блока.
[*] Создайте новый блок, представляющий память, назначенную процессу.
[*]Сохраните обновленное состояние памяти в файле block.dat.
Ожидаемое содержимое файла block.dat после выделения памяти процессу должно выглядеть следующим образом:
Код: Выделить всё
Name: MainBlock
Size: 6000000 bytes
State: Free
Block 1:
Name: Block1
Size: 2000000 bytes
Process assigned: Process_2
State: Occupied
[code]init_block[/code] функция для инициализации основного блока:
Код: Выделить всё
void init_block(MemoryBlock **memory, int *used_blocks) {
*memory = (MemoryBlock *)malloc(sizeof(MemoryBlock)); // Reserve space for the memory block
(*memory)->size = 8000000; // Initialize the main block with 8 MB
(*memory)->free = 1; // Block is free
strcpy((*memory)->name, "MainBlock");
strcpy((*memory)->process, "None"); // No process assigned
*used_blocks = 0; // No blocks assigned yet
// Save the initial state of the block to the block.dat file
save_block_state(*memory, *used_blocks);
printf("Memory initialized:\nName: %s\nSize: %d bytes\nState: Free\n", (*memory)->name, (*memory)->size);
}
Функция для сохранения состояния блочной памяти:
Код: Выделить всё
void save_block_state(MemoryBlock *memory, int used_blocks) {
FILE *file = fopen("block.dat", "w"); // Open the file in write mode
if (file == NULL) {
perror("Error opening block.dat");
return;
}
// Save the main block
fprintf(file, "Name: %s\n", memory[0].name);
fprintf(file, "Size: %d bytes\n", memory[0].size);
fprintf(file, "State: %s\n", memory[0].free ? "Free" : "Occupied");
// Save the assigned blocks
for (int i = 1; i name);
fscanf(file, "Size: %d bytes\n", &(*memory)->size);
char state[10];
fscanf(file, "State: %s\n", state);
(*memory)->free = (strcmp(state, "Free") == 0) ? 1 : 0;
// Read the assigned blocks
int block_index = 0;
while (fscanf(file, "Block %d:\n", &block_index) == 1) {
(*memory) = (MemoryBlock *)realloc(*memory, (block_index + 1) * sizeof(MemoryBlock));
char block_name[50];
int block_size;
char process_name[50];
// Read the block data
fscanf(file, "Name: %s\n", block_name);
fscanf(file, "Size: %d bytes\n", &block_size);
fscanf(file, "Process assigned: %s\n", process_name);
fscanf(file, "State: Occupied\n");
// Assign the read data to the block
(*memory)[block_index - 1].size = block_size;
strcpy((*memory)[block_index - 1].name, block_name);
strcpy((*memory)[block_index - 1].process, process_name);
(*memory)[block_index - 1].free = 0;
}
*used_blocks = block_index;
fclose(file);
}
[code]assign_block[/code] реализация выделения блоков памяти:
Код: Выделить всё
void assign_block(MemoryBlock **memory, int *used_blocks) {
//Helper function that executes get a list of process
get_total_process();
printf("Total available memory in the main block: %d bytes\n", (*memory)[0].size);
FILE *file = fopen("processes.dat", "r");
if (file == NULL) {
perror("Error opening processes.dat");
return;
}
printf("Processes available for memory assignment:\nProcess | Memory Usage\n");
printf("--------------------------\n");
char line[256];
int process_index = 1;
while (fgets(line, sizeof(line), file)) {
printf("(%d) %s", process_index, line);
process_index++;
}
fclose(file);
int process_choice;
printf("Enter the number corresponding to the process to assign the memory block to: ");
scanf("%d", &process_choice);
int block_size;
printf("How many bytes of memory do you want to assign to the selected process?: ");
scanf("%d", &block_size);
if (block_size > (*memory)[0].size) {
printf("Error: Not enough memory in the main block.\n");
return;
}
(*memory)[0].size -= block_size;
*memory = (MemoryBlock *)realloc(*memory, (*used_blocks + 2) * sizeof(MemoryBlock));
MemoryBlock *new_block = &(*memory)[*used_blocks + 1];
new_block->size = block_size;
new_block->free = 0;
sprintf(new_block->name, "Block%d", *used_blocks + 1);
sprintf(new_block->process, "Process_%d", process_choice);
(*used_blocks)++;
save_block_state(*memory, *used_blocks);
printf("Assigned %d bytes to Process_%d.\n", block_size, process_choice);
printf("Remaining size in MainBlock: %d bytes\n", (*memory)[0].size);
}
[code]main[/code], реализующий Assign_block:
Код: Выделить всё
int main() {
MemoryBlock *memory = NULL;
int used_blocks = 0;
// Load the memory state from block.dat
load_block_state(&memory, &used_blocks);
// Assign a block to a process
assign_block(&memory, &used_blocks);
// Show the current memory state
show_mem_status(memory, used_blocks);
// Free allocated memory
free(memory);
return 0;
}
Проблема, с которой я столкнулся, заключается в том, что когда я пытаюсь назначить блок памяти процессу, вместо создания новый блок для процесса, похоже, что основной блок (
Код: Выделить всё
MainBlock
Код: Выделить всё
Name: MainBlock
Size: 2000000 bytes
State: Occupied
Код: Выделить всё
--------------------------------------------------------------------------------
Name: MainBlock
Size: 2000000 bytes
State: Occupied
--------------------------------------------------------------------------------
Код: Выделить всё
Name: MainBlock
Size: 6000000 bytes
State: Free
Block 1:
Name: Block1
Size: 2000000 bytes
Process assigned: Process_2
State: Occupied
Мой вопрос:
Как я могу изменить свою реализацию, чтобы предотвратить перезапись основного блока и вместо этого правильно добавить новый блок для каждого назначенного процесса?
Подробнее здесь: https://stackoverflow.com/questions/790 ... riting-the