笔试题练习1

1、C++打印出当前源文件的文件名以及源文件的当前行号

ANSI C标准预定义宏:

1__LINE__:在源文件中插入当前源代码行号;

2__FILE__:在源文件中插入当前源文件名;

3__DATE__:在源文件中插入当前的编译日期;

4__TIME__:在源文件中插入当前编译时间;

5__STDC__:当要求程序严格遵循ANSI C标准时该标识符被赋值为1,表明是标准C程序。

#include <iostream>
  2 
  3 using namespace std;
  4 
  5 int main()
  6 {
  7     cout << "the file name:" << __FILE__ << endl;
  8     cout << "the line number:" << __LINE__ << endl;                                                                                  
  9 
 10     return 0;
 11 }

2、程序和算法有何不同?

程序是算法用某种程序设计语言的具体实现,程序可以不满足算法的性质之一:有限性;例如操作系统是一个在无限循环中执行的程序,因而不是一个算法。然而,我们可以把操作系统的各种任务看成是一些单独的问题,每一个问题由操作系统的一个子程序通过特定的算法来实现。

3、Linux有内核级线程吗?

线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。

用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似 Windows 3.x的协作式多任务。

另外一种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核开支,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线程因

 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。

扫描二维码关注公众号,回复: 2748454 查看本文章

Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程

4、UDP协议通讯时怎样得知目标机是否获得了数据包

可以在每个数据包中插入一个唯一的ID,比如timestamp或者递增的int。

发送方在发送数据时将此ID和发送时间记录在本地。

接收方在收到数据后将ID再发给发送方作为回应。

发送方如果收到回应,则知道接收方已经收到相应的数据包;如果在指定时间内没有收到回应,则数据包可能丢失,需要重复上面的过程重新发送一次,直到确定对方收到。

5、简述自旋锁和信号量的区别

自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环查看是否该自旋锁的保持者已经释放了锁,"自旋"就是"在原地打转"。

而信号量则引起调用者睡眠,它把进程从运行队列上拖出去,除非获得锁。
------------------------------------------------------
虽然听起来两者之间的使用条件复杂,其实在实际使用中信号量和自旋锁并不易混淆。注意以下原则:
如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。由于不受睡眠的限制,使用信号量通常来说更加简单一些。如果需要在自旋 锁和信号量中作选择,应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选择。另外,信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对影响调度反应时间带来负面影响。

自旋锁对信号量
------------------------------------------------------
需求                                           建议的加锁方法

低开销加锁                            优先使用自旋锁
短期锁定                                优先使用自旋锁
中断上下文中加锁              使用自旋锁

长期加锁                               优先使用信号量
持有锁是需要睡眠、调度     使用信号量

猜你喜欢

转载自blog.csdn.net/cainiao000001/article/details/81411548