关于操作系统的几个常被问的问题

在32位x86体系 32位linux内核下

1.地址映射由谁来完成?
内核(GDT LDT PD PT)-硬件(MMU)
MMU完成从线性地址到物理地址的映射
这里写图片描述
这里写图片描述

2.为什么说32位的Linux 的逻辑地址和虚拟地址是一样的?
逻辑地址 + 段基址 = 虚拟地址
如果一样的话,那就说明基地址为0.那么为什么基地址会为0?原因是在进行地址映射的时候,分页的效率明显高于分段,但是由于继承x86体系,进行假分段,所以需要保存之前的分段,但实质对分段只是进行了从0地址开辟了4G的空间,实质并未完成什么任务。只要cpu跟内存交互就会进行地址映射。

3.什么是进程?(进程有什么?具备了就是进程)
1.进程得有代码指令(正在运行的程序)
2.PCB(进程控制块)
3.独立的用户空间(占用资源)
4.独立的内核栈(调用系统API进行用户态和内核态的切换时,就是切换的指针,也就是切换内核栈,内核栈不是共享的,内核空间是独立的)

4.什么叫做线程?
这里写图片描述
Windows下,线程是进程的执行流,一个进程有一个或多个线程。
没有内核线程,windows的最小单位是进程。
Linux下,线程和进程之间并无明显区别,最小单位是任务(task_strut)。线程和进程都各自有独立的进程控制块和内核栈。线程没有独立的用户空间则为内核态线程,如果有独立的用户空间,共享别的进程,则是用户态线程。没有内核进程,只有内核线程。

5.加速地址映射的方式?
TLB存放最近使用的页目录,页表(深入理解计算机第9章)
离MMU越近,映射速度越快

6.地址映射的方式只有一种?
内核空间的映射方式:虚拟地址 – offset (0x1000)=物理地址
用户空间的映射方式是页目录,页表的映射
用户空间和内核空间的地址映射不同

7.32位Linux是如何管理内存的?
每一个页面 struct _page
页表中存放物理页面的序号
页表中的第0位(present)判断页面是活动的还是在swap分区中
这里写图片描述
页表中的高20位存放物理页面,低12位均为0,物理页面是从0地址开始,物理页面的地址刚好是页框号。0 1 2 3 4

6.换页算法:
LRU (交换的用户空间)最近最久未使用
脏页需要被交换,在切换的过程中会产生页面抖动,但是概率不大,很少有一段代码占用两页,为延缓页面抖动需要建立缓存,
这里写图片描述
所以Linux 中最多有4090个进程

7.进程切换:
这里写图片描述

8.内核中开辟堆内存:kmalloc 和 vmalloc有什么区别?
1)kmalloc和vmalloc分配的是内核的内存,malloc分配的是用户的内存
2)kmalloc保证分配的内存在物理上是连续的, kmalloc()分配的内存在0xBFFFFFFF-0xFFFFFFFF以上的内存中,driver一般是用它来完成对DS的分配,更适合于类似设备驱动的程序来使用;
vmalloc保证的是在虚拟地址空间上的连续,vmalloc()则是位于物理地址非连续,虚地址连续区,起始位置由VMALLOL_START来决定,一般作为交换区、模块的分配。
3)kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大(因为vmalloc还可以处理交换空间)。
4)内存只有在要被DMA访问的时候才需要物理上连续,vmalloc比kmalloc要慢
5)vmalloc使用的正确场合是分配一大块,连续的,只在软件中存在的,用于缓冲的内存区域。不能在微处理器之外使用。
6.vmalloc 中调用了 kmalloc (GFP—KERNEL),因此也不能应用于原子上下文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计内容: 进程死锁的检测:资源分配图的化简判断是否有死锁发生 设计要求: •建立所需的数据结构。 •从文件中读取资源分配的情况(文件格式自定义)。 •编写资源分配图的化简算法。 •每化简一步,在屏幕上显示化简的当前结果。 •最后给出结论,是否死锁。如果死锁,给出死锁进程和资源。 设计思路: 程序中主要涉及两个方面:进程、资源。两者通过占有和申请发生联系。因此对于每一个进程Pi,建立“占有”和“申请”的数据结构来保存与之相关联的资源(由于事先不知道进程拥有和申请的资源数,故用Vector作为数据结构)。同时记录下程序处理的总的进程数目和资源数目。对于资源,另建立两个数组res和work分别记录第i类资源的总数和当前可用数。 从文件中读入资源和进程的情况时,要进行一些判断。①处理的资源和进程数目不得超过500(500已满足当前实际机器的情况)。②资源及进程的编号不得超过相应的数目也不得小于0。③资源的起始值不应该小于0。 ④起始情况下,所有进程拥有的第i资源总数不应该比其总的资源数目还要多。 由于在理论上已经证明,化简的次序不影响化简的最终结果。所以化简的过程就是不停的寻找满足条件(此进程所申请的资源全部都可以满足)的进程进行化简(即把它拥有的资源加到work数组中),直到不再能找到这样的进程为止。然后检查所有的进程,如果仍有未被化简的进程,则表明死锁已经产生。此时记录下发生死锁的进程编号。然后,为进一步明确哪些进程在哪些资源上发生死锁,给定一个进程入口点采用DFS搜索和次进程相关的所有进程。 为了能在每一步化简后显示当前进程资源的状况,定义了两个画图函数。一个是根据当前资源和进程的“占有”和“申请”状况,画出整体的资源分配图。另一个是在每次化简掉一个进程时删除和它相关的所有边。 程序在VC++6.0中调试、验收通过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值