资源(缓存/IO/变量/代码段)的获取、放入安全
#b计算机基础/c_计算机系统/b_linux系统/补充
2020年4月27日 下午11:35
注:这篇是从安全的角度去考虑的,另外还有从效率的角度去思考
效率这个这个角度我认为是一个tradeoff,计算机软件体系是一个从底层开始层层抽象发展的,这个的目的是为了上下层抽象的过程中简化编程的思维,但是对于数据的处理、拷贝、交互来说,应该是扁平的,这中间就会有矛盾,面对这样的矛盾,我们处理的方法就是让数据的交互来说尽可能的放在这个体系的底层,也就是内核层去完成,尽量不要用到用户态,这个就减少了没有实际效率意义的内核态与用户态之间的数据拷贝,一个专业的名次是0拷贝。
多线程核心知识的两个层面去理解:
- 本质讨论的都是资源的获取和放入
- 【资源本身】资源的两种保护形式-主动、被动:
- 主动:缓存/IO为空
- 这里的空就可以等价的理解为加了锁
- 缓存 IO有四种状态 广义的IO模型:阻塞I/O->非阻塞忙轮询I/O->select/epoll无差别轮询代理-> epoll
- 被动:缓存_操作对象(变量_代码段)有,但加锁 ==》都会造成线程的阻塞
- 独立于线程之外的资源对象:缓存、IO,变量、C++全局变量(要注意这里的全局变量)
- 主动:缓存/IO为空
- 【获取资源方】操作对象面对锁、等待、空之后的做法种类:
- 上面说明了不同的场景原因,以及唯一的操作者线程,不同的被操作对象,但是操作方都是线程为单位
- 但是没有提到线程他对待这样的事情有几种处理方法:阻塞待唤醒、忙轮询、一遍轮询、不轮询直接获得操作对象
- 广义的IO模型:阻塞I/O->非阻塞忙轮询I/O->select/epoll无差别轮询代理-> epoll
- 我们一般在程序里默认是线程阻塞待唤醒
- 目录(现代C++)中的安全部分
- 线程安全的策略java中
- 上面三点说明了如何处理,如果不处理会出现什么情况:
- 为什么我们再多线程下需要使用锁?
- 脏数据
- 为什么我们再多线程下需要使用锁?
我们可以根据场景进行自定义设计的地方:
- 选择合适的锁的类型
- 锁就是字面意思:锁住大门,不让你进。他有酸甜苦辣味,看你的需要选取。不同的锁的类型,体现你对资源的管理方式。
- 从线程的角度,你希望线程遇到阻塞之后,如何行事呢?
- 阻塞待唤醒、忙轮询、一遍轮询、不轮询直接获得操作对象等