前言

不知道你们发现没有,在很多互联网公司基本上都是80后,90后居多,很少还有超过40岁的程序员。可能很多人心里都有一个疑问,那就是这些40多岁的程序员都干嘛去了呢?创业显然只是极少数的人,至于管理岗,一个公司也不过几个人而已,更多的人显然已经不再从事这个行业了,难道真的只能提前退休了吗?

并发历史

在计算机最早期的时候,没有操作系统,执行程序只需要一个过程,那就是从头到尾依次执行。任何资源都会为这个程序服务,这必然就会存在 浪费资源 的情况。

这里说的浪费资源指的是资源空闲,没有充分使用的情况。

操作系统为我们的程序带来了 并发性,操作系统使我们的程序同时运行多个程序,一个程序就是一个进程,也就相当于同时运行了多个进程。

操作系统是一个并发系统,并发性是操作系统非常重要的特征,操作系统具有同时处理和调度多个程序的能力,比如多个 I/O 设备同时在输入输出;设备 I/O 和 CPU 计算同时进行;内存中同时有多个系统和用户程序被启动交替、穿插地执行。操作系统在协调和分配进程的同时,操作系统也会为不同进程分配不同的资源。

操作系统实现多个程序同时运行解决了单个程序无法做到的问题,主要有下面三点

  • 资源利用率,我们上面说到,单个进程存在资源浪费的情况,举个例子,当你在为某个文件夹赋予权限的时候,输入程序无法接受外部的输入字符,只能等到权限赋予完毕后才能接受外部输入。综合来讲,就是在等待程序时无法执行其他工作。如果在等待程序的同时可以运行另一个程序,那么将会大大提高资源的利用率。(资源并不会觉得累)因为它不会划水~
  • 公平性,不同的用户和程序对于计算机上的资源有着同样的使用权。一种高效的运行方式是为不同的程序划分时间片使用资源,但是有一点需要注意,操作系统可以决定不同进程的优先级,虽然每个进程都有能够公平享有资源的权利,但是每次前一个进程释放资源后的同时有一个优先级更高的进程抢夺资源,就会造成优先级低的进程无法获得资源,久而久之会导致进程饥饿。
  • 便利性,单个进程是无法通信的,通信这一点我认为其实是一种避雷针策略,通信的本质就是信息交换,及时进行信息交换能够避免信息孤岛,做重复性的工作;任何并发能做的事情,顺序编程也能够实现,只不过这种方式效率很低,它是一种 阻塞式 的。

但是,顺序编程(也称为串行编程)也不是一无是处的,串行编程的优势在于其直观性和简单性,客观来讲,串行编程更适合我们人脑的思考方式,但是我们并不会满足于顺序编程,we want it more!!! 。资源利用率、公平性和便利性促使着进程出现的同时也促使着线程的出现。

如果你还不是很理解进程和线程的区别的话,那么我就以我多年操作系统的经验(吹牛逼,实则半年)来为你解释一下:进程是一个应用程序,而线程是应用程序中的一条顺序流

线程会共享进程范围内的资源,例如内存和文件句柄,但是每个线程也有自己私有的内容,比如程序计数器、栈以及局部变量。下面汇总了进程和线程共享资源的区别

线程被描述为一种轻量级的进程,轻量级体现在线程的创建和销毁要比进程的开销小很多。

注意:任何比较都是相对的。

在大多数现代操作系统中,都以线程为基本的调度单位,所以我们的视角着重放在对线程的探究。

线程

优势和劣势

合理使用线程是一门艺术,合理编写一道准确无误的多线程程序更是一门艺术,如果线程使用得当,能够有效的降低程序的开发和维护成本。

在 GUI 中,线程可以提高用户界面的响应灵敏度,在服务器应用程序中,并发可以提高资源利用率以及系统吞吐率。

Java 很好的在用户空间实现了开发工具包,并在内核空间提供系统调用来支持多线程编程,Java 支持了丰富的类库 java.util.concurrent 和跨平台的内存模型,同时也提高了开发人员的门槛,并发一直以来是一个高阶的主题,但是现在,并发也成为了主流开发人员的必备素质。

虽然线程带来的好处很多,但是编写正确的多线程(并发)程序是一件极困难的事情,并发程序的 Bug 往往会诡异地出现又诡异的消失,在当你认为没有问题的时候它就出现了,难以定位 是并发程序的一个特征,所以在此基础上你需要有扎实的并发基本功。那么,并发为什么会出现呢?

为什么是并发

计算机世界的快速发展离不开 CPU、内存和 I/O 设备的高速发展,但是这三者一直存在速度差异性问题,我们可以从存储器的层次结构可以看出

CPU 内部是寄存器的构造,寄存器的访问速度要高于高速缓存,高速缓存的访问速度要高于内存,最慢的是磁盘访问。

程序是在内存中执行的,程序里大部分语句都要访问内存,有些还需要访问 I/O 设备,根据漏桶理论来说,程序整体的性能取决于最慢的操作也就是磁盘访问速度。

因为 CPU 速度太快了,所以为了发挥 CPU 的速度优势,平衡这三者的速度差异,计算机体系机构、操作系统、编译程序都做出了贡献,主要体现为:

  • CPU 使用缓存来中和和内存的访问速度差异
  • 操作系统提供进程和线程调度,让 CPU 在执行指令的同时分时复用线程,让内存和磁盘不断交互,不同的 CPU 时间片 能够执行不同的任务,从而均衡这三者的差异
  • 编译程序提供优化指令的执行顺序,让缓存能够合理的使用

我们在享受这些便利的同时,多线程也为我们带来了挑战,下面我们就来探讨一下并发问题为什么会出现以及多线程的源头是什么

最后

毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节

美团面试经验


字节面试经验

菜鸟面试经验

蚂蚁金服面试经验

唯品会面试经验

因篇幅有限,图文无法详细发出,感兴趣的朋友可以点击这里前往我的腾讯文档免费获取上述资料!

有限,图文无法详细发出,感兴趣的朋友可以点击这里前往我的腾讯文档免费获取上述资料!

学海无涯!我总结了所有面试题,含答案解析相关推荐

  1. java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...

    面试题集共分为以下十部分: 一.Core Java: 1 - 95 题1 - 24 页 基础及语法: 1 - 61 题1 - 13 页 异常: 62 - 69 题13 - 15 页 集合: 70 - ...

  2. 北大青鸟Java内侧答案_北大青鸟推荐:Java精选笔试题(含答案解析)

    北大青鸟推荐:Java精选笔试题(含答案解析)如果你是计算机专业出生,但是还没有找到工作的话,你就得补补技术了,一些关于面试.笔试的题要多刷一刷.有可能你知道答案,但是由于语言组织能力有所欠缺,所以面 ...

  3. php笔试题及答案网易,2020网易前端面试题含答案解析

    需要更多的面试题点击下面链接查看,有很多: 另外这是小编做的视频希望可以帮助到你: 『HTML+CSS』漂亮小姐姐教你制作暗黑破坏神网页开发:BV1C54y1X7ro 前端发展简史,功能以及未来趋势! ...

  4. java面试题_2020年1-6月份Java面试题总结,20多类1100道面试题含答案解析

    ​ 很多程序员都会担心35岁的职业危机,而数据也显示,40岁以上的程序员几乎不存在,大都转了管理岗,余下的只能被迫离职或者转行.然而,太久待在舒适区,可能连小公司的面试,都很难通过了. 程序员是最需要 ...

  5. 2020年1-6月份Java面试题总结,20多类1100道面试题含答案解析

    很多程序员都会担心35岁的职业危机,而数据也显示,40岁以上的程序员几乎不存在,大都转了管理岗,余下的只能被迫离职或者转行.然而,太久待在舒适区,可能连小公司的面试,都很难通过了. 程序员是最需要将终 ...

  6. 紫金计算机网络,南京理工大学紫金学院《计算机网络技术》考试复习试题试题(含答案解析)2...

    一.选择题:(每题2分,共40分) 1.在TCP/IP参考模型中,TCP协议工作在(). A.应用层 B.传输层 C.互联网层 D.网络接口层2.下列()是合法的E-mail地址. A.mnetwor ...

  7. jquery级试题_腾讯2020前端面试题含答案解析

    程序猿的生活:打造全网web前端全栈资料库(总目录)看完学的更快,掌握的更加牢固,你值得拥有(持续更新)​zhuanlan.zhihu.com 1 在jquery 中想要找到所有元素的同辈元素,下面哪 ...

  8. 紫金计算机网络,南京理工大学紫金学院《计算机网络技术》考试复习试题试题[含答案解析]...

    一.选择题:(每题2分,共40分) 1.在TCP/IP参考模型中,TCP协议工作在(). A.应用层 B.传输层 C.互联网层 D.网络接口层2.下列()是合法的E-mail地址. A.mnetwor ...

  9. 2017计算机软件考试试题,2017年计算机应用考试试题含答案.doc

    文档介绍: 2017年计算机应用考试试题含答案.doc2017年计算机应用考试试题含答案 2017年计算机应用考试试题(含答案) 一.单项选择题 1.下列关于软件的叙述中,正确的是 . A.计算机软件 ...

  10. 微型计算机主存可以分为,计算机基础试题 (含答案)

    计算机基础试题 (含答案) 一.填空题(每空1分,共30分) 1.计算计的软件系统通常分成______软件和______软件. 2.字长是计算机______次能处理的______进制位数. 3.1KB ...

最新文章

  1. python 销量预测模型_如何做电商的销量预测模型?
  2. 百度的云智一体,让视频变得“硬核性感”
  3. 美团架构师开发平台架构之容器技术实践!
  4. python点到向量的距离,夹角
  5. Flash,EEPROM区别
  6. boost::contract模块日历的测试程序
  7. Entity Framework6学习笔记(一)
  8. HDLBits答案(25)_编写Testbench
  9. 李兰娟院士等新冠病毒鸡尾酒疗法研究取得新进展
  10. POJ-3061 Subsequence 二分或尺取
  11. GitHub student pack
  12. zeromq源码分析笔记之架构
  13. [渝粤教育] 西南科技大学 土木工程材料 在线考试复习资料
  14. Python 编写规范
  15. secoclient免积分下载
  16. IDEA和webstorm破解方式
  17. delphi源码分析
  18. 3D游戏学习 案例游戏设计分析——英雄联盟设计浅析
  19. ad中那个快捷键是重复上一部_Rhino快速建模(快捷键和快捷键的巨集的建立)...
  20. 记一次搭建 nodebb 论坛

热门文章

  1. cyclone小知识(三)——cyclone导入多种格式数据
  2. matlab符号运算与数值运算的转化
  3. 趋高机器视觉之机械手臂的应用
  4. 美国克莱姆森大学计算机专业排名,美国西北大学计算机专业排名怎么样?
  5. GetLastError 错误代码
  6. 在线latex的一些操作
  7. micropython(3):使用thonny ide 开发,并控制 LED 设备
  8. java else 语法错误_Java中带有else的语法错误
  9. 1946年2月14号第一台计算机,1946年2月14日 世界上第一台计算机诞生,世界,您好!...
  10. Oracle 11gR2光钎链路切换crs服务发生crash