嵌入式常见面试题 21~30

21.请写一下strcpy函数的代码?

char * strcpy(char *dst,const char *src)

{

if((dst==NULL)||(src==NULL))

return NULL;

int *p = dst;

while((*dst++ = *str++) != /0)

return p;

}

22.从在浏览器地址栏中输入http://www.baidu.com到看到百度首页,这个过程中间经历了什么?

按照时间顺序:

1.客户端浏览器获取用户在地址栏输入的域名。

2.客户端浏览器将域名发送给DNS域名系统,请求解析。

3.DNS解析域名得到相应的IP,返回给客户端浏览器。

4.客户端浏览器根据IP向服务器发起TCP三次握手,建立TCP连接。

5.客户端浏览器向服务器发送HTTP请求,请求百度首页。

6.服务器通过HTTP响应向客户端浏览器返回百度首页文件。

7.释放TCP连接。

8.客户端浏览器解析HTML文件,根据文件内容获取CSS、JS等资源文件,将页面渲染展示给用户。

23.从在浏览器地址栏中输入http://www.baidu.com到看到百度首页,都涉及到哪些网络协议?

TCP/IP五层模型中网络层及以上用到的协议:

1.应用层:HTTP、DNS、HTTPS

2.传输层:TCP、UDP

3.网络层:IP、ARP

24.请问同步与异步有什么区别?

同步(Sync):所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(比如系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。

这种情况下,用户不能关闭界面,如果关闭,那么迁移程序也会中断,用户体验不好。

异步(Async):将用户请求放入消息队列,并反馈给用户,比如系统迁移程序已经启动,提示你可以关闭浏览器了。然后程序再慢慢地写入数据库。但是用户没有卡死的感觉,用户体验较好。

25.请问进程和线程有什么区别?

(1)进程是资源分配的最小单位。

(2)线程是程序执行的最小单位,也是处理器调度的基本单位,但进程不是,两者均可并发执行。

(3)进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据,使用相同的地址空间,因此,CPU切换一个线程的花费远比进程小很多,同时创建一个线程的开销也比进程小很多。

(4)线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也跟着死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

(5)进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。

(6)执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

26.请问进程和线程都有什么优缺点?

线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。

进程执行开销大,但是能够很好的进行资源管理和保护,可以跨机器迁移。

何时使用多进程,何时使用多线程?

对资源的管理和保护要求高,不限制开销和效率时,使用多进程。

要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。

27.线程是否具有相同的堆栈?

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

每个线程有自己的堆栈。

28.C语言编译时动态链接和静态链接得区别是什么?

动态库:

1、链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。

2、程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。

3、. 加载速度比静态库慢

4、发布程序需要提供依赖的动态库

静态库:

1、静态库被打包到程序中加载速度快

2 、发布程序无需提供静态库,应为已经在app中,移植方便

3 、 链接时完整的拷贝至可执行文件中,被多次使用就会有多次冗余拷贝

4、 更新,部署,发布麻烦

29.堆和栈的区别?

①申请方式不同:栈由系统自动分配,堆是由人为自行开辟(malloc,new)

② 申请的大小不同:栈是从高地址像低地址分配的,分配空间较小,堆是由地址向高地分配的,空间较大

③申请效率不同:栈由系统分配,分配速度较快,堆一般较慢

④栈是连续的地址空间,堆不是连续的地址空间,很容易产生内存碎片,浪费内存。

30.进程间通信的方式有哪些?

1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

2.有名管道 (named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

3.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

4.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

5.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

6.共享内存( shared memory ) : 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

7.套接字( socket ) :套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值