目录
一. 程序中的内存分配方法
1. 连续分配方式
2. 基本分页存储管理方式
3. 基本分段存储管理方式
4. 段页式存储管理方式
二. malloc和new的区别
1、申请的内存所在位置不同。new操作符从自由存储区上为对象动态分配内存空间,malloc函数从堆上动态分配内存。
2. 返回类型安全性不同。new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
3. 内存分配失败时的返回值不同。new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL。malloc分配内存失败时返回NULL。
4. 是否需要指定内存大小不同。使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。malloc则需要显式地指出所需内存的尺寸。
三. 为什么局部变量未赋值时,每次初始化的结果是不确定的?
局部变量存在栈区,栈内存是反复使用的,而栈分配空间又是随机的,如果上次用完没有清零,局部变量没有显示初始化,它就会延续上次没清零的值。
四. 编译有几个阶段 每个阶段做什么事情
词法分析、语法分析、语义分析、代码优化、代码生成
五. 在FreeRTOS中,二值信号量和互斥量的区别?
互斥量必须是同一任务申请,同一任务释放,其他任务释放无效。二值信号量,一个任务申请成功,可以由另外一个任务释放
六. 在FreeRTOS中,任务通知的运行机制是怎么样的?
任务通知的数据结构包含在任务控制块中,只要任务存在,任务通知数据结构就已经创建完毕,可以直接使用。任务通知可以在任务中向指定任务发送通知,也可以在中断中向指定任务发送通知,FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue就是这个通知值。只有在任务中可以等待通知,而不允许在中断中等待通知。如果任务在等待的通知暂时无效,任务会根据用户指定的阻塞超时时间进入阻塞状态,我们可以将等待通知的任务看作是消费者;其它任务和中断可以向等待通知的任务发送通知,发送通知的任务和中断服务函数可以看作是生产者,当其他任务或者中断向这个任务发送任务通知,任务获得通知以后,该任务就会从阻塞态中解除。
七. 什么情况下会栈溢出?
1. 局部数组过大 2. 递归调用层次太多
3. 指针或数组越界
八. 深复制和浅复制的区别?
浅拷贝:只是对指针拷贝,拷贝后两个指针指向同一个内存空间
深拷贝:不但对指针进行拷贝,对指针指向的内容进行拷贝,两个指针不同的内存空间
区分:指针A拷贝指针B,B变化后,看A是否变化,变化的是浅拷贝,不变的是深拷贝
九. 简述一下快速排序的步骤
1. 从数列中挑出一个元素,称为 "基准";
2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置;
3. 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序;
十. linux的锁机制?
互斥锁:在任何时刻只能有一个线程访问该资源
读写锁:读状态时可以多个线程同时读。写状态只能一个线程获得
自旋锁:任何时刻只能有一个线程获得该资源,获取锁失败时,不会进入睡眠,会原地自旋,直到锁被释放
条件锁:条件变量,不满足条件阻塞,满足条件唤醒进程,常与互斥锁配合使用
信号量:相当于计数器,为零时堵塞,不为零时唤醒进程
十一. STM32 中断是怎么进入到中断服务程序的
在STM32中,为了区分不同的中断,每个设备有自己的中断号。系统有0-255一共256个中断。系统有一张中断向量表,用于存放256个中断的中断服务程序入口地址。每个入口地址对应一段代码,即中断服务程序。
十二. 操作系统条件变量的惊群效应是什么
当某一资源可用,多个进程/线程会惊醒,竞争资源。这就是操作系统中的惊群。