提问

~~1. linux下锁的种类
互斥锁
读写锁:读的次数多于写的次数
自旋锁:期间不允许睡眠和切换
条件变量(不是锁,等待条件)
2. 进程间通信的方法
信号量:常用于暂时无法获取的共享资源

  1. docker和kvm的优缺点
    docker占用资源少,启动快
    kvm隔离更充分
  2. x86和arm的优缺点
    x86使用复杂指令集,计算快,功耗大
    arm使用精简指令集,晶体管少一点,功耗小
  3. BSS段
    未初始化全局变量和未初始化的静态变量
  4. tcp server的简单实现
  5. 阻塞与非租塞 异步与非异步
    这两者存在本质的区别,它们的修饰对象是不同的。阻塞和非阻塞是指进程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就绪时是直接返回还是等待就绪。
    而同步和异步是指访问数据的机制,同步一般指主动请求并等待I/O操作完毕的方式,当数据就绪后在读写的时候必须阻塞,异步则指主动请求数据后便可以继续处理其它任务,随后等待I/O,操作完毕的通知,这可以使进程在数据读写时也不阻塞。

用户进程发起aio_read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal或执行一个基于线程的回调函数来完成这次 IO 处理过程,告诉它read操作完成了。
在 Linux 中,通知的方式是 “信号”:
如果这个进程正在用户态忙着做别的事(例如在计算两个矩阵的乘积),那就强行打断之,调用事先注册的信号处理函数,这个函数可以决定何时以及如何处理这个异步任务。由于信号处理函数是突然闯进来的,因此跟中断处理程序一样,有很多事情是不能做的,因此保险起见,一般是把事件 “登记” 一下放进队列,然后返回该进程原来在做的事。
如果这个进程正在内核态忙着做别的事,例如以同步阻塞方式读写磁盘,那就只好把这个通知挂起来了,等到内核态的事情忙完了,快要回到用户态的时候,再触发信号通知。
如果这个进程现在被挂起了,例如无事可做 sleep 了,那就把这个进程唤醒,下次有 CPU 空闲的时候,就会调度到这个进程,触发信号通知。

  1. 虚析构函数什么时候使用
  2. gcc和g++的主要区别
  3. 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
  4. 对于 .c和.cpp文件,g++则统一当做cpp文件编译
  5. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
  6. gcc在编译C文件时,可使用的预定义宏是比较少的
  7. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏,这些宏如下:
    #define GXX_WEAK 1
    #define __cplusplus 1
    #define __DEPRECATED 1
    #define GNUG 4
    #define __EXCEPTIONS 1
    #define private_extern extern
  8. 在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个
    主要参数
    -g - turn on debugging (so GDB gives morefriendly output)
    -Wall - turns on most warnings
    -O or -O2 - turn on optimizations
    -o - name of the output file
    -c - output an object file (.o)
    -I - specify an includedirectory
    -L - specify a libdirectory
    -l - link with librarylib.a
  9. c++11中stl的更新
  10. 右值引用
    1、预编译:预处理器对c程序进行一些预处理工作,例如对宏定义的变量进行替换;
    1)将所有的#define删除,并展开所有的宏定义;
    2)处理所有的预编译指令,例如:#if,#elif,#else,#endif;
    3)处理#include预编译指令,将被包含的文件插入到预编译指令的位置;
    4)添加行号信息文件名信息,便于调试;
    5)删除所有的注释:// /**/;
    6)保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作;
    最后生成.i文件;
    总的来说,包括(1)去注释 (2)宏替换 (3)头文件展开 (4)条件编译
    2、编译:编译器将c语言程序翻译成汇编语言程序;
    1)扫描,语法分析,语义分析,源代码优化,目标代码生成,目标代码优化;
    2)生成汇编代码;
    3)汇总符号;
    4)生成.s文件;
    3、汇编:汇编语言通过汇编器编译成可重定位目标程序.o,与之相反称为反汇编;
    1)根据汇编指令和特定平台,把汇编指令翻译成二进制形式;
    2)合并各个section,合并符号表;
    3)生成.o文件;
    4、链接:将目标文件和所需的库函数用链接器进行链接,常见的链接器有Unix;
    1)合并各个.obj文件的section,合并符号表,进行符号解析;
    2)符号地址重定位;
    3)生成可执行文件;~~

volatile 被关键字指定的变量可能被系统,硬件,进程,线程改变,强制编译器每次从内存中取得变量的值,而不是从被优化后的寄存器中读取,例如,硬件时钟,多线程中被多个任务共享的变量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值