嵌入式面试题答案


题1答案:

(1)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

(2)复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

(3)用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

题2答案:

  • 互斥量用于线程的互斥,信号量用于线程的同步。

    互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

    同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

  • 互斥量值只能为0/1,信号量值可以为非负整数。

也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

  • 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

题3答案:

  • 预处理:预处理相当于根据预处理命令组装成新的C程序,不过常以i为扩展名。
  • 编译: 将得到的i文件翻译成汇编代码.s文件。
  • 汇编:将汇编文件翻译成机器指令,并打包成可重定位目标程序的O文件。该文件是二进制文件。
  • 链接:将引用的其他O文件并入到我们程序所在的o文件中,处理得到最终的可执行文件。

题4答案:

  •  在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
  • 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
  • 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

题5答案:

  • 只读。
  • 使用关键字const也许能产生更紧凑的代码。
  • 使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。

题6答案:

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

  •  并行设备的硬件寄存器(如:状态寄存器)
  • 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
  • 多线程应用中被几个任务共享的变量

题7答案:

  可以。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

题8答案:

  可以。尽管这并不很常见。一个例子是当一个中服务子程序修改一个指向一个buffer的指针时。

题9答案:

a|=1<<3;      //bit3置1
a&=~(1<<3)  //bit3置0 

 题10答案:

  • ISR 不能返回一个值。
  • ISR 不能传递参数。
  • 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
  • printf()经常有重入和性能上的问题。

题11答案:

1、结构体

  • 各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。

2、联合体:

  • 各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。  

题12答案:

1、总是使用不经常改动的大型代码体。

2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

题13答案:

答:指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。

题14答案:

答:能,局部会屏蔽全局。

  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。

  对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

题15答案:

  • 引用必须被初始化,指针不必。
  • 引用初始化以后不能被改变,指针可以改变所指的对象。
  • 不存在指向空值的引用,但是存在指向空值的指针。

题16答案:

  答:真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。

  每个线程有自己的堆栈。

题17答案:

答:TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于广播和细节控制交给应用的通信传输,两者主要的不同体现在一下几个方面:

  1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

  2、TCP提供可靠的服务。它通过校验和,丢包时的重传控制,序号标识,滑动窗口、确认应答,次序乱掉的分包进行顺序控制实现可靠传输。即通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP尽最大努力交付,即不保证可靠交付。

  3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高要求的通信或广播通信场景。

  4、每一条TCP连接只能是点到点的; UDP支持一对一,一对多,多对一和多对多的交互通信方式。

  5、TCP对系统资源要求较多,UDP对系统资源要求较少。

UDP有时比TCP更有优势:

UDP以其简单、传输快的优势,在越来越多场景下取代了TCP, 如实时游戏。

  (1)网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。

  (2)TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP在内置的系统协议栈中,极难对其进行改进。

  采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大。

  基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题造成的影响。

题18答案:

 

 

题20答案:

  线程同步是指多线程通过特定的设置(如互斥量,事件对象,临界区)来控制线程之间的执行顺序(即所谓的同步)也可以说是在线程之间通过同步建立起执行顺序的关系。

(1)互斥量
  • 只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程同时访问。
(2)事件对象
  • 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作
(3)临界区
  • 通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
  • 在任意时刻只允许一个线程对共享资源进行访问
  • 如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
  • 它并不是核心对象,不是属于操作系统维护的,而是属于进程维护的。

  线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,临界区对象就是其中一种。

  在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程。但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入,由于CPU时间调度上的问题,写入数据会被多次的覆盖,所以就要使线程同步。

题21答案:

(1)数组:
  • 优点——静态分配空间,而且局部申请,局部释放,你不用为他的内存空间管理而费心,
  • 缺点——灵活性不强,需要在编译时就确定数组的大小。
(2)指针
  • 优点——动态分配空间,极大的方便了动态数据结构的构造,因而灵活性强,
  • 缺点——内存空间的管理只能靠手工完成,而且容易造成内存错误。

题22答案:

  消息队列。

题23答案:

  一个程序至少一个进程,一个进程至少一个线程。

(1)进程线程的区别
  • 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
  • 资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
  • 一个进程崩溃后,在保护模式下不会对其他进程产生影响,
  • 但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
  • 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。。
  • 如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程
 (2)执行过程
  • 每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。
  • 线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  • 线程是处理器调度的基本单位,但是进程不是。
  • 两者均可并发执行。
(3)优缺点
  • 线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。
  • 进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。
 (4)多进程和多线程的优缺点 
  1)多进程优点
  • 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
  • 通过增加CPU,就可以容易扩充性能;
  • 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
  • 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大
  2)多进程缺点
  • 逻辑控制复杂,需要和主程序交互;
  • 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算
  • 多进程调度开销比较大;
  1)多线程的优点
  • 无需跨进程边界;
  • 程序逻辑和控制方式简单;
  • 所有线程可以直接共享内存和变量等;
  • 线程方式消耗的总资源比进程方式好;
  2)多线程缺点
  • 每个线程与主程序共用地址空间,受限于2GB地址空间;
  • 线程之间的同步和加锁控制比较麻烦;
  • 一个线程的崩溃可能影响到整个程序的稳定性;
  • 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
  • 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU

题24答案:

  • 对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
  • 要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。

 题25答案:

  • 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
  • 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
  • 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
  • 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
  • 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

题26答案:

Linux下使用虚拟内存空间给每一个进程,32位操作系统下,每个进程都有独立的4G虚拟内存空间。
其中包括:

(1)内核区:用户代码不可见的区域,页表就存放在这个区域中。

(2)用户区

  • 代码段:只可读,不可写,程序代码段。
  • 数据段:保存全局变量,静态变量的区域
  • 堆区:就是动态内存,通过malloc,new申请内存,有一个堆指针,可以通过brk系统调用调整堆指针。
  • 文件映射区域:通过mmap系统调用,如动态库,共享内存等映射物理空间的内存区域。可以单独释放,不会产生内存碎片。
  • 栈区:用于维护函数调用的上下文空间,用ulimit -s 查看。一般默认为8M。

 

 

 题27答案:

 

 

(1)创建状态New  

  满足运行条件(分配到除CPU外的资源),进入就绪状态

(2)就绪状态Runnable/Start  

  获取CPU资源,得到时间片,进入运行状态

(3)运行状态Running
  • 主动睡眠sleep(),进入Time Waiting状态
  • 主动等待wait(),进入Waiting状态
  • I/O请求或者申请缓冲区失败,进入阻塞状态
  • 中断或者执行完毕,进入终止阶段
  • 时间片用完,进入就绪状态
(4)Time Waiting

  睡眠时间到,进入就绪状态

(5)Waiting

  被唤醒,进入就绪状态

(6)阻塞状态Blocked  

  I/O完成或者同步块释放,进入就绪状态

(7)消亡/终止状态Dead/Terminated

题28答案:

  • 父进程与子进程执行顺序:第一次执行代码时,父进程首先启动,执行到 pid = fork(),会创建一个子进程,子进程此时开始执行父进程中pid=fork()后续代码逻辑(这表示并不执行父进程所有代码逻辑);
  • 父进程监控进程:子进程此时已经执行了,父进程为了监控进程(子进程和父进程)运行情况,调用waitpid函数进行监控,在子进程执行过程中,父进程不会消亡,一直处于运行状态,子线程运行完成后,执行waitpid查看当前进程情况

所以每输入一次 指令运行一次结果,就开启了一个子进程

  • 他们的关系是管理被管理的关系,当父进程终止时,子进程也随之而终止。但子进程终止,父进程并不一定终止。比如httpd服务器运行时,我们可以杀掉其子进程,父进程并不会因为子进程的终止而终止。在Linux进程管理中,当我们发现占用资源过多,或无法控制的进程时,应该杀死它,以保护系统的稳定安全运行;
  • 子进程和父进程共享打开的文件描述符。

  • 子进程拷贝父进程到数据空间,堆栈空间

题29答案:

1.进程上下文:

(1)进程上文:其是指进程由用户态切换到内核态是需要保存用户态时cpu寄存器中的值进程状态以及堆栈上的内容,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行

(2)进程下文:其是指切换到内核态后执行的程序,即进程运行在内核空间的部分

2.中断上下文:

(1)中断上文:硬件通过中断触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。中断上文可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被中断的进程环境。

(2)中断下文执行在内核空间的中断服务程序。

题30答案:

  看用户虚拟内存有多少,根据分配的栈空间决定。

  进程最多可以创建的线程数是根据分配给调用栈的大小,以及操作系统(32位和64位不同)共同决定的。

题31答案:

  • 并发(concurrency):当多个线程在操作的时候,如果系统只有一个CPU,同一时刻就只有一条线程指令在执行,但是各个线程指令被快速的轮换执行,这就是的宏观上看起来是多个线程在同时执行。但微观上并不是这样,只是将时间分成若干个片段,多个线程交替执行。并发就是在单核处理中同时处理多个任务.(这里的同时指的是逻辑上的同时)。
  • 并行就是在多核处理器中同时处理多个任务.(这里的同时指的就是物理上的同时)
  • 同步(synchronous):线程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个线程的输出作为后一个线程的输入,当第一个线程没有输出时第二个线程必须等待。具有同步关系的一组并发线程相互发送的信息称为消息或事件。
  • 互斥多个线程访问系统资源的时候,同时只能有一个线程对资源进行访问
  • 异步(asynchronous):异步和同步是相对的,同步就是顺序执行执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情
  • 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回
  • 非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回

题32答案:

  • 同步(synchronous):线程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个线程的输出作为后一个线程的输入,当第一个线程没有输出时第二个线程必须等待。具有同步关系的一组并发线程相互发送的信息称为消息或事件。
  • 互斥:多个线程访问系统资源的时候,同时只能有一个线程对资源进行访问。

题33答案:

(1)同步阻塞

  放假了,老王回到了乡下,由于乡下的基础设施比较差,当他在车站候车的时候,只能一直在干等着,直到公交车的到站。这时候对于公交车(被调用着者)来说,它是“同步“的。老王(调用者)被公交车(被调用者)“阻塞”在站台上。

(2)异步阻塞

  放完假了,老王回到了大城市开始上班,同样在车站候车,一样在车站干等着,但是大城市的基础设施建设得比较好,当公交车到站的时候,会有广播提示提醒乘客。那么这时候对于公交车(被调用着者)来说,它是“异步“的,到站后会通知调用者。但是此时老王(调用者)还是被公交车(被调用者)“阻塞”在站台上。

(3)同步非阻塞

  过年了,老王放假回来了乡下,又要开始候车了,这时候他变聪明了,没有一直在车站上干等着,而是去找隔壁的小花叙叙旧。但是又害怕车到站了自己会错过,就只能隔一段时间过来看看车到了没。那么这时候对于公交车(被调用着者)来说,它是“同步“的。但是此时老王(调用者)可以在候车的时候去干其他的的事情,所以他是“非阻塞”的。

(4)异步非阻塞

  春风吹满地,新农村建设正在火热进行中,此时的乡下,公交车里面也安装了车辆到站的提醒广播。现在老王在候车的时候,可以安心的跟小花叙旧了,当听到自己需要乘坐的车辆到站广播时,才过去车站上车。这时候对于公交车(被调用着者)来说,它是“异步“的,到站后会广播提醒,此时老王(调用者)可以在候车的时候去干其他的的事情,所以他是“非阻塞”的。

题34答案:

  我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

  孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

  僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

孤儿进程和僵尸进程-详解

  守护进程(daemon):一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。

按照服务类型分为如下几个:
  1. 系统守护进程:syslogd、login、crond、at等。
  2. 网络守护进程:sendmail、httpd、xinetd、等。
  3. 独立启动的守护进程:httpd、named、xinetd等。
  4. 被动守护进程(由xinetd启动):telnet、finger、ktalk等。

题35答案:

(1)创建子进程,终止父进程
  由于守护进程是脱离控制终端的,因此首先创建子进程,终止父进程,使得程序在shell终端里造成一个已经运行完毕的假象。之后所有的工作都在子进程中完成,而用户在shell终端里则可以执行其他的命令,从而使得程序以僵尸进程形式运行,在形式上做到了与控制终端的脱离。
(2)在子进程中创建新会话
  这个步骤是创建守护进程中最重要的一步,在这里使用的是系统函数setsid。   setsid函数用于创建一个新的会话,并担任该会话组的组长。调用setsid三个作用:让进程摆脱原会话的控制、让进程摆脱原进程组的控制和让进程摆脱原控制终端的控制。在调用fork函数时,子进程全盘拷贝父进程的会话期(session,是一个或多个进程组的集合)、进程组、控制终端等,虽然父进程退出了,但原先的会话期、进程组、控制终端等并没有改变,因此,那还不是真正意义上使两者独立开来。setsid函数能够使进程完全独立出来,从而脱离所有其他进程的控制。
(3)改变工作目录
  使用fork创建的子进程也继承了父进程的当前工作目录。由于在进程运行过程中,当前目录所在的文件系统不能卸载,因此,把当前工作目录换成其他的路径,如“/”或“/tmp”等。改变工作目录的常见函数是chdir。
(4)重设文件创建掩码
  文件创建掩码是指屏蔽掉文件创建时的对应位。由于使用fork函数新建的子进程继承了父进程的文件创建掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件创建掩码设置为0,可以大大增强该守护进程的灵活性。设置文件创建掩码的函数是umask,通常的使用方法为umask(0)。
(5)关闭文件描述符
  用fork新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,可能导致所在的文件系统无法卸载。

题36答案:

正确处理僵尸进程的方法:

  • 父进程回收法

    wait函数将使其调用者阻塞,直到其某个子进程终止。故父进程可调用wait函数回收其僵尸子进程。除此之外,waitpid函数提供更为详尽的功能( 增加了非阻塞功能以及指定等待功能 )

  • init进程回收

       1. 如果父进程先于子进程结束,那么子进程的父进程自动改为 init 进程。

            2. 如果 init 的子进程结束,则 init 进程会自动回收其子进程的资源而不是让它变成僵尸进程。

题37答案:

 malloc,free和new,delete的区别

  • malloc和new都是在堆上分配内存。栈区的内存分配是系统自动分配释放的,主要存放函数的参数值、局部变量的值等。
  • malloc和free在C程序中使用,而C++程序中使用new和delete,删除数组delete[]p,指针释放后,要将指针置空
  • new和delete可以调用构造函数析构函数
  • malloc是函数,new是关键字
  • malloc不能赋初值,new可以,如int *p = new int(2).代表分配一个int型的内存空间,并赋初值2.如果new int ()代表赋初值0,new int[10]代表分配10个int.
  • malloc返回的指针是void *类型,而new返回的指针是它分配空间的类型

题 38答案:

  C库接口malloc申请动态内存,malloc的实现内部最终还是会调用brk()或者mmap()系统调用来分配内存。

  malloc函数用于动态分配内存。为了减少内存碎片和系统调用的开销,malloc其采用内存池的方式:

  • 先申请大块内存作为堆区
  • 将堆区分为多个内存块,以作为内存管理的基本单位。
  • 当用户申请内存时,直接从堆区分配一块合适的空闲块。
  • malloc采用隐式链表结构将堆区分成连续的、大小不一的块,包含已分配块未分配块
  • 同时malloc采用显示链表结构来管理所有的空闲块,即使用一个双向链表将空闲块连接起来,每一个空闲块记录了一个连续的、未分配的地址。

  当进行内存分配时,malloc会通过隐式链表遍历所有的空闲块,选择满足要求的块进行分配;当进行内存合并时,malloc采用边界标记法,根据每个块的前后块是否已经分配来决定是否进行块合并。

https://www.jianshu.com/p/7af62431983e

题39答案:

  malloc能够申请的空间大小与物理内存的大小没有直接关系,仅与程序的虚拟地址空间相关。程序运行时,堆空间只是程序向操作系统申请划出来的一大块虚拟地址空间。应用程序通过malloc申请空间,得到的是在虚拟地址空间中的地址,之后程序运行所提供的物理内存是由操作系统完成的。

题40答案:

(1)内存分配的方式
  • 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量
  • 栈空间:局部变量的存储单元在栈上创建,函数执行结束后自动释放内存。
  • 堆空间:动态分配内存空间,动态分配和手动回收,如果不回收会造成内存泄漏。
(2)内存空间
  • 栈区(stack):由编译器自动分配释放,存放为运行函数而分配的局部变量函数参数、返回数据、返回地址。其操作方式类似于数据结构中的栈。
  • 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配方式类似于链表。
  • 全局区(静态区)(static):存放全局变量、静态数据、常量。程序结束后由系统释放。
  • 文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。
  • 程序代码区:存放函数体(类成员函数和全局函数)的二进制代码。

题41答案 :

  • extern"C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言语法进行编译,而不是C++的。
  • extern 是变量或函数的申明告诉编译器在其它文件中找这个变量或函数的定义

题42答案:

  数组是一种引用数据类型,数组引用变量只是一个引用,数组元素数组变量在内存里是分开存放的。实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中。数组在内存中的存储示意图如图4.2所示:

                                           

 

题43答案:

  • class中默认的成员访问权限是private的,而struct中则是public的。
  • struct中只能定义成员变量,不能定义函数,一般是定义一个函数指针指向一个函数。class中可以定义成员变量和成员函数(方法)。
  • struct类型的变量可以直接使用大括号进行初始化。
struct test{
int a;int b;
};
//初始化
test A={1,2};//完全可以 

题44答案:

  • char -> int : 会将1个字节的char类型数据扩充到4个字节(32位系统),对于无符号类型来说,只将int的最低字节复制为char的值,其余三个字节都为0。
  • int -> char: 只将int的最低字节的内容复制到char类型的变量,三个高位字节被忽略,这在编译时会给出警告,但通过强制类型转换则可以避免警告出现,如 char ch = (char)intvar 。

题45答案:

  • TCP:对数据传输的质量有较高要求,但对实时性要求不高。比如HTTP,HTTPS,FTP等传输文件的协议以及POP,SMTP等邮件传输的协议,应选用TCP协议
  • UDP:只对数据传输的实时性要求较高,但不对传输质量有要求。比如视频传输、实时通信等,应选用UDP协议。

题46答案:

  • 确认和重传机制

    建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础,传输过程中,如果Checksum校验失败、丢包或延时,发送端重传。

  • 数据排序

    TCP有专门的序列号SN字段,可提供数据re-order。

  • 流量控制

    窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量。

  • 拥塞控制

TCP的拥塞控制由4个核心算法组成。

  • “慢启动”(Slow Start)
  • “拥塞避免”(Congestion avoidance)
  • “快速重传 ”(Fast Retransmit)
  • “快速恢复”(Fast Recovery)

以上就是TCP比UDP传输更可靠的原因。

 题47答案:

  • 物理层:物理层负责最后将信息编码成电流脉冲或其它信号用于网上传输;eg:RJ45等将数据转化成0和1;
  • 数据链路层:数据链路层通过物理网络链路??供数据传输。不同的数据链路层定义了不同的网络和协 议特征,其中包括物理编址、网络拓扑结构、错误校验、数据帧序列以及流控;可以简单的理解为:规定了0和1的分包形式,确定了网络数据包的形式;
  • 网络层:网络层负责在源和终点之间建立连接;可以理解为,此处需要确定计算机的位置,怎么确定?IPv4,IPv6!
  • 传输层:传输层向高层??提供可靠的端到端的网络数据流服务。可以理解为:每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信!常用的(TCP/IP)协议;
  • 会话层:会话层建立、管理和终止表示层与实体之间的通信会话;建立一个连接(自动的手机信息、自动的网络寻址);
  • 表示层;提供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息 可以被另一个系统应用层识别;可以理解为:解决不同系统之间的通信,eg:Linux下的QQ和Windows下的QQ可以通信;
  • 应用层:OSI 的应用层协议包括文件的传输、访问及管理协议(FTAM) ,以及文件虚拟终端协议(VIP)和公用管理系统信息(CMIP)等;规定数据的传输协议;

题48答案:

  • ?URL 统一资源定位符(Uniform Resource Locator):其实就是我们访问web页面时需要输入的”网页地址“”网址“。
  • URI 统一资源标识符(Uniform Resource Identifier):就是某个网络协议方案表示的资源的定位标识符。

 题49答案 :

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 希尔排序
  • 归并排序
  • 快速排序

题50答案: 

  Linux内核的主要模块(或组件)分以下几个部分:

  • 存储管理。
  • CPU和进程管理。
  • 文件系统。
  • 设备管理和驱动。
  • 网络通信。
  • 系统的初始化(引导)。
  • 系统调用等。

题51答案:

  • 系统调用,提供特定的用户空间与内核空间的信息传递。
  • 信号,内核空间出现一些异常时候会发送信号给进程,如SIGSEGV、SIGILL、SIGPIPE等。
  • /proc:proc可以读取内核空间的配置信息和运行状态并且设置部分属性的值。
  • 文件:可以通过指定文件的读写操作来实现通信,但是流程不够实时,需要循环检测来实现。
  • netlink:类似socket通信方式,可以读写大量的数据,实现稍微复杂。
  • ioctl:可以实现数据量比较少时候的通信。

题52答案:

  该过程分为两个部分:用户空间的处理和核心空间的处理。在用户空间中通过 0x80 中断的方式将控制权交给内核处理,内核接管后,经过6个层次的处理最后将请求交给磁盘,由磁盘完成最终的数据拷贝操作(拷贝到缓冲区)。在这个过程中,调用了一系列的内核函数。

题53答案:

  用户态切换到内核态对硬件设备进行管理和访问。

从用户态到内核态切换可以通过三种方式:

  • 系统调用:其实系统调用本身就是中断,但是软件中断,跟硬中断不同。
  • 异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。
  • 外设中断:当外设完成用户的请求时,会向CPU发送中断信号。

内核态:

  • 系统中既有操作系统的程序,也由普通用户的程序。为了安全和稳定性操作系统的程序不能随便访问,这就是内核态
  • 内核态可以使用所有的硬件资源

用户态:

  • 不能直接使用系统资源,也不能改变CPU的工作状态,并且只能访问这个用户程序自己的存储空间

题54答案:

  uboot读取kernel到内存是从kernel开始存储的地址开始读取的,而读取开始位置和读取大小,是由环境变量决定的。所以这个时候不需要文件系统的。

题55答案:

BootLoader的stage1通常包括以下步骤:  

  1.硬件设备初始化  如CPU寄存器、内存控制器。
  2.为加载BootLoader的stage2准备RAM空间。
  3.拷贝BootLoader的stage2到RAM空间中。
  4.设置好堆栈 为什么?为了跳转到stage2的入口,因为stage2大多数是用C语言写的。
  5.跳转到stage2的C入口点。

BootLoader的stage2通常包括以下步骤:  

  1.初始化本阶段要使用到的硬件设备    各种设备,如网卡。
  2.将内核映像和根文件系统映像从flash上读到RAM中去。
  3.调用内核。

题56答案:

  • 中断屏蔽
  • 原子操作:其它同步方法的基础
  • 自旋锁:线程试图获取一个已经被别人持有的自旋锁,当前线程处于忙等待,占用cpu资源
  • 读写自旋锁:根据通用性和针对性的特点,普通自旋锁在特定场景下的表现会退化。因此,提供了读写自旋锁,读锁可以加读锁,不能加写锁,写锁不能加任何锁。
  • 顺序锁
  • 信号量:信号量是一种睡眠锁。一个任务试图获取被别人占有的信号量,信号量会将其推进一个等待队列,让其睡眠,当请求的信号量被释放,处于等待队列的任务被唤醒,并获得信号量。
  • 读写信号量、

题57答案:

  • 自旋锁禁止处理器抢占
  • 信号量不禁止处理器抢占。

基于这个原因,如果自旋锁在锁住以后进入睡眠,由于不能进行处理器抢占,其他系统进程将都不能获得CPU而运行,因此不能唤醒睡眠的自旋锁,因此系统将不响应任何操作(除了中断或多核的情况,下面会讨论)。而信号量在临界区睡眠后,其他进程可以用抢占的方式继续运行,从而可以实现内存拷贝等功能而使得睡眠的信号量程序由于获得了等待的资源而被唤醒,从而恢复了正常的代码运行。

  当然,自旋锁的睡眠的情况包含考虑多核CPU和中断的因素。自旋锁睡眠时,只是当前CPU的睡眠以及当前CPU的禁止处理器抢占,所以,如果存在多个CPU,那么其他活动的CPU可以继续运行使操作系统功能正常,并有可能完成相应工作而唤醒睡眠了的自旋锁,从而没有造成系统死机;自旋锁睡眠时,如果允许中断处理,那么中断的代码是可以正常运行的,但是中断通常不会唤醒睡眠的自旋锁,因此系统仍然运行不正常。

题58答案:

free

题59答案:

大端:数据的低位存储在内存的高地址。Intel、AMD等采用的是这种方式。网络中传输的数据必须按网络字节序,即大端字节序

小端:数据的低位存储在内存的低地址。ARM、Motorola等所采用。当应用进程将整数送入socket前,需要转化成网络字节序;当应用进程从socket取出整数后,要转化成主机节序

题60答案:

  • 预处理:主要处理源代码中的预处理指令,引入头文件去除注释,处理所有的条件编译指令宏的替换添加行号保留所有的编译器指令
gcc -E main.c  -o main.i   
  • 编译:对预处理后的文件进行语法分析,词法分析,语义分析,符号汇总,然后生成汇编代码。
gcc -S main.i -o main.s
  • 汇编:汇编过程将汇编代码转成二进制文件,二进制文件就可以让机器来读取。每一条汇编语句都会产生一句机器语言。
gcc -c main.s -o main.o
  • 链接:将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
gcc  main.o -o main

链接分为静态链接动态链接

  • 静态链接:后缀是.a,主要在编译的时候将库文件里面代码搬迁到可执行的文件中;
  • 动态链接:后缀是.so,主要在执行的时候需要转换到库文件代码执行;

两种链接的优缺点:

(1)静态的链接产生的可执行的文件体积比较的大;而动态链接的可执行文件的体积比较小;

(2)动态的链接的编译的效率比较的高hezhan;

(3)静态链接的可执行的文件执行的效率高

(4)静态链接的可执行的文件的“布局”比较好一点;

题61答案:

  • 堆(heap):是由malloc之类函数分配的空间所在地。地址是由低向高增长的(先进先出的队列)。
  • 栈(stack):是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的(先进后出的队列)。
  • 内存溢出(out of memory):通俗理解就是内存不够,程序运行的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。
  • 内存泄漏(Memory Leak):是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

题62答案:

  • 堆的内存空间是人为动态分配的,且手动回收
  • 栈的内存空间是系统自动分配的,系统自动回收
  • 栈由系统自动分配速度较快,而堆一般速度比较慢
  • 栈获得的空间较小,而堆获得的空间较大
  • 栈是连续的空间,而堆是不连续的空间。频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。
  • 栈是先进后出的队列,堆是先进先出的队列。
  • 堆的生长方向是向着内存地址增加的方向,而栈的生长方向相反。

题63答案:

产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。  

产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

死锁的解除与预防:

在系统设计、进程调度等方面注意如何不让这四个必要条件成立,

  • 如何定资源的合理分配算法,避免进程永久占据系统资源。
  • 防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

题64答案:

  • 软链接又叫符号链接,这个文件包含了另一个文件的路径名,可以链接不同文件系统的文件。
  • 硬链接就是一个文件的一个或多个文件名,把文件名和计算机文件系统使用的节点号链接起来。硬链接只能对已存在的文件进行创建,不能交叉文件系统进行硬链接的创建,
  • 软链接可对不存在的文件或目录创建软链接,可交叉文件系统。
  • 硬链接不能对目录进行创建,只能对文件进行创建。软链接两者都可以创建。

题65答案:

  • 虚拟内存:借助于地址转换,操作系统可以给应用程序一种假象,独占整个计算机内存,可以使用超过实际物理大小的内存,应用程序之间互不干扰。
  • 虚拟地址:进程看到的内存地址称为虚拟地址,他们不对应任何物理实体,每个进程有自己的地址空间。
  • 物理地址:内存系统看到的地址称为物理地址,他们用实际的地址去查找和存储内容。

题66答案:

  • 支持的最大运行内存不同。
  • 32位的电脑最大只支持4G(一般情况只能用3.25G左右),而64位的电脑则可以支持128G甚至更大
  • 32位电脑支持32位的系统,而64位的电脑支持32位的系统也支持64位的系统。
  • 64位的系统理论上比32位系统快一倍,并且它们的内存寻址也不一样。

题67答案:

  • 中断是指 CPU 对系统发生某事件时的这样一种响应:

    CPU 暂停正在执行的程序,在保留现场后自动地转去执行该事件的中断处理程序;执行完后,再返回到原程序的断点处继续执行

下图 表示中断时 CPU 的活动轨迹。还可进一步把中断分为外中断和内中断。

  • 外中断(中断)——是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;
  • 内中断(异常)——是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。内中断(trap)也被译为“捕获”或“陷入”。

异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。
中断则是由于系统中某事件引起的,该事件与现行指令无关。

相同点:都是CPU对系统发生的某个事情做出的一种反应。

区别:中断由外因引起,异常由CPU本身原因引起。

引发中断或异常的事件:
  • 中断——外部事件引起,正在运行的程序所不期望的
  • 异常——内部执行指令引起

 题68答案:

中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理

硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);

软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。

中断的触发方式有2种类型:
  • 边沿触发。
  • 电平触发。
中断处理流程:

  CPU收到中断或者异常的信号——>暂停执行当前的程序或任务——>跳转到负责处理这个信号的相关处理程序中——>完成对这个信号的处理后——>跳回到刚才被打断的程序或任务中.

题69答案:

立刻关机:

sudo halt
sudo init 0
sudo shutdown -h now
sudo shutdown -h 0
 

定时/延时关机:

sudo shutdown -h 19:30
sudo shutdown -h +30   ##单位为分钟
 

重启:

sudo reboot
sudo init 6
sudo shutdown -r now
 

休眠:

sudo pm-hibernate
echo “disk” > /sys/power/state
sudo hibernate-disk
 

待机(挂起):

sudo pm-suspend
sudo pm-suspend-hybrid
echo “mem” > /sys/power/state
sudo hibernate-ram 

 题70答案:

  优点:
  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  • 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
  • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
  • 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
 缺点
  • 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
  • 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

题71答案:

  1.  CPU即中央处理器,CPU从内存或缓存中取出指令,放入指令寄存器,并对指令译码分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成一条指令的执行。

  2.   但是,CPU并不能直接调用存储在硬盘上的系统、程序和数据,必须首先将硬盘的有关内容存储在内存中,这样才能被CPU读取运行。因而,内存(即物理内存,是相对于硬盘这个“外存”而言)作为硬盘和CPU的“中转站”,对电脑运行速度有较大影响。

  3. 当运行数据超出物理内存容纳限度的时候,部分数据就会自行“溢出”,这时系统就会将硬盘上的部分空间模拟成内存——虚拟内存,并将暂时不运行的程序或不使用的数据存放到这部分空间之中,等待需要的时候方便及时调用。

  4. 由于内存是带电存储的(一旦断电数据就会消失),而且容量有限,所以要长时间储存程序或数据就需要使用硬盘(外存储器)。硬盘也会影响系统速度,因为系统从硬盘中读取数据并通过总线存入内存的速度也会影响系统运行的快慢

  5. 物理内存真正的内存虚拟内存为了满足系统对超出物理内存容量的需求时在外存(如硬盘)上开辟的存储空间。由于虚拟内存其实是放在外存上,因而与物理内存相比读写速度都非常慢

  6. 电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗更大。为了解决这个问题,可以使用虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。比如说当电脑要读取一个比物理内存还要大的文件时,就要用到虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,就把虚拟内里储存的文件释放到原来的目录里了。

题72答案:

1、控制单元

  控制单元是整个CPU的指挥控制中心,包括指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和操作控制器OC(Operation Controller)、时序发生器程序计数器等部件,对协调整个电脑有序工作极为重要。它根据用户预先编好的程序,依次从存储器中取出各条指令,放在指令寄存器IR中,通过指令译码(分析)确定应该进行什么操作,然后通过操作控制器OC,按确定的时序,向相应的部件发出微操作控制信号。操作控制器OC中主要包括节拍脉冲发生器、控制矩阵、时钟脉冲发生器、复位电路和启停电路等控制逻辑。

2、运算单元

  是运算器的核心。可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。相对控制单元而言,运算器接受控制单元的命令而进行动作,即运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的,所以它是执行部件。由算术运算逻辑单元(ALU)、累加器、数据缓冲寄存器、状态寄存器和通用寄存器组组成,它是数据加工处理部件。

3、存储单元

  包括CPU片内缓存寄存器组,是CPU中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据,CPU访问寄存器所用的时间要比访问内存的时间短。采用寄存器,可以减少CPU访问内存的次数,从而提高了CPU的工作速度。但因为受到芯片面积和集成度所限,寄存器组的容量不可能很大。寄存器组可分为专用寄存器和通用寄存器。专用寄存器的作用是固定的,分别寄存相应的数据。而通用寄存器用途广泛并可由程序员规定其用途,通用寄存器的数目因微处理器而异。

题73答案:

嵌入式处理器简介

优点 :
  • 耗电少功能强、16位/32位双指令集。
  • 大量使用寄存器,指令执行速度更快。
  • 大多数数据操作都在寄存器中完成。
  • 寻址方式灵活简单,执行效率高。
  • 指令长度固定。
缺点:
  • 计算能力较为低下且不能支持普通的 Windows 系统
系列产品:

  目前常见的 ARM 处理器类型(系列)有 ARM7、ARM9、ARM10、ARM11 和 Cortex。而每个系列处理器中又有许多不同的类型,如 ARM9 系列就有 ARM9E-S、ARM966E-S 等类型。

应用选型:

不同系列 ARM 处理器的应用场景如下:

  • Cortex-A 系列——是开放式操作系统高性能处理器是面向尖端的,基于虚拟内存的操作系统和用户应用,可以运行Linux,偏向消费产品,应用包括智能手机、智能本和上网本、电子阅读器、数字电视、家用网络、家用网关和其他各种产品
  • Cortex-R系列——面向实时应用的高性能内核,偏向高端工业。应用领域有汽车制动系统、动力传输解决方案、大容量存储控制器、联网和打印机等。
  • Cortex-M系列——面向具有确定性的微控制器应用的成本敏感型解决方案。面向各类嵌入式应用控制,偏向于各类控制。应用领域有微控制器、混合信号设备、智能传感器、汽车电子和气囊等。

题74答案:

波特率定义为单位时间内传输的码元(携带数据信息的信号单元)个数。

波特率相同是要保证数据传输发送和接收的速率保持一致。

波特率高,传输速率提高,受干扰的可能性大,但是传输距离短。反之,则传输速率慢,传输距离长。

题75答案:

  • ARM具有比较强的事务管理功能,可以用来跑界面以及应用程序等,其优势主要体现在控制方面,它的速度和数据处理能力一般,但是外围接口比较丰富,标准化和通用性做的很好,而且在功耗等方面做得也比较好,所以适合用在一些消费电子品方面;
  • DSP主要是用来计算的,比如进行加密解密、调制解调等,优势是强大的数据处理能力较高的运行速度。由于其在控制算法等方面很擅长,所以适合用在对控制要求比较高的场合,比如军用导航、电机伺服驱动等方面。

  如果只是着眼于嵌入式应用的话,嵌入式CPU和DSP的区别应该只在于一个偏重控制一个偏重运算了。

题76答案:

  ROM:只读存储器,EEPROM.

  RAM:可随机存取的存储器,根据RAM的存储机制,又分为动态随机存储器DRAM(Dynamic RAM)以及静态随机存储器SRAM(Static RAM)两种。

题77答案:

题78答案:

扇区:是指磁盘上划分的区域。磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区,硬盘的读写以扇区为基本单位。

:由于扇区数目众多在寻址时比较困难,所以操作系统就将相邻的扇区组合在一起形成一个块,再对块进行整体的操作,即操作系统中最小的逻辑存储单元。一个块 = 单个扇区大小 * 2的n次方,其中n是可修改的。 

:“簇”是 DOS 进行分配的最小单位。当创建一个很小的文件时,如是一个字节,则它在磁盘上并不是只占一个字节的空间,而是占有整个一簇。DOS 视不同的存储介质(如软盘,硬盘),不同容量的硬盘,簇的大小也不一样。簇的大小可在称为磁盘参数块(BPB)中获取。簇的概念仅适用于数据区

簇、块:扇区更大的集合,簇是Windows(fat)文件系统的概念,在Linux叫块; :内存操作,是虚拟一个页的概念来作为最小单位。与硬盘打交道,就是以块为最小单位。

题79答案:

cpu发出读数据的请求,然后会在缓存中查找要访问的数据,如果有就直接返回给CPU内核,如果缓存中没有,则通过MMU的页表从物理内存读取数据(相邻的数据都会读取)到缓存,同时返回给CPU内核。

缓存的作用是解决CPU运算速度和内存读写速度不匹配的问题。cpu的运算速度一般很高,内存读写速度相对较慢。

题80答案:

总线接口 串/并 同步/异步传输(根据是否有同步时钟线判断) 速率 工作方式 用线 总线拓扑结构 距离
UART 异步

(波特率设置)

全双工 rx、tx RS232支持总线型、星形、树形

最远(1200m)

I2C 同步 100kbit/s(标准)、400kbit/s(快速)、3.4Mbit/s(高速) 半双工 SCL/SDA 总线型 近  
SPI 同步 最大上百Mhz 全双工

(3线或者4线)

CS/CLK/DI/DO

环形
USB 异步

USB1.0/1.1(1.5Mbit/s(低速)、12Mbit/s(全速))

USB2.0 480Mbit/s

半双工 D+/D-/GND/Vbus(5V) 星型