获得徽章 0
#每天一个知识点# 进程 线程
差异
1 进程是资源分配的基本单位
2 线程是任务调度和执行的基本单位
3 进程拥有独立的内存空间和系统资源
4 线程共享进程所属进程的资源

线程切换开销:
1 线程堆栈建立
2 分配内存
3 线程上下文切换

展开
评论
为什么要区分用户空间和内核空间?
1 内核代码是直接加载到物理内存的
2 从安全和稳定性考虑 和内核相关操作都是通过系统调用完成的,用户进程没有权限直接操作内核

一个用户线程陷入系统调用会发生线程切换吗?
会的,陷入系统调用一般会阻塞 所以cpu会挂起阻塞的线程去执行其他线程

用户空间切换内核空间的主要开销有哪些?
1 寄存器状态保持恢复
2 内存切换(不同进程)
3 cpu 缓存失效
4 内核态用户态之间的切换(系统调用)
5 锁开销(多线程竞争)
展开
评论
#每天一个知识点#

从数据结构的角度去理解 epoll IO多路复用
1. epoll 里面主要有两个数据结构,红黑树,双向链表。这两个都是存放 文件描述符fd(file description),红黑树存放的是所有fd,双向链表存放已经就绪的fd
2. epoll 是基于事件驱动做通知的,所有添加到 epoll中的fd(和事件回调函数关联)都会和设备(网卡)驱动程序建立回调关系,也就是说当网卡检查到连接establish 后会通知 epoll 对应的 fd ready了,可以把这个fd 从红黑树移动到双向链表
3. epoll 是如何识别具体到是哪个 fd就绪了呢?遍历红黑树吗?基于回调函数就行,所以epoll 查找就绪fd 的时间复杂度是 O(1)
4. 那既查找是 O(1)那为什么还要用红黑树来存储fd?直接用链表不是更简单好用吗?因为要应对一些异常情况,在插入 fd 时需要做重复检查,所有数据结构需要承担查询的需求。所以这里用红黑树。
5. 就绪列表为什么用双向链表?这是一个不断插入就绪fd和删除fd 的场景。在插入和删除中间的节点时,双向链表性能会更好,可以通过 prev 指针操作前节点,单向链表需要暂存上一节点。
展开
评论
#新人报道#
Hi!我是新人创作者阿东,我计划在掘金这个平台上每天更新一个知识点,希望未来的日子里我们可以一起进步
12
个人成就
文章被阅读 138
掘力值 10
收藏集
2
关注标签
6
加入于