小编Ani*_*K K的帖子

多级页表如何节省内存空间?

我试图了解多级页表如何节省内存.根据我的理解,多级页表总共消耗比单级页表更多的内存.

示例:考虑页面大小为64KB且32位处理器的内存系统.页表中的每个条目都是4个字节.

单级页表:表示页面偏移需要16(2 ^ 16 = 64KB)位.所以休息16位用于索引到页表.所以

*页面大小= 2 ^ 16(页数)*4字节(每页表项的大小)= 2 ^ 18字节*

多级页表:在两级页表的情况下,让我们使用前10个最高位来索引到第一级页表.接下来10位索引到第二级页表,其具有页码到帧号映射.其余12位表示页面偏移量.

第二级页表的大小= 2 ^ 10(条目数)*4字节(每个条目的大小)= 4 KB

所有二级页表的总大小= 2 ^ 10(二级页表的数量)*4KB(每个二级页表的大小)= 4 MB

第一级页表的大小= 2 ^ 10(条目数)*(10/8)字节(每个条目的大小)= 1.25 KB

存储第一级和第二级页表所需的总内存= 4 MB + 1.25 KB

因此我们需要更多内存来存储多级页表.

如果是这种情况,多级页表如何节省内存空间?

memory paging operating-system virtual-memory page-tables

37
推荐指数
2
解决办法
4万
查看次数

具有O(n log n)时间和O(1)空间复杂度与O(n)时间和O(n)空间复杂度的算法

我很想知道哪种算法更好:

  • 具有O(n log n)时间和O(1)空间复杂度的算法
  • 具有O(n)时间和O(n)空间复杂度的算法

在O(n long n)时间和恒定空间中求解的大多数算法可以在O(n)时间内通过在空间方面支付罚分来求解.哪种算法更好?我如何决定这两个参数?

示例:数组对总和

  1. 可以通过排序在O(n logn)时间内解决
  2. 可以在O(n)时间使用散列映射来解决,但是使用O(n)空间

algorithm runtime time-complexity space-complexity

15
推荐指数
2
解决办法
2308
查看次数

按位异或两个数字会得到数字的和或差

当我对任意两个数字进行异或时,我得到的是它们的差值或总和的绝对值。我在谷歌上搜索了很多,试图找到任何相关的公式。但对此没有明显的公式或陈述。

例子:

10 XOR 2 = 1010 XOR 10 = 1000(8)
 1 XOR 2 =   01 XOR 10 =   11(3)
Run Code Online (Sandbox Code Playgroud)

所有数字都是如此吗?

algorithm bit-manipulation xor

7
推荐指数
2
解决办法
7589
查看次数

是否htonl()改变了BIG ENDIAN机器上的字节顺序?

字面上混淆了htonl().在这么多链接中,我发现执行htonl的代码是:

#define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
                  ((((unsigned long)(n) & 0xFF00)) << 8) | \
                  ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
                  ((((unsigned long)(n) & 0xFF000000)) >> 24))
Run Code Online (Sandbox Code Playgroud)

如果在两台机器上运行相同的代码,它将交换字节顺序.示例:uint32_t a = 0x1;

在Little Endian:

地址值

100   1
101   0
102   0
103   0
Run Code Online (Sandbox Code Playgroud)

在htonl之后(a)

地址值

100   0
101   0
102   0
103   1
Run Code Online (Sandbox Code Playgroud)

============================================ 在Big Endian机器上:

地址值

100   0
101   0
102   0
103   1
Run Code Online (Sandbox Code Playgroud)

在htonl之后(a)

地址值

100   1
101   0
102   0
103   0 …
Run Code Online (Sandbox Code Playgroud)

c byte-order-mark endianness

7
推荐指数
2
解决办法
4805
查看次数

共享内存:shmget()/共享内存如何工作?

通过浏览shmget()的手册页,我知道shmget()调用会在内存中分配页面,这些页面可以跨进程共享.

是否要创建内核内存页面,该页面映射到进程的本地地址空间?或者它是为该段保留的相同进程内存页面,同样也将为其他附加进程共享?

我的假设:当调用shmget()时,内核将保留段数/页面数.调用shmat()时,保留的段将映射到进程的地址空间/页面.当新进程附加到同一段时,先前创建的内核segemnt将映射到新进程地址空间.

它是否正确 ?

linux posix memory-management shared-memory

7
推荐指数
1
解决办法
532
查看次数

即使对于第一次调用中的UDP消息,recvfrom()也不会填充来自IP地址

我正在使用recvfrom()将UDP数据报放入我的缓冲区并传递非NULL的from_addr结构和len参数,期望它获取源IP.但是对于第一次调用,它们是NULL.后续调用正在填充addr结构和len字段.这是预期的吗?

#include <stdio.h>
#include <string.h>

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>


int
main()
{
    struct  sockaddr_in myaddr, from_addr;
    char    from_ip[1024] = "", myip[2014] = "";
    char    rmsg[1024 * 1024] = "";
    int     sock_fd=-1,nbytes=0;
    int     len=0;
    unsigned short port=0;

    sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock_fd == -1)
    {
        perror("Socket");
        return -1;
    }

    printf("IP Addr & Port to bound to :");
    scanf("%s%u", myip, &port);

    myaddr.sin_family = AF_INET;
    myaddr.sin_port = htons(port);
    inet_pton(AF_INET, myip, &myaddr.sin_addr);

    printf("Bound to %s:%u\n", myip, htons(port));

    nbytes = bind(sock_fd, &myaddr, …
Run Code Online (Sandbox Code Playgroud)

c sockets udp udpclient

4
推荐指数
1
解决办法
3083
查看次数

生成8位唯一随机数

有没有更好的方法在恒定时间内生成8位唯一随机数?

下面的实现返回8位唯一随机数,但复杂度为O(n = 256),因为它必须循环通过is_generated[]数组,直到它生成一个先前未生成的数组.它还需要额外的空间is_generated.

uint8_t
random_octate(void)
{   
    static bool     is_generated[256] = {false};
    uint32_t        num = rand()%256;

    while(is_generated[num])
    {
        num = rand() % 256;
    }

    is_generated[num] = true;
    return num;
}
Run Code Online (Sandbox Code Playgroud)

c random algorithm data-structures

0
推荐指数
1
解决办法
865
查看次数