ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

帮助程序员提高核心竞争力的30条建议,已有千人收藏

2021-07-06 09:01:49  阅读:178  来源: 互联网

标签:Java 操作系统 并发 千人 30 程序 程序员 线程 进程


## 并发历史 在计算机最早期的时候,没有操作系统,执行程序只需要一个过程,那就是从头到尾依次执行。任何资源都会为这个程序服务,这必然就会存在?`浪费资源`?的情况。 > 这里说的浪费资源指的是资源空闲,没有充分使用的情况。 操作系统为我们的程序带来了?`并发性`,操作系统使我们的程序同时运行多个程序,一个程序就是一个进程,也就相当于同时运行了多个进程。 操作系统是一个`并发系统`,并发性是操作系统非常重要的特征,操作系统具有同时处理和调度多个程序的能力,比如多个 I/O 设备同时在输入输出;设备 I/O 和 CPU 计算同时进行;内存中同时有多个系统和用户程序被启动交替、穿插地执行。操作系统在协调和分配进程的同时,操作系统也会为不同进程分配不同的资源。 操作系统实现多个程序同时运行解决了单个程序无法做到的问题,主要有下面三点 * `资源利用率`,我们上面说到,单个进程存在资源浪费的情况,举个例子,当你在为某个文件夹赋予权限的时候,输入程序无法接受外部的输入字符,只能等到权限赋予完毕后才能接受外部输入。综合来讲,就是在等待程序时无法执行其他工作。如果在等待程序的同时可以运行另一个程序,那么将会大大提高资源的利用率。(资源并不会觉得累)因为它不会划水~ * `公平性`,不同的用户和程序对于计算机上的资源有着同样的使用权。一种高效的运行方式是为不同的程序划分时间片使用资源,但是有一点需要注意,操作系统可以决定不同进程的优先级,虽然每个进程都有能够公平享有资源的权利,但是每次前一个进程释放资源后的同时有一个优先级更高的进程抢夺资源,就会造成优先级低的进程无法获得资源,久而久之会导致进程饥饿。 * `便利性`,单个进程是无法通信的,通信这一点我认为其实是一种`避雷针`策略,通信的本质就是`信息交换`,及时进行信息交换能够避免`信息孤岛`,做重复性的工作;任何并发能做的事情,顺序编程也能够实现,只不过这种方式效率很低,它是一种?`阻塞式`?的。 但是,顺序编程(也称为`串行编程`)也不是`一无是处`的,串行编程的优势在于其**直观性和简单性**,客观来讲,串行编程更适合我们人脑的思考方式,但是我们并不会满足于顺序编程,**we want it more!!!**?。资源利用率、公平性和便利性促使着进程出现的同时也促使着`线程`的出现。 如果你还不是很理解进程和线程的区别的话,那么我就以我多年操作系统的经验(吹牛逼,实则半年)来为你解释一下:**进程是一个应用程序,而线程是应用程序中的一条顺序流**。 ![](http://www.icode9.com/i/li/?n=2&i=images/20210706/1625533009539129.jpg) ![](http://www.icode9.com/i/li/?n=2&i=images/20210706/1625533009614473.jpg) 线程会共享进程范围内的资源,例如内存和文件句柄,但是每个线程也有自己私有的内容,比如程序计数器、栈以及局部变量。下面汇总了进程和线程共享资源的区别 ![](http://www.icode9.com/i/li/?n=2&i=images/20210706/1625533009401974.jpg) 线程被描述为一种`轻量级`的进程,轻量级体现在线程的创建和销毁要比进程的开销小很多。 > 注意:任何比较都是相对的。 在大多数现代操作系统中,都以线程为基本的调度单位,所以我们的视角着重放在对线程的探究。 ## 线程 ### 优势和劣势 合理使用线程是一门艺术,合理编写一道准确无误的多线程程序更是一门艺术,如果线程使用得当,能够有效的降低程序的开发和维护成本。 在 GUI 中,线程可以提高用户界面的响应灵敏度,在服务器应用程序中,并发可以提高资源利用率以及系统吞吐率。 Java 很好的在用户空间实现了开发工具包,并在内核空间提供系统调用来支持多线程编程,Java 支持了丰富的类库?`java.util.concurrent`?和跨平台的`内存模型`,同时也提高了开发人员的门槛,并发一直以来是一个高阶的主题,但是现在,并发也成为了主流开发人员的必备素质。 虽然线程带来的好处很多,但是编写正确的多线程(并发)程序是一件极困难的事情,并发程序的 Bug 往往会诡异地出现又诡异的消失,在当你认为没有问题的时候它就出现了,`难以定位`?是并发程序的一个特征,所以在此基础上你需要有扎实的并发基本功。那么,并发为什么会出现呢? ### 为什么是并发 计算机世界的快速发展离不开 CPU、内存和 I/O 设备的高速发展,但是这三者一直存在速度差异性问题,我们可以从存储器的层次结构可以看出 ![](http://www.icode9.com/i/li/?n=2&i=images/20210706/1625533009871513.jpg) CPU 内部是寄存器的构造,寄存器的访问速度要高于`高速缓存`,高速缓存的访问速度要高于内存,最慢的是磁盘访问。 程序是在内存中执行的,程序里大部分语句都要访问内存,有些还需要访问 I/O 设备,根据漏桶理论来说,程序整体的性能取决于最慢的操作也就是磁盘访问速度。 因为 CPU 速度太快了,所以为了发挥 CPU 的速度优势,平衡这三者的速度差异,计算机体系机构、操作系统、编译程序都做出了贡献,主要体现为: * CPU 使用缓存来中和和内存的访问速度差异 * 操作系统提供进程和线程调度,让 CPU 在执行指令的同时分时复用线程,让内存和磁盘不断交互,不同的?`CPU 时间片`?能够执行不同的任务,从而均衡这三者的差异 * 编译程序提供优化指令的执行顺序,让缓存能够合理的使用 我们在享受这些便利的同时,多线程也为我们带来了挑战,下面我们就来探讨一下并发问题为什么会出现以及多线程的源头是什么 # 最后分享一波我的面试宝典——一线互联网大厂Java核心面试题库 **以下是我个人的一些做法,希望可以给各位提供一些帮助:** > **[点击《一线互联网大厂Java核心面试题库》即可免费领取](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)**,整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新...可star一下! ![image](http://www.icode9.com/i/li/?n=2&i=images/20210706/1625533010901240.jpg) **283页的Java进阶核心pdf文档** > Java部分:Java基础,集合,并发,多线程,JVM,设计模式 > > 数据结构算法:Java算法,数据结构 > > 开源框架部分:Spring,MyBatis,MVC,netty,tomcat > > 分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等 > > 微服务部分:SpringBoot,SpringCloud,Dubbo,Docker ![image](http://www.icode9.com/i/li/?n=2&i=images/20210706/1625533010945160.jpg) **还有源码相关的阅读学习** ![image](http://www.icode9.com/i/li/?n=2&i=images/20210706/1625533010209205.jpg)

标签:Java,操作系统,并发,千人,30,程序,程序员,线程,进程
来源: https://blog.51cto.com/u_15290980/2985388

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有