尝试在模拟的 OS 内存管理器中显示 "map" 分配的内存

Trying to display a "map" of allocated memory in a simulated OS memory manager

多个客户端正在向服务器发送作业名称和内存请求。服务器充当内存管理器,并使用分页作为其内存分配方案为尽可能多的客户端分配内存。我正在使用 FIFO 进行客户端-服务器通信。

我遇到的问题是在处理完所有客户端之后,我想在服务器端显示已分配内存的映射。换句话说,我想显示 what frames 已分配给 what 客户

以下是我的服务器应用程序的一部分。我还附上了一些可能有助于理解问题的输出。一切都按预期工作,直到程序结束(它打印出分配给每个客户端的帧;[=46 上的最后一个 for 循环=])。 clientsAllocation 数组是保存每个客户端的私有 FIFO 名称的数组。我试图将已分配帧的索引(在 allocatedFrames 数组中)指定为客户端的 privateFIFOName。我不确定为什么这不起作用。预先感谢您的帮助。

任何答案都应该是可移植的。我必须能够使用 cygwin-gcc 编译器在 UNIX 机器上 运行 这段代码。我正在 Windows 上测试代码,因为它是我的主要机器。每次更改代码时,我都会使用 PuTTY 连接到我大学的 UNIX 机器,并确保代码 运行s 也在那里。

server.c

...//include statements

#define FRAMESIZE 256
#define MAX_LENGTH_FIFO_NAME 16
#define MAX_LENGTH_JOB_NAME 32
#define MAX_LENGTH_MESSAGE 256

int main(void)
{
    int numOfClients = 0; //total number of clients this server will process
    int totalNumOfFrames = 0; //total number of frames in memory
    int frames = 0; //copy of numOfFrames used to allocate frames for client

    //Struct to recieve from client
    struct
    {
        char jobName[MAX_LENGTH_JOB_NAME];
        char privateFIFOName[MAX_LENGTH_FIFO_NAME];
        int memoryRequest;
    }input;

    //Struct to send to client containing the calculated frames and the fragmentation
    struct
    {
        char message[MAX_LENGTH_MESSAGE];
        int fragmentation;
        int totalNumOfFrames;
        int frameNumbers[totalNumOfFrames];
    }output;

    ... //getting input from user and doing error checking

    int allocatedFrames[totalNumOfFrames]; //an array of "flags" that will keep track whether a frame is allocated or not
    char* clientsAllocation[totalNumOfFrames]; //an array to keep track of what frames are allocated to what client

    memset(allocatedFrames, 0, sizeof(allocatedFrames)); //make sure all values in the array are set to 0 to prevent random values
    memset(clientsAllocation, 0, sizeof(clientsAllocation));

    int i = 0;
    int j = 0;

    for (i; i < numOfClients; i++)
    {
        if (input.memoryRequest >= FRAMESIZE && input.memoryRequest <= memoryLeft)
        {
            ...
            frames = 0;

            if (framesLeft >= numOfFrames)
            {
                j = 0;
                while (frames < numOfFrames)
                {
                    for (j; j < totalNumOfFrames; j++)
                    {
                        if (allocatedFrames[j] == 0) //if the value at j is 0, then this is an empty frame and can be allocated
                        {
                            allocatedFrames[j] = 1; //switch the value to 1 in both arrays
                            output.frameNumbers[j] = 1;
                            clientsAllocation[j] = input.privateFIFOName; //keep track of what frames this client was allocated
                            printf("%d: %s\n", j, clientsAllocation[j]);
                            printf("SERVER:> Frame Allocated: %d\n", j);
                            break; //breaks out of this 'for' loop which should only be run as many times as there are frames to be allocated
                        }
                    }
                    frames++; //increment the temporary frames variable to keep track of how many times to run the for loop
                }

                ... //calculations on framesLeft and memoryLeft
            }
            //if it is not a valid request, (i.e. requesting more frames than are available)
            else
            {
                ... //some error printing
            }
        }
        else if (...)... //range checking but the code is very similar to above
    }

    i = 0;
    for (i; i < totalNumOfFrames; i++)
    {
        printf("%d: %s\n", i, clientsAllocation[i]);
    }
    printf("\n\n");

    return 0;
}

您始终将相同的缓冲区地址分配给客户端名称数组中当前使用的条目。

clientsAllocation[j] = input.privateFIFOName;

您可以通过在输入结构中给出 char 数组的 name/identifier 来做到这一点。
它被视为指向 char 的指针并分配给 clientsAllocation.

中所有使用的条目

所以最后,打印的时候,所有的指针都指向同一个数组char
你会得到一个相同名字的列表,是最后一个写入缓冲区的。

为避免这种情况,您可以为每个名称 malloc() 一些内存,并通过字符串复制用当前名称填充它。

当然,你应该在某个时候释放那些分配的内存。
对于简单的演示程序,打印后释放似乎是合适的。