2016年9月问题记录与总结

来源:互联网 发布:网络设备支持网管软件 编辑:程序博客网 时间:2024/05/22 08:17

1.什么是中断挂接的回调函数,意义是什么呢?

在中断中注册回调函数,是为了在层次架构之间实现一种消息或者事件通知的机制,意思是在另外一个层次中,有一个函数在该中断发生的时候,需要被调用。从这个意义上说,回调有点类似中断,某个条件满足,消息到达,事件触发了,就去调用这个函数。在中断中保存的是需要调用的函数的指针,该指针指向那个函数的起始地址。

将调用者和被调用者分开,这样就可以在不同的层次之间实现。

 

2.Cacheflushinvalidate的时候,所指向的地址,是cache本身的地址还是一片内存的地址?

cache需要作用的那一段内存的地址,当映射到那一端之后,访问相关的内存就会中间隔着cache,需要刷cache和写穿等等操作。

 

3.哪些情况下会引起段错误

1.访问不存在的内存、访问未知的受保护的内存;
    2.访问未初始化的指针;
    3.写常量区(只读区);
    4.在栈中定义过大的数组,导致进程的栈空间不足;
    5.数据类型格式转换错误;
    6.4Gbuffer会导致IO出现段错误
    7.main函数递归调用导致栈溢出;
    8.数组读写越界;(不一定会导致段错误,但一定会踩(覆盖)了其它数据)
    9.使用局部变量返回值;(错误未知,有可能产生断错误)
    10.使用已经释放的堆内存;(错误未知,有可能产生断错误)
    11.当堆内存耗尽

 

 

4.一段简单的排序算法值得思考的地方。

有一个结构体,定义如下:

typedef struct

{

u32 length; //长度

u32 prio; //优先级

u32 attr1; //属性1

u32 attr2; //属性2

}task;

Task a[N];

现在的要求是根据手动随机对Ntask设定length,然后对prio进行自动设定,length越大,prio越小。

一开始写的程序将整个结构体数组拷贝一个副本,然后每次都要对副本进行操作,才用顺序查找的办法,每一轮找出最大的数,然后进行最大的prio的设定,设定之后,对副本中最大的数清零,再找出第二大的数。这样程序的空间浪费比较多,时间复杂度也比较大。

在代码审查的时候,没有过关,需要进行优化,一开始觉得这是没有必要的,但是在修改过两次之后,得出以下结论:

项目中的代码是需要明白自己所写的每一个字符的意义和带来的后果,每一段代码的优化,总体上的运行就会效率提高很多。改进的方法就是不拷贝副本,只创建一个临时的task类型的变量,采用冒泡排序方法,进行整体位置上的移动,这样节省了空间,同时减少了算法的复杂度,在效率上提升了。这种情况在结构体较小和N较小的情况下性能提升不明显,但是当结构体内的成员增多,占用存储空间增大的时候,效率还是很明显的。

谨记:代码一定要严禁简洁,提交到项目中的代码,需要反复推敲。

0 0
原创粉丝点击