Linux 杂记?
?
?
file-max/file-nr 全局文件打开数,ulimit -n 当前session的文件打开数;
分配算法和数据结构:bitmap,last_fd,
?
Linux的内存cache的分配算法和数据结构
kmalloc
?
socket的read()==0 时,什么情况会发生?
tcp的client调用了shutdown,关闭了client -> server的写(也就是收到FIN信号)
udp
socket 还没accept()时,客户端不能connet()?
(非阻塞)能connect,但block在read上?背后的运行是怎样的?返回EINPROGRESS错误,
代表连接还在进行中,可以通过poll/select判断是否可写,可写则是连接完成了;
?
CLOSE_WAIT, TIME_WAIT 和 FIN_WAIT_1/2状态
TIME_WAIT 会占用资源
SO_LINGER 在close sock前把所有数据发出去;
send() EAGAIN
发送缓冲区满了,需要等一下;
调大发送缓冲区,但每个缓冲区是否对应一个连接还是一个进程?
int opt = 256*1024;? //512k setsockopt(tcp_client_sock,SOL_SOCKET,SO_SNDBUF,&opt,sizeof(int));
洗牌算法
socket的连接问题:
长短连接?
连接返回fd<0时,什么情况?刚刚连接上又关闭了。
socket的关闭问题:
shutdown可以关闭一个端口;
FIN_WAIT_2:主动发出FIN后,等待ACK;
TIME_WAIT:主动关闭的一方处于此状态,需要等待MSL,除非同时收到FIN+ACK;
CLOSE_WAIT:被动端,收到FIN后的状态,但自己还需要发数据给主动方;?
服务器FIN_CLOSE2状态,
如何在代码中判断出这两种状态:
?
send/recv两个函数的调用,
send:1)检查sockfd的发送缓冲区,2)如果缓冲区还有数据没发完,等协议发完;或者看看空余的空间;3)copy数据到缓冲区即可返回,交由协议完成发送;
recv:1)等send区发送完毕,然后等协议完成接收完数据;2)recv仅是copy数据,接收数据是协议完成的;
等待协议完成时,网络中断,SIGPIPE,默认是程序退出。
EAGAIN的错误意思:
关于send函数在阻塞模式和非阻塞模式下的区别:
?? ? ? 在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调用recv);
?? ? ? 在非阻塞模式下,send函数的过程仅仅是将数据拷贝到协议栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,返回成功拷贝的大小;如缓存区可用空间为0,则返回-1,同时设置errno为 EAGAIN.
?
?
accept()惊群现象
一个accept调用激起所有线程的epoll_wait返回,但只有一个线程能accept()成功
prefork or pre-threaded
application层的cache是如果控制一个连接只有一个。
BSD的kqueue:
返回的event里面,flag和filter的区别?,目前标记可读可写的是filter,
另外这是EVFILT_READ和EVFILT_WRITE等是负数,而POLLIN和POLLOUT是正数,不是对应的。
?
?
?
?
文件描述符的分配策略和数据结构
分配是按需分配?
inode的结构、文件/目录的结构(分配?回收?搜寻?)