空白键|我要消灭一半程序员,10大高性能开发宝石( 二 )
线程池技术
我们可以在程序一开始启动后就批量启动一波工作线程 , 而不是在有请求来的时候才去创建 , 使用一个公共的任务队列 , 请求来临时 , 向队列中投递任务 , 各个工作线程统一从队列中不断取出任务来处理 , 这就是线程池技术 。
有没有一些轻量级的方案来实现多线程安全的访问数据呢?这个时候 , 你需要:
无锁编程技术
多线程并发编程中 , 遇到公共数据时就需要进行线程同步 。 而这里的同步又可以分为阻塞型同步和非阻塞型同步 。
阻塞型同步好理解 , 我们常用的互斥体、信号、条件变量等这些操作系统提供的机制都属于阻塞型同步 , 其本质都是要加“锁” 。
Lock-free能够广泛应用得益于目前主流的CPU都提供了原子级别的read-modify-write原语 , 这就是著名的CAS(Compare-And-Swap)操作 。 在Intelx86系列处理器上 , 就是cmpxchg系列指令 。
//通过CAS操作实现Lock-freedo{...}while(!CAS(ptr , old_data , new_data))我们常常见到的无锁队列、无锁链表、无锁HashMap等数据结构 , 其无锁的核心大都来源于此 。 在日常开发中 , 恰当的运用无锁化编程技术 , 可以有效地降低多线程阻塞和切换带来的额外开销 , 提升性能 。
服务器上线了一段时间 , 发现服务经常崩溃异常 , 排查发现是工作线程代码bug , 一崩溃整个服务都不可用了 。 于是你决定把工作线程和主线程拆开到不同的进程中 , 工作线程崩溃不能影响整体的服务 。 这个时候出现了多进程 , 你需要:
进程间通信技术
提起进程间通信 , 你能想到的是什么?
管道命名管道socket消息队列信号信号量共享内存以上各种进程间通信的方式详细介绍和比较 , 推荐一篇文章一文掌握进程间通信 , 这里不再赘述 。
对于本地进程间需要高频次的大量数据交互 , 首推共享内存这种方案 。
现代操作系统普遍采用了基于虚拟内存的管理方案 , 在这种内存管理方式之下 , 各个进程之间进行了强制隔离 。 程序代码中使用的内存地址均是一个虚拟地址 , 由操作系统的内存管理算法提前分配映射到对应的物理内存页面 , CPU在执行代码指令时 , 对访问到的内存地址再进行实时的转换翻译 。
推荐阅读
- 空白键|日常更新全面屏壁纸
- IT168|消灭挖孔屏!小米真全面屏技术上手
- 恐龙|有这种可能吗?其实外星人就是人类,6500万年前到地球消灭恐龙!
- 空白键|你在你男/女朋友的手机里发现过什么秘密?
- 芯片|中国芯需要多久才能造出来,中间的空白期怎么办?
- 空白键|我用什么品牌手机,跟爱国有什么关系?,请问
- 蜜蜂|1小时就能消灭6万只蜜蜂,却被蜜蜂用物理学反制,它有多惨?
- 空白键|iMatch移动固态硬盘体验,抛弃U盘从它做起,ORICO
- 空白键|CORESET和Search Space基本原理,点点滴滴学5G—一文掌握NR
- 空白键|redis学习第一篇