操作系统相关

kill -9 和 kill -10 的区别

看这篇文章:https://www.cnblogs.com/liuhouhou/p/5400540.html
总结来说 kill pid 默认 是kill -15 pid
kill -10 是用户自定义的杀死进程的signal信号
kill -15 不一定杀死进程,可能会被阻塞

select poll epoll

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

当有I/O发生时,并不知道是哪几个,需要每个都轮询,适合于解決同时大量IO的情況(尤其网络服务器),poll和select的实现基本上是一致的,只是传递参数有所不同。
工作流程:
1、用户态创建了网络 IO 连接,假设一个 socket 连接就是一个 fd 文件描述符,那么将 fd 添加到 fd_set 集合中
2、将 fd_set 集合从用户态 copy 到内核态
3、遍历这个 fd_set 集合,找出所有已经就绪的 fd,执行对应 fd 的相关操作
4、将内核态的 fd_set 集合拷贝到用户态

缺点:包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而且不论这些文件描述符是否就绪,每次都会轮询所有描述符的状态,使得他们的开销随着文件描述符数量的增加而线性增大

epoll 看这篇文章
https://www.cnblogs.com/zengzy/p/5118336.html
总结来说 流程是create->ctl->wait
create 创建红黑树和就绪链表
ctl 用于用户告知内核自己关心哪个描述符(fd)的什么事件(event),插入红黑树(专门用于管理用户关心的事件集合),注册该fd的回调,可读写的时候放入就绪链表
wait 监控就绪链表,设备的某个资源可能被多个进程等待,当设备资源准备好后,设备会唤醒阻塞在这个资源上的所有进程,当前调用epoll_wait的进程未必能抢占这个资源,所以需要再调用检查一次资源是否可用,返回用户态

你可能感兴趣的:(操作系统相关)