面试题2(操作系统,嵌入式)
1.什么是进程和线程,有什么区别?
进程:一定独立功能的程序再某个数据集合上的动态执行过程,是系统进行资源分配和独立调度的基本单位
线程:是进程的一个实体,Cpu调度和分配的基本单位,线程基本上不拥有系统资源
2.windows消息调度机制是:消息队列
3.描述实时性系统的基本特性:
在特定的时间内完成特定的任务,实时性和可靠性
所谓实时操作系统,实际上是指操作系统工作时,各种资源可以根据需要随时进行动态分配,由于各种资源可以根据需要进行动态分配,所以其处理事务的能力较强,速度较快.
4.中断和轮询的特点
程序轮询方式:定时对各种I/O设备轮流询问一遍有无处理要求,轮询之后,有要求处理的,则进行处理.在处理I/O设备的请求之后,处理机返回继续工作.
程序中断简称中断,是指CPU在正常运行程序的过程中,由于预先安排或发生了各种随机的内部或外部事件,使CPU中断正在运行的程序,而转到为响应的服务程序去处理.
轮询:效率低,等待时间长,CPU利用率不高.
中断:容易遗漏一些问题,CPU利用率高.
5.什么是临界区?如何解决冲突?
每个进程中访问临界资源的那段程序称为临界区,每次只允许一个进程进入临界区,进入后不允许其他进程进入.
解决冲突的原则:空闲让进,忙则等待,有限等待,让权等待(也是进程同步机制遵循的原则).宗旨是每次只有一个进程在临界区中.
6.分段和分页的区别
页是信息的物理单位,分页是实现离散分配方式,以消减零散的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要.
段是信息的逻辑单位,它含有一组其意义相对完整的信息.分段的目的是为了更好满足用户的需要.
页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的.段的长度却是不固定的,决定于用户所编写的程序.
7.保持进程同步的方法
进程间同步的方法主要有:原子操作,信号量机制,自旋锁,管程,会合,分布式系统等.
8.Linux文件属性有哪些?
一共是十位 - --- --- ---
第一个横表示文件类型识别符;
第一个三个连续的短横是用户权限位
第二个三个连续短横是组权限位
第三个三个连续短横是其他权限位
9.makefile文件的作用是什么?
一个工程中的源文件不计其数,其按类型,功能,模块分别放在若干目录中.makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作.makefile带来的好处就是------"自动化编译".一旦写好,只需要一个make命令,整个工程完全自动编译.
make是一个命令工具,是一个解释makefile中指令的命令工具.
10.简述物理层,链路层,网络层
网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路經.
链路层:通过各种控制协议,将有差错的物理信道变为无差错的,能可靠传输数据帧的数据链路.
物理层:利用传输介质为数据链路层提供物理链接,实现比特流的透明传输.
11.什么是中断,中断时CPU做什么工作
中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程.
12.线程是否具有相同的堆栈?dll是否有独立的堆栈?
每个线程都有自己的堆栈.
dll是动态链接库,dll是否有独立的堆栈?这个问题不好回答,或者说这个问题本身是否有问题。因为dll中的代码是被某些线程所执行,只有线程拥有堆栈。如果dll中的代码是exe中的线程所调用,那么这个时候是不是说这个dll没有独立的堆栈?如果dll中的代码是由dll自己创建的线程所执行,那么是不是说dll有独立的堆栈?
13.什么是缓冲区溢出?有什么危害?其原因是什么?
缓冲区溢出是指当计算机想缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上.
危害:缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
原因:造成缓冲区溢出的主原因是程序中没有仔细检查用户输入的参数。
14.什么是死锁?其条件是什么?怎样避免死锁?
两个进程或多个进程被无限期的阻塞,相互等待的一种状态.
死锁产生的主要原因是:系统资源不足;进程推进顺序非法;
产生死锁的必要条件:
互斥;不可抢占;占有并等待;环形等待
避免死锁:破坏死锁形成的必要条件,经典的算法有:银行家算法.
15.memcpy 和 strcpy有什么区别?
memcpy 和 strcpy 都是标准的 C 库函数
strcpy提供了字符串的复制,并且除了复制字符串的内容之外,还会复制字符串的结束符
memcpy提供了一般内存的复制,memcpy对于复制的内容没有限制,因此用途更广.
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
16.整数数组清零的两个库函数bzero(),memset(),解析
原型:void bzero(void *s, int n);
功能:置字节字符串s的前n个字节为零且包括‘\0’
void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节替换为ch并返回s;
17.分析程序
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
char *str[] = {"ab","cd","ef","gh","ij","kl"};
char *t1,*t2,*t3,*t4;
t1 = (str + 4)[-1];
t2 = (str + 4)[0];
t3 = (str + 4)[1];
t4 = (str + 3)[-1];
cout << "t1 = " << t1 << endl;
cout << "t2 = " << t2 << endl;
cout << "t3 = " << t3 << endl;
cout << "t4 = " << t4 << endl;
return 0;
}
结果:
t1 = gh
t2 = ij
t3 = kl
t4 = ef
18.
小端:低位字节数据存储在低地址
大端:高位字节数据存储在低地址
例如:int a=0x12345678;(a首地址为0x2000)
0x2000 0x2001 0x2002 0x2003
0x12 0x34 0x56 0x78 大端格式
0x78 0x56 0x34 0x12 小端格式
19.用变量a定义
一个整型数 int a;
一个指向整型数的指针 int *a;
一个指向指针的指针,它指向的指针式指向一个整型数 int **a;
一个有10个整型数的数组 int a[10];
一个有10指针的数组,该指针是指向一个整型数 int *a[10];
一个指向有10个整型数数组的指针 int (*a)[10];
一个指向函数的指针,该函数有一个整型数参数并返回一个整型数 int (*a)(int);
一个有10个指针的数组,该指针指向一个函数,该函数有一个整型数参数并返回一个整型 int (*a[10])(int);
20.分析程序
int foo(void)
{
int i;
char c=0x80;
i=c;
if(i>0)
return 1;
return 2;
}
0x80 == 1000 0000
0x7f == 0111 1111
结果:返回值为2;因为i=c=-128;如果c=0x7f,则i=c=127。
21.
a=b*2; a=b/4; a=b%8; a=b/8*8+b%4; a=b*15; 效率最高的算法
a=b*2 -> a=b<<1;
a=b/4 -> a=b>>2;
a=b%8 -> a=b&7;
a=b/8*8+b%4 -> a=((b>>3)<<3)+(b&3)
a=b*15 -> a=(b<<4)-b
22.编译和链接有什么不同?(如外部符号的处理)
编译生成的是目标文件(object *.o);
编译过程中对于外部符号不做任何解释和处理。外部符号对应的就是“符号”
链接生成的是可执行程序
链接将会解释和处理外部符号。外部符号对应的是地址
23.进程之间有哪几种通信方式
1.管道
2.消息队列
3.套接字
4.共享内存
5.信号量