【C++】作业【四】笔试|函数传参|进程状态|分页式存储|内存泄露|makefile程序编译链接|队列和栈|ARM异常|数据库|黑白盒测试|extern C|按值地址引用传递区别|交换机路由器|进程

1.数组能通过值参数,地址参数和引用参数三种方式传递给函数。

 

2.进程状态

三态模型:运行态,就绪态,阻塞态

舞台模型:新建态,终止态,运行态,就绪态,阻塞态

3.函数定义时,函数体内不能包含另一个函数的定义,即函数不能嵌套定义

 

4.操作系统的分页式存储管理

为什么要使用页表存储:

学过操作系统的都知道,在操作系统中存在一个虚拟内存的概念,它用于内存的管理,使得应用程序认为它有一段连续的内存,大大地简化了程序员码代码的难度。程序员只用关注在这个连续的虚拟内存段中怎么使用内存,不用关心在物理内存中到底用那一段内存,进程运行的时候操作系统会自动进行映射。操作系统是怎么做到的呢?实际上操作系统为每一个进程维护了一个从虚拟地址到物理地址的映射关系的数据结构,叫页表,页表的内容就是该进程的虚拟地址到物理地址的一个映射。

基本概念:

  • 页(Page):进程的逻辑地址空间划分为大小相等的块,且块相对比较小,每个块称为一页(Page),由页号和页内地址组成。
  • 帧(PageFrame):将物理内存空间也划分为同样大小的块,每个块称为一页面(帧)(页框)(物理页)(块)。

我搞了半天好不容易搞懂这个概念,因为网上Page和PageFrame的中文真的什么都有。。。。

地址结构:

每页(或帧)里面包含的才是真正的地址,在得到页码(帧号)之后,再通过页内偏移(或帧内偏移),也就是页偏移(帧偏移)来找到相应的地址。所以每个逻辑地址(物理地址)的表示方法是 页码(帧号)+页偏移量(帧偏移量)。

分页系统中的地址结构由两部分组成,页号和页内偏移量。 
可以解释为一个二元组(p,w),其中p是页号,w是页面p中的偏移量或者相对于p页开始的位置。 
下图(a) 中的地址长度为32位,其中0 - 9位为页内偏移量,每页的大小为2的10次方 = 1k;10 - 31位为页号,共计2的22次方 = 4M页。在图(b)中,地址长度同样为32位,其中0 - 11位页内偏移量,每页的大小为2的12次方 = 4k;12 - 31位为页号,共计2的20次方 = 1M页,由此可知不同的系统页的大小是不一样的。 

上图页面大小为1KB(2的10次方) 

上图页面大小为4KB(2的12次方)

对于特定的机器来说,其地址结构是一定的。 
若给定逻辑地址A,页面大小为L,则页号p和页内偏移量w分别为 
p = A / L
w = A % L
例如:系统的页面大小事1K,设A = 3096,则由上式得出 p =3,w =24

例如:逻辑地址32位,页面大小4KB,则页表项为多少?为什么?(我觉得页表项个数就是页的个数)

32的逻辑地址,分成两部分。前部分是代表虚拟的页号,后部分代表的是虚拟页偏移量,如果页面是4KB的话,那么这个后部分虚拟页偏移量占了12位,那么前面就是32-12=20位。这20位就是页表中所有的页表项的和。就是2的20次方,也就是1M个页表项,如果每个页表项占4B的话。那么这个页表就占了4MB的空间。一般都会有两级甚至更多的。用来减少页表占的空间

例如:已知逻辑空间地址为2^m个字节(也就是说逻辑地址的长度是m位),已知页大小是2^n字节。那么一共可以有2^(m-n)个页。因此页码部分会占m-n位,之后的n位,用来存储页偏移。

例如:页大小为4B,而逻辑内存为32B(8页),逻辑地址0的页号为0,页号0对应帧5,因此逻辑地址映射为物理地址5*4+0=20。逻辑地址3映射物理地址5*4+3=23。逻辑地址13(4*3+1,页号为3,偏移为1,因此帧号为2),映射到物理地址9。

参考:内存管理之:页和页框&地址变换结构

参考:(偏硬件一点)内存管理笔记(分页,分段,逻辑地址,物理地址与地址转换方式)

 

5.什么是内存泄露?

一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

6.makefile和程序的编译链接过程

  C/C++程序的生成, 分为如下几个步骤
  1). 预处理: 引入头文件,解析并展开宏定义
  2). 编译: 简单一点就是把源代码转化为汇编码(机器指令)
  3). 链接: 组装各个子模块和相应的库,并生成最终的可执行程序

首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。 编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),
 总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File.

makefile具体使用方法
 

7.队列和栈有什么区别?

1、队列先进先出,栈先进后出。

2、对插入和删除操作的"限定"不同。

栈是限定只能在表的一端进行插入和删除操作的线性表。     

队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。  

3、遍历数据速度不同。

栈只能从头部取数据,也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性。

队列则不同,它基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影像数据结构,速度要快的多

8.ARM有哪几种异常?异常处理机制?

ARM是处理器的意思

未定义指令、预取中止、数据中止、中断、快中断、复位、软中断指令SWI。

当一种异常发生时,硬件就会自动执行如下动作:

(1)将CPSR保存到相应异常模式下的SPSR中

(2)把PC寄存器保存到相应异常模式下的LR中

(3)将CPSR设置成相应的异常模式

(4)设置PC寄存器的值为相应处理程序的入口地址

 

拷贝 CPSR 到 SPSR_

设置适当的 CPSR 位:

改变处理器状态进入ARM态

改变处理器模式进入相应的异常模式

设置中断禁止位禁止相应中断 (如果需要)

保存返回地址到 LR_

设置 PC 为相应的异常向量

返回时, 异常处理需要:

从 SPSR_恢复CPSR

从LR_恢复PC

参考文档

 

9.一个表中的id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数

select id ,Count(*) from table_name group by id having count(*)>1

给出一张表

查询数学成绩相同的记录,并显示出该成绩相同记录数

SELECT Math,COUNT(*) from [TestDB].[dbo].[Student] group by Math having COUNT(*)>1;

结果

 

10.请解释一下概念:黑盒测试,白盒测试,alpha测试和beta测试

  • 黑盒测试一般用来确认软件功能的正确性和可操作性,目的是检测软件的各个功能是否能得以实现,把被测试的程序当作一个黑盒,不考虑其内部结构,在知道该程序的输入和输出之间的关系或程序功能的情况下,依靠软件规格说明书来确定测试用例和推断测试结果的正确性。
  • 白盒测试根据软件内部的逻辑结构分析来进行测试,是基于代码的测试,测试人员通过阅读程序代码或者通过使用开发工具中的单步调试来判断软件的质量,一般黑盒测试由项目经理在程序员开发中来实现。

alpha测试版,有点相当于内部测试,一般开发人员在场   ,是由用户做测试,但开发人员在场,一般是请用户到开发现场去测试。系统开发接近完成时对应用系统的测试;测试后仍然会有少量的设计变更。这种测试一般由最终用户或其它人员完成,不能由程序或测试员完成。 α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试
beta测试版,完全交给用户,由用户做测试,返回测试报告,相当于发行前的一个版本。当开发和测试根本完成时所做的测试,最终的错误和问题需要在最终发行前找到。这种测试一般由最终用户或其它人员完成,不能由程序或测试员完成。 β测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。

 

11.对于下面这段代码每行的作用是什么:

#ifdef __cplusplus 
extern "C" { 
#endif

//一段代码

#ifdef __cplusplus 

#endif 

首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。

C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段,被extern “C”修饰的函数或者变量是按照C语言方式编译和链接的,所以可以用一句话来概括extern “C”的真实目的:实现C++与C的混合编程。

具体说明

12.按值传递,按地址传递和引用传递的区别?

值传递:在调用函数中将原函数的值拷贝一份过去被调用的函数,在被调用函数中对该值的修改不会影响原函数的值。形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,

地址传递:在调用函数的时候将原函数的值所在的地址拷贝一份过去,被调用函数对这个地址所作的修改会影响原来的值。是传值的一种特殊方式,只是他传递的是地址,不是普通的如int   
  那么传地址以后,实参和行参都指向同一个对象   
    

引用传递:这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。真正的以地址的方式传递参数   
  传递以后,行参和实参都是同一个对象,只是他们名字不同而已   
  对行参的修改将影响实参的值

13.请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?

一般意义上说交换机是工作在数据链路层。

但随着科技的发展,现在有了三层交换机,三层交换机已经扩展到了网络层。

也就是说:它等于“数据链路层 + 部分网络层”。

交换机中传的是帧。通过存储转发来实现的。

路由器是工作在网络层。路由器中传的是IP数据报。主要是选址和路由。

交换机属于OSI第二层即数据链路层设备。它根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行。路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生。交换机最大的好处是快速,路由器最大的好处是控制能力强。

 

14.多进程与多线程,并发与并行

以后整理

https://www.cnblogs.com/forzheng/p/8280925.html

15.描述insmod,ismod,rmmod作用

insmod: insmod命令用于将给定的模块加载到内核中。Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。例如:insmod xxx.ko
 

ismod:Linux lsmod命令用于显示已载入系统的模块。

rmmod:rmmod命令用于从当前运行的内核中移除指定的内核模块。执行rmmod指令,可删除不需要的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放如核心。你可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。例如:rmmod  xxx.ko
 

16.描述mknod作用及使用

mknod - make block or character special files
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
    option 有用的就是 -m 了
    name   自定义
    type   有 b 和 c 还有 p
    主设备号
    次设备号

主设备号是由linux/major.h定义的,如下定义了一个DOC设备: 
#define IGEL_FLASH_MAJOR 62

 

假如有一个命令mknod doc b 62 0 : 
其中的doc为定义的名字,b指块设备,0指的是整个DOC。如果把0换为1,则1指的是DOC的第一个分区。2是第2个,对于块设备次设备号就表示该块设备上的分区号,依次类推。

至于mknod console c 5 1 的意思也很相似: 
console是设备的名字 
c指字符设备 
5是该设备在major.h中定义的标记 
1是第一个子设备

mknod console c 5 1 
console为设备文件名,自己随便取 
c是指字符型设备 (可选b,块设备) 
5是主设备号 /dev/devices里面记录现有的设备 
找个没有用的就可以了 
1是次设备号,当你要给两个同样的设备上一个驱动的时候就要分了,从0开始,1就是第二个了 ,对于字符设备,次设备号就表示同类型设备的不同设备。
参考

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值