kafka中⽂官⽅⽂档
并发历史
在计算机最早期的时候,没有操作系统,执⾏程序只需要⼀个过程,那就是从头到尾依次执⾏。任何资源都会为这个程序服务,这必然就会存在 浪费资源 的情况。
这⾥说的浪费资源指的是资源空闲,没有充分使⽤的情况。mysql操作官方文档
操作系统为我们的程序带来了 并发性,操作系统使我们的程序同时运⾏多个程序,⼀个程序就是⼀个进程,也就相当于同时运⾏了多个进程。
操作系统是⼀个并发系统,并发性是操作系统⾮常重要的特征,操作系统具有同时处理和调度多个程序的能⼒,⽐如多个 I/O 设备同时在输⼊输出;设备 I/O 和 CPU 计算同时进⾏;内存中同时有多个系统和⽤户程序被启动交替、穿插地执⾏。操作系统在协调和分配进程的同时,操作系统也会为不同进程分配不同的资源。
操作系统实现多个程序同时运⾏解决了单个程序⽆法做到的问题,主要有下⾯三点
资源利⽤率,我们上⾯说到,单个进程存在资源浪费的情况,举个例⼦,当你在为某个⽂件夹赋予权限
的时候,输⼊程序⽆法接受外部的输⼊字符,只能等到权限赋予完毕后才能接受外部输⼊。综合来讲,就是在等待程序时⽆法执⾏其他⼯作。如果在等待程序的同时可以运⾏另⼀个程序,那么将会⼤⼤提⾼资源的利⽤率。(资源并不会觉得累)因为它不会划⽔~
公平性,不同的⽤户和程序对于计算机上的资源有着同样的使⽤权。⼀种⾼效的运⾏⽅式是为不同的程序划分时间⽚使⽤资源,但是有⼀点需要注意,操作系统可以决定不同进程的优先级,虽然每个进程都有能够公平享有资源的权利,但是每次前⼀个进程释放资源后的同时有⼀个优先级更⾼的进程抢夺资源,就会造成优先级低的进程⽆法获得资源,久⽽久之会导致进程饥饿。
便利性,单个进程是⽆法通信的,通信这⼀点我认为其实是⼀种避雷针策略,通信的本质就是信息交换,及时进⾏信息交换能够避免信息孤岛,做重复性的⼯作;任何并发能做的事情,顺序编程也能够实现,只不过这种⽅式效率很低,它是⼀种 阻塞式 的。
但是,顺序编程(也称为串⾏编程)也不是⼀⽆是处的,串⾏编程的优势在于其直观性和简单性,客观来讲,串⾏编程更适合我们⼈脑的思考⽅式,但是我们并不会满⾜于顺序编程,we want it more 。资源利⽤率、公平性和便利性促使着进程出现的同时也促使着线程的出现。
如果你还不是很理解进程和线程的区别的话,那么我就以我多年操作系统的经验(吹⽜逼,实则半年)来为你解释⼀下:进程是⼀个应⽤程序,⽽线程是应⽤程序中的⼀条顺序流。
线程会共享进程范围内的资源,例如内存和⽂件句柄,但是每个线程也有⾃⼰私有的内容,⽐如程序计数器、栈以及局部变量。下⾯汇总了进程和线程共享资源的区别
线程被描述为⼀种轻量级的进程,轻量级体现在线程的创建和销毁要⽐进程的开销⼩很多。
注意:任何⽐较都是相对的。
在⼤多数现代操作系统中,都以线程为基本的调度单位,所以我们的视⾓着重放在对线程的探究。
线程
优势和劣势
合理使⽤线程是⼀门艺术,合理编写⼀道准确⽆误的多线程程序更是⼀门艺术,如果线程使⽤得当,能够有效的降低程序的开发和维护成本。
在 GUI 中,线程可以提⾼⽤户界⾯的响应灵敏度,在服务器应⽤程序中,并发可以提⾼资源利⽤率以及系统吞吐率。
Java 很好的在⽤户空间实现了开发⼯具包,并在内核空间提供系统调⽤来⽀持多线程编程,Java ⽀持了丰富的类库 urrent 和跨平台的内存模型,同时也提⾼了开发⼈员的门槛,并发⼀直以来是⼀个⾼阶的主题,但是现在,并发也成为了主流开发⼈员的必备素质。
虽然线程带来的好处很多,但是编写正确的多线程(并发)程序是⼀件极困难的事情,并发程序的 Bug 往往会诡异地出现⼜诡异的消失,在当你认为没有问题的时候它就出现了,难以定位 是并发程序的⼀个特征,所以在此基础上你需要有扎实的并发基本功。那么,并发为什么会出现呢?
为什么是并发
计算机世界的快速发展离不开 CPU、内存和 I/O 设备的⾼速发展,但是这三者⼀直存在速度差异性问题,我们可以从存储器的层次结构可以看出
CPU 内部是寄存器的构造,寄存器的访问速度要⾼于⾼速缓存,⾼速缓存的访问速度要⾼于内存,最慢的是磁盘访问。
程序是在内存中执⾏的,程序⾥⼤部分语句都要访问内存,有些还需要访问 I/O 设备,根据漏桶理论
来说,程序整体的性能取决于最慢的操作也就是磁盘访问速度。
因为 CPU 速度太快了,所以为了发挥 CPU 的速度优势,平衡这三者的速度差异,计算机体系机构、操作系统、编译程序都做出了贡献,主要体现为:
CPU 使⽤缓存来中和和内存的访问速度差异
操作系统提供进程和线程调度,让 CPU 在执⾏指令的同时分时复⽤线程,让内存和磁盘不断交互,不同的 CPU 时间⽚ 能够执⾏不同的任务,从⽽均衡这三者的差异
编译程序提供优化指令的执⾏顺序,让缓存能够合理的使⽤
我们在享受这些便利的同时,多线程也为我们带来了挑战,下⾯我们就来探讨⼀下并发问题为什么会出现以及多线程的源头是什么
总结
谈到⾯试,其实说⽩了就是刷题刷题刷题,天天作死的刷。。。。。
为了准备这个“⾦三银四”的春招,狂刷⼀个⽉的题,狂补超多的漏洞知识,像这次美团⾯试问的算法、数据库、Redis、设计模式等这些题⽬都是我刷到过的
并且我也将⾃⼰刷的题全部整理成了PDF或者Word⽂档(含详细答案解析),
66个Java⾯试知识点
架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+⼤⼚⾯试题详解(百度,阿⾥,腾讯,华为,迅雷,⽹易,中兴,北京中软等)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论