一、Linux C 底层相关
1、怎么创建一个socket函数
socket函数创建socket fd,然后配置服务器ip和端口,再把socket fd和ip bind一起,调用listen把socket fd变为监听端口并配置监听队列,调用accept阻塞等待客户端链接,再select,poll,epoll确定哪些连接有请求或消息,之后read或wirte,recv,send等。
2、有名管道和匿名管道的区别
使用上,匿名管道只能在父子进程或兄弟进程中通信,而有名管道无限制。创建上,匿名管道智界使用pipe函数创建,而有名管道通过mkfifo函数创建并使用open打开。在存储中,匿名管道只存在内存中,有名管道在文件系统中存在。
3、进程通信方式
信号,共享内存,消息队列,信号量,套接字,管道。
其中消息队列和管道的区别在于,消息队列有缓存队列,适用于读写不一致,并且消息队列传输数有格式限制,而管道没有。
4、进程使用信号量和线程使用的有什么区别
管理者不同,进程使用信号量的管理者为内核且内核可见,线程使用的管理者是进程且内核不可见
5、系统调用流程
用户态自陷指令后,首先调用线程需要保存现场,包括保存变量,PC指针等,在X86系统中,是把PC指针+4或+8(具体看指令长度)压入栈中,在ARM系统中,需要把PC指针+4或+8保存在LR寄存器中,之后PC指针移动到内核被调用函数,进入内核态的syscall函数,函数根据syscalltable查询系统调用例程,调用例程,函数执行结束后,执行iret恢复现场,PC指针返回,处理返回值。
普通调用中,不使用自陷指令和iret进行用户态和内核态的切换,而是用call调用,然后ret返回
6、什么时候PC指针会指向LR寄存器
当出现嵌套调用时。在嵌套调用时,需要把LR寄存器内容保存在栈中,从而让LR保存被嵌套的函数地址,在恢复时,PC指向LR寄存器从而嵌套的恢复PC。
7、指针和数组的区别
指针数据在堆中,数组数据在栈中,所以如果一个函数返回类型为指针,但是实际return的是一个数组,会导致函数实际返回空数据。
8、Linux定时器
包括内核级定时器和用户级定时器。其中内核级定时器精确度更高,比如timer_list,使用软中断触发。用户级追求易用,比如POSIX定时器,可以绑定线程和函数,同时还有gettimeofday能够获得微秒的时间。。
timer_list大概包括定时器列表,到期时间,回调函数,函数参数,有毫秒的误差。
操作包括init_timer,add_timer,del_timer,mod_timer。
4.15版本之前

4.15及以后

9、进程线程的调度
FIFO,LRU,LFU
10、struct长度计算,怎么启用对齐,是否默认对齐
考虑对齐。
在Linux中:
增加__attribute__(aligned(8))来使用8字节对齐,如
struct A_ __attribute__(aligned(8)) {
int a;
char b[10];
}A;
在windows中,增加#pragma pack(1),如
using namespace std;
#pragma pack(1)
struct A_ {
int a;
char b[10];
}A;
11、内联函数和宏的区别
内联函数在编译时需要判断参数和返回值是否合法,宏不需要。宏定义在预处理阶段进行直接替换,内联函数在判断是否合法后,需要继续判断是直接展开还是作为普通函数处理。
12、select,poll,epoll的区别
select有最大监听fd限制,参数需要传入最大fd,read fds,write fds,error fds,time out,根据这些再用户态中创建bitmap并选择置1(0,1,2号为操作系统预留),然后把bitmap复制到内核态循环扫描(因为消息接受在内核态,所以在内核态中遍历避免频繁切换),把接受到数据的位置置为1,并复制回用户态。
poll:使用了pollfd数据结构,包括了fd,事件和填充事件,poll 参数传入pollfds,num pollfds,timeout。无最大fd限制(受到内存限制),复制pollfds到内核态并循环检查数据是否到来,并修改填充事件。

epoll:包括epoll_create,epoll_ctl,epoll_wait。epoll_create发生在accept之前,在内核态中创建:rdlist用来保存到来数据,rbr用来保存fd的红黑树,wq用来保存阻塞进程的队列。epoll_ctl建立客户端和服务端,并根据fd,事件创建epitem放在红黑树中,当数据到达后,会通过回调函数的方式把数据放在rdlist,epoll_wait会检查rdlist是否有数据对应fd,有则返回给用户态,否则会把进程阻塞放到阻塞队列。

windows,linux都能用select,只有linux能用poll,epoll
13、DMA
传输单位为块,DMA控制器包括数据寄存器,计数器,地址寄存器,命令寄存器。命令寄存器在IO中断接受cpu的命令后,由地址寄存器确定保存到内存的地址位置,设备不断的将数据保存在数据寄存器中(一次传输一个字,按照数据总线来),数据寄存器数据传输到内存中,每完成一次传输,计数器+1,传输完成一个或多个块后,计数器想cpu发出DMA中断。

14、从用户态切换到内核态有什么发生了变化
对文件内存设备的访问权限发生变化,上下文变化,内存访问范围从用户虚拟地址到内核地址和所有用户地址
15、内核态和用户态怎么通信
使用系统调用进行双向通信。使用信号从内核向用户态通信,比如中断终止暂停等信号。共享内存,由内核态申请内存,用户态申请映射。
共享内存实现: 内核段:shm_open 打开内存文件 --> ftruncate 指定共享内存大小 -->mmap 根据文件映射到虚拟地址中
&nbs

5143

被折叠的 条评论
为什么被折叠?



