我试图了解多级页表如何节省内存.根据我的理解,多级页表总共消耗比单级页表更多的内存.
示例:考虑页面大小为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
因此我们需要更多内存来存储多级页表.
如果是这种情况,多级页表如何节省内存空间?
我很想知道哪种算法更好:
在O(n long n)时间和恒定空间中求解的大多数算法可以在O(n)时间内通过在空间方面支付罚分来求解.哪种算法更好?我如何决定这两个参数?
示例:数组对总和
当我对任意两个数字进行异或时,我得到的是它们的差值或总和的绝对值。我在谷歌上搜索了很多,试图找到任何相关的公式。但对此没有明显的公式或陈述。
例子:
10 XOR 2 = 1010 XOR 10 = 1000(8)
1 XOR 2 = 01 XOR 10 = 11(3)
Run Code Online (Sandbox Code Playgroud)
所有数字都是如此吗?
字面上混淆了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) 通过浏览shmget()的手册页,我知道shmget()调用会在内存中分配页面,这些页面可以跨进程共享.
是否要创建内核内存页面,该页面映射到进程的本地地址空间?或者它是为该段保留的相同进程内存页面,同样也将为其他附加进程共享?
我的假设:当调用shmget()时,内核将保留段数/页面数.调用shmat()时,保留的段将映射到进程的地址空间/页面.当新进程附加到同一段时,先前创建的内核segemnt将映射到新进程地址空间.
它是否正确 ?
我正在使用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) 有没有更好的方法在恒定时间内生成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)