Blog Detail

  • 页表、地址重定位、地址保护的名词解释

    页表、地址重定位、地址保护的名词解释

    页表:我的解答:

    页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。 每一个进程都拥有一个自己的页表,PCB表中有指针指向页表。

    老师的解答:

    反映程序的逻辑页号和内存的物理块号映射关系的表。

    地址重定位:我的解答:

    地址重定位指把目标程序中的逻辑地址转换成主存空间的物理地址。 其计算方法为:物理地址(PA)= 块号×页长+页内地址。

    老师的解答:

    把用户空间的逻辑地址转换成实际主存空间的物理地址的过程。

    地址保护:我的解答:

    保护模式同实模式的根本区别是进程内存受保护与否。可寻址空间的区别只是这一原因的果。实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问。

    老师的解答:

    对用户程序、操作系统等地址空间的管理,防止程序间的代码保护。

    每天一道算法题

    最长连续不重复子序列给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

    输入格式

    第一行包含整数 n。

    第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。

    输出格式

    共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。

    数据范围

    1≤n≤105

    输入样例:

    5

    1 2 2 3 5

    输出样例:

    3

    提交代码

    代码语言:javascript复制#include

    using namespace std;

    const int N = 100010;

    int a[N], s[N];

    int n, res;

    int main()

    {

    cin >> n;

    for (int i = 0; i < n; ++ i) cin >> a[i];

    for (int i = 0, j = 0; i < n; ++ i)

    {

    s[a[i]] ++; // 记录下a[i]出现的次数

    while(s[a[i]] > 1) // 一点碰见两个重复的元素后

    {

    s[a[j]] --; // 这里要主要的一点是这个算法是没有回溯的

    // 不要被for循环里面的条件误导以为会回溯、

    // 现在遇到两个相同的元素了

    // !!! 现在是这个算法最厉害的地方

    // 这个j代表的是 j可以到达最左的地方 所以在j左边的

    // 元素的个数就需要都-- 这点很妙

    // 每次求的是 j到i之间的符合条件的最大值

    j ++; // 然后j++

    }

    res = max(res, i - j + 1); // 这个res的含义是 在i这个位置、

    // 可以达到的符合题目条件的最大长度

    }

    cout << res;

    return 0;

    }代码语言:javascript复制import java.io.*;

    import java.util.*;

    public class Main

    {

    public static void main(String[] args) throws IOException{

    Scanner in = new Scanner(System.in);

    int n = in.nextInt();

    int [] a = new int [n + 10];

    int [] s = new int [n + 10];

    int res = 0;

    for (int i = 0; i < n; ++ i) a[i] = in.nextInt();

    for (int i = 0, j = 0; i < n; ++ i)

    {

    s[a[i]] ++;

    while(s[a[i]] > 1)

    {

    s[a[j]] --;

    j ++;

    }

    res = Math.max(res, i - j + 1);

    }

    System.out.println(res);

    }

    }