1面关于USB的叙述中,错误的是()
正确答案: B
A.在具有OTG的USB总线上,可以实现在没有主机情况下从设备之间直接进行点对点通信
B.USB 2.0 的速度为480Mbps,USB3.0达到640Mbps
C,主机的USB接口向从设备提供了电源
D.USB支持热插拔
解答:
usb的传输速度没有那么快,usb2.0也是这样的.usb3.0的理论达到的速度是640MB/s,但是这个速度是在满足所有的情况的时候达到的。
2以下哪种排序算法需要开辟额外的存储空间()
正确答案: B
A.选择排序
B.归并排序
C.快速排序
D.堆排序
解答:
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
3分布式系统的CAP原则是指()
正确答案: C
A、Consistency, Accessibility, Partition tolerance
B、Correctness, Accessibility, Partition tolerance
C、Consistency, Availability, Partition tolerance
D、Correctness, Availability, Protection
E、Consistency, Availability, Protection
F、Correctness, Accessibility, Protection
解答:
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容忍性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
4下列程序段运行后, x 的值是( )
a=1;b=2;x=0;
if(!( – a))x – ;
if(!b)x=7;else ++x;
正确答案: A
A、0
B、3
C、6
D、7
解答:
:–a 就是a先减1得0 ;0为假,!0为真,所以执行 x–,x–是先输出x再执行–,故x为0。
5电容在电路中所起的作用有哪些?
正确答案: A B C D
A、抗干扰
B、防过流
C、耦合
D、滤波
解答:
电容在电路中的作用:具有隔断直流、连通交流、阻止低频的特性,广泛应用在耦合、隔直、旁路、
滤波、调谐、能量转换和自动控制等。
6在抢占式多任务处理中,进程被抢占时,哪些运行环境需要被保存下来?
正确答案: A C D
A、所有cpu寄存器的内容
B、全局变量
C、页表
D、程序计数器
解答:
大多数进程是没有特定时间约束的普通进程,但仍然可以根据重要性来分配优先级这种方案称之为"抢占式多任务处理(preemptive multitasking)",各个进程都分配到一定的时间段可以执行。时间段到期后,内核会从进程回收控制权,让"下一个进程(由调度器决定)"。被抢占进程的运行环境,即所有CPU寄存器、页表都会保存起来,因此上一个进程的执行结果不会丢失。在之前被抢占的进程恢复执行时,其进程环境可以完全恢复。
时间片的长度会根据进程优先级而变化。自己的东西要收好,大家的东西你别动。
7下列接口中属于inode_operations结构的有哪些
正确答案: A B D
A、create
B、link
C、aio_read
D、rename
E、flock
解答:
与索引节点inode对象关联的方法称为索引节点操作,由struct inode_operations 结构体描述,该结构的地址存放在inode结构体域变量i_op字段中,struct inode_operations具体描述如下:
struct inode_operations {
struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
void * (*follow_link) (struct dentry *, struct nameidata *);
int (*permission) (struct inode *, int);
struct posix_acl * (*get_acl)(struct inode *, int);
int (*readlink) (struct dentry *, char __user *,int);
void (*put_link) (struct dentry *, struct nameidata *, void *);
int (*create) (struct inode *,struct dentry *,int, struct nameidata *);
int (*link) (struct dentry *,struct inode *,struct dentry *);
int (*unlink) (struct inode *,struct dentry *);
int (*symlink) (struct inode *,struct dentry *,const char *);
int (*mkdir) (struct inode *,struct dentry *,int);
int (*rmdir) (struct inode *,struct dentry *);
int (*mknod) (struct inode *,struct dentry *,int,dev_t);
int (*rename) (struct inode *, struct dentry *,struct inode *, struct dentry *);
void (*truncate) (struct inode *);
int (*setattr) (struct dentry *, struct iattr *);
int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
ssize_t (*listxattr) (struct dentry *, char *, size_t);
int (*removexattr) (struct dentry *, const char *);
void (*truncate_range)(struct inode *, loff_t, loff_t);
int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len);
} ____cacheline_aligned;
8下列叙述中正确的是
正确答案: C
A、线性表链式存储结构的存储空间一般要少于顺序存储结构
B、线性表链式存储结构与顺序存储结构的存储空间都是连续的
C、线性表链式存储结构的存储空间可以是连续的,也可以是不连续的
D、以上说法均错误
解答:
线性表链式存储结构的存储空间一般要多于顺序存储结构,所以A是错误的;线性表链式存储结构与顺序存储结构的存储空间不一定是连续的,所以B也是错误的。因此选择C。
9数字锁相环通常由1,2,3几部分电路组成(请输入中文,英文简称,英文全称)
解答:
(1) 数字鉴相器 或 DPD 或 Digital Phase Detector
(2) 数字环路滤波器 或 DLF 或 Digital Loop Filter
(3) 数字压控振荡器 或 DCO 或 Digital Control Oscillator
10列举3种块设备io调度器1、2、3
参考答案:
(1) cfq
(2) noop
(3) deadline
11CPU的Cache包括哪几类?1234
参考答案
(1) L1指令cache
(2) L1数据cache
(3) L2cache
(4) L3cache
12请根据下面的C语言代码算出输出的结果?
运行时输入: 2365 ,输出结果:6788
解答:
①先输入2,2-2=0;则进入case0;什么也不执行;再进入case1:2+4=6;
②输入3,3-2=1;进入case1:3+4=7;
③输入6,6-2=4;进入default:6+2=8;
④输入5,5-2=3;进入case3:5+3=8;
输出6788;
13使用8Gbit的DRAM颗粒,简述下如何设计32GB容量的DDR4内存条?原理拓扑是怎样的
14描述Linux平台进程和线程的实现方式、区别、共性等
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程;
线程与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
(4)系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
(4)处理机分给线程,即真正在处理机上运行的是线程。
(5)线程是指进程内的一个执行单元,也是进程内的可调度实体。
15spinlock mutex 区别,各自适用的场景
自旋锁
spinlock_t数据类型,spin_lock(&lock)和spin_unlock(&lock)是加锁和解锁。
等待解锁的进程将反复检查锁是否释放,而不会进入睡眠状态(忙等待),所以常用于短期保护某段代码。
同时,持有自旋锁的进程也不允许睡眠,不然会造成死锁——因为睡眠可能造成持有锁的进程被重新调度,而再次申请自己已持有的锁。
如果是单核处理器,则自旋锁定义为空操作,因为简单的关闭中断即可实现互斥。
互斥锁
struct mutex数据类型,mutex_lock(struct mutex *lock)和mutex_unlock(struct mutex *lock)是加锁和解锁。
互斥锁需要进行进程睡眠和唤醒,代价较高,所以不适于短期代码保护,适用于保护较长的临界区。
16什么是原子写?简单说明如何在普通存储设备上实现原子写功能。
原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。。。。?
17嵌入式系统相关问题
a) 对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。
解答:
LITTLE-ENDIAN(小字节序、低字节序),即低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。(习惯思维) 与之对应的是:BIG-ENDIAN(大字节序、高字节序)。
b) 在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?
解答:
在ARM汇编中,如果不超过4个参数,是通过r0 ——r3寄存器传递参数,>4则通过压栈发送传递。
c) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?
解答:
异常:在产生时必须考虑与处理器的时钟同步,实践上,异常也称为同步中断。在处理器执行到由于编程失误而导致的错误指令时,或者在执行期间出现特殊情况(如缺页),必须靠内核处理的时候,处理器就会产生一个异常。
中断:所谓中断应该是指外部硬件产生的一个电信号,从cpu的中断引脚进入,打断cpu当前的运行;
所谓异常,是指软件运行中发生了一些必须作出处理的事件,cpu自动产生一个陷入来打断当前运行,转入异常处理流程。
18请使用MOS管搭建一个延时电路
19输入一个整型数组,子数组为这个数组中连续的一个或者多个整数组成的数组。求所有子数组中的和的最大值。要求时间复杂度为O(n)。例如,输入数组为[1, -3, 9, 10, -2, 3, -6, 5]。和最大的子数组为 [9, 10, -2, 3],因此输出为该子数组的和20。
解答:
int maxSubArray(int* nums,int numsSize)
{
int max=nums[0];//将第一个值赋值为最大值
int i;
for(i=0;i<numsSize;i++)//从数组开头到结尾
{
int sum=0;//定义和为0
int j;
for(j=i;j<numsSize;j++)//从第j位到末尾
{
sum+=nums[j];//求和
if(sum>max)//如果和大于max,则替换max
max = sum;
}
}
return max;
}
int main(int argc, const char *argv[])
{
int numsSize;
printf("please input numsSize:\n");
scanf("%d",&numsSize);
int *p=(int *)malloc((numsSize)*sizeof(int));
int i;
printf("please input nums[]:\n");
for(i=0;i<numsSize;i++)
{
scanf("%d",&p[i]);
}
printf("%d\n",maxSubArray(p,numsSize));
return 0;
}
20用两个栈实现一个FIFO队列。…?
基本思想:一个栈实现队列的入,一个栈实现队列的出
假设先将元素都压入stack1,如果将stack1中的元素逐个弹出并压入stack2,则元素在stack2中的顺序正好和原来在stack1中的顺序相反,也就是stack2中的栈顶元素就是队列中先入的元素,然后弹出stack2的栈顶元素,就实现了队列的“先入先出”的特点
当stack2不为空时,在stack2中的栈顶元素是最先进如队列的元素,可以弹出;当stack2为空时,需将stack1中的元素全部弹出并压入stack2.
代码实现如下:
typedef struct SQueue{
Stack stack1;//入队
Stack stack2;//出队
}SQueue;
void QueuePush(SQueue *ps, int data)
{
Stack *p1, *p2;
p1 = &(ps->stack1);
p2 = &(ps->stack2);
StackPush(p1, data);
}
void QueuePop(SQueue *ps)
{
Stack *p1, *p2;
p1 = &(ps->stack1);
p2 = &(ps->stack2);
int data;
//栈p2为空的情况下,应先将栈1 的数据弹出到栈2里
//栈2为非空时,直接将栈2的栈顶元素弹出
//栈2 的元素总是最先入的
if (StackisEmpty(p2)){
while (!StackisEmpty(p1)){
data = StackTop(p1);
StackPop(p1);
StackPush(p2,data);
}
}
StackPop(p2);
}
栈的实现代码:
void StackInit(Stack *ps)
{
assert(ps);
ps->top = 0;
}
void StackPush(Stack *ps,int data)
{
assert(ps);
assert(ps->top < MAXSIZE);
ps->array[ps->top++] = data;
}
void StackPop(Stack *ps)
{
assert(ps != NULL);
assert(ps->top>0);
ps->top--;
}
//1为空,0为非空
int StackisEmpty(Stack *ps)
{
return ps->top == 0 ? 1 : 0;
}
int StackTop(Stack *ps)
{
assert(ps);
assert(ps->top > 0);
return ps->array[ps->top-1];
}