2016年9月问题记录与总结
2016-09-30 17:31
190 查看
1.什么是中断挂接的回调函数,意义是什么呢?
在中断中注册回调函数,是为了在层次架构之间实现一种消息或者事件通知的机制,意思是在另外一个层次中,有一个函数在该中断发生的时候,需要被调用。从这个意义上说,回调有点类似中断,某个条件满足,消息到达,事件触发了,就去调用这个函数。在中断中保存的是需要调用的函数的指针,该指针指向那个函数的起始地址。
将调用者和被调用者分开,这样就可以在不同的层次之间实现。
2.Cache在flush和invalidate的时候,所指向的地址,是cache本身的地址还是一片内存的地址?
时cache需要作用的那一段内存的地址,当映射到那一端之后,访问相关的内存就会中间隔着cache,需要刷cache和写穿等等操作。
3.哪些情况下会引起段错误
1.访问不存在的内存、访问未知的受保护的内存;
2.访问未初始化的指针;
3.写常量区(只读区);
4.在栈中定义过大的数组,导致进程的栈空间不足;
5.数据类型格式转换错误;
6.4G的buffer会导致IO出现段错误
7.main函数递归调用导致栈溢出;
8.数组读写越界;(不一定会导致段错误,但一定会踩(覆盖)了其它数据)
9.使用局部变量返回值;(错误未知,有可能产生断错误)
10.使用已经释放的堆内存;(错误未知,有可能产生断错误)
11.当堆内存耗尽
4.一段简单的排序算法值得思考的地方。
有一个结构体,定义如下:
typedef struct
{
u32 length; //长度
u32 prio; //优先级
u32 attr1; //属性1
u32 attr2; //属性2
}task;
Task a
;
现在的要求是根据手动随机对N个task设定length,然后对prio进行自动设定,length越大,prio越小。
一开始写的程序将整个结构体数组拷贝一个副本,然后每次都要对副本进行操作,才用顺序查找的办法,每一轮找出最大的数,然后进行最大的prio的设定,设定之后,对副本中最大的数清零,再找出第二大的数。这样程序的空间浪费比较多,时间复杂度也比较大。
在代码审查的时候,没有过关,需要进行优化,一开始觉得这是没有必要的,但是在修改过两次之后,得出以下结论:
项目中的代码是需要明白自己所写的每一个字符的意义和带来的后果,每一段代码的优化,总体上的运行就会效率提高很多。改进的方法就是不拷贝副本,只创建一个临时的task类型的变量,采用冒泡排序方法,进行整体位置上的移动,这样节省了空间,同时减少了算法的复杂度,在效率上提升了。这种情况在结构体较小和N较小的情况下性能提升不明显,但是当结构体内的成员增多,占用存储空间增大的时候,效率还是很明显的。
谨记:代码一定要严禁简洁,提交到项目中的代码,需要反复推敲。
在中断中注册回调函数,是为了在层次架构之间实现一种消息或者事件通知的机制,意思是在另外一个层次中,有一个函数在该中断发生的时候,需要被调用。从这个意义上说,回调有点类似中断,某个条件满足,消息到达,事件触发了,就去调用这个函数。在中断中保存的是需要调用的函数的指针,该指针指向那个函数的起始地址。
将调用者和被调用者分开,这样就可以在不同的层次之间实现。
2.Cache在flush和invalidate的时候,所指向的地址,是cache本身的地址还是一片内存的地址?
时cache需要作用的那一段内存的地址,当映射到那一端之后,访问相关的内存就会中间隔着cache,需要刷cache和写穿等等操作。
3.哪些情况下会引起段错误
1.访问不存在的内存、访问未知的受保护的内存;
2.访问未初始化的指针;
3.写常量区(只读区);
4.在栈中定义过大的数组,导致进程的栈空间不足;
5.数据类型格式转换错误;
6.4G的buffer会导致IO出现段错误
7.main函数递归调用导致栈溢出;
8.数组读写越界;(不一定会导致段错误,但一定会踩(覆盖)了其它数据)
9.使用局部变量返回值;(错误未知,有可能产生断错误)
10.使用已经释放的堆内存;(错误未知,有可能产生断错误)
11.当堆内存耗尽
4.一段简单的排序算法值得思考的地方。
有一个结构体,定义如下:
typedef struct
{
u32 length; //长度
u32 prio; //优先级
u32 attr1; //属性1
u32 attr2; //属性2
}task;
Task a
;
现在的要求是根据手动随机对N个task设定length,然后对prio进行自动设定,length越大,prio越小。
一开始写的程序将整个结构体数组拷贝一个副本,然后每次都要对副本进行操作,才用顺序查找的办法,每一轮找出最大的数,然后进行最大的prio的设定,设定之后,对副本中最大的数清零,再找出第二大的数。这样程序的空间浪费比较多,时间复杂度也比较大。
在代码审查的时候,没有过关,需要进行优化,一开始觉得这是没有必要的,但是在修改过两次之后,得出以下结论:
项目中的代码是需要明白自己所写的每一个字符的意义和带来的后果,每一段代码的优化,总体上的运行就会效率提高很多。改进的方法就是不拷贝副本,只创建一个临时的task类型的变量,采用冒泡排序方法,进行整体位置上的移动,这样节省了空间,同时减少了算法的复杂度,在效率上提升了。这种情况在结构体较小和N较小的情况下性能提升不明显,但是当结构体内的成员增多,占用存储空间增大的时候,效率还是很明显的。
谨记:代码一定要严禁简洁,提交到项目中的代码,需要反复推敲。
相关文章推荐
- 配置win2003 server IIS的总结,为什么IIs的工作进程会在空闲时间释放的问题。同时学会了throw的真正含义,throw的真正含义就是导致程序停止,崩溃,很简单,网摘也有记录。
- MySql使用问题总结记录
- 工作记录8:iOS 传值问题总结(7种传值完美介绍)
- selenium 学习笔记 ---新手学习记录(7) 问题总结(java)
- selenium 学习笔记 ---新手学习记录(6) 问题总结(java)
- [项目过程中所遇到的各种问题记录]学习篇——对工作以来的学习过的开源项目进行总结—动软代码生成工具
- 关于一些编程问题的记录总结
- 工作记录8:iOS 传值问题总结(7种传值完美介绍)
- selenium 学习笔记 ---新手学习记录(9) 问题总结(java)
- 2012年6月18日技术总结(由于初参与工作,很多地方的解决方案仍需完善,记录一些简单的问题)
- 工作记录8:iOS 传值问题总结(7种传值完美介绍)
- 使用 m_pRecordset->GetRecordCount();获取记录数不准确的问题总结
- selenium 学习笔记 ---新手学习记录(2) 问题总结
- 各种问题解决方案总结【记录】(持续更新)
- [记录]在Linux中Oracle安装成功后,首次启动使用时,会出现的一些问题总结和解决办法
- MyFirstJsp&Servlet表单提交之问题记录与总结
- Windows系统安装问题记录和总结
- selenium 学习笔记 ---新手学习记录(4) 问题总结(java)-autoit3脚本使用
- 安装oracle10g并导入dmp文件的过程(遇到的问题总结记录)