java多线程上篇(一)
操作系统与程序运行以及进程简介
一、线程与操作系统
操作系统是对计算机硬件资源的管理程序,是应用程序与计算机硬件交互的中间层,其本质仍旧是运行于硬件电路上的程序
对计算机硬件来说不存在操作系统,只是处理器对指令的执行,不过操作系统是一个特殊一点的程序。 所以不管你用了多少技术,框架,模式,实现了怎么样的协议与功能,原理是什么,也只是人类意识层面上的内容,到底层只有指令。
所以,运行于计算机之上的这一切都只是程序
这些程序经过指定的步骤,从高级到低级,从人类可以理解到无法识别,最终转换为计算机可以识别的指令。


(一)、什么是程序
遵循某种语言的源代码经过编译、翻译等步骤转换后的一组计算机能识别和执行的指令,这就是程序。
操作系统将程序的一次运行抽象为进程
简言之,如果 你(处理器)按照 菜谱(程序)去 做菜(执行程序),这个过程就叫做 下厨做饭(进程)

还有一个概念是进程上下文,刚才说到现代系统还可以并发的执行多道程序,必然存在着CPU的切换,进程间的切换,也被称之为上下文切换。
通俗比喻:如果只有一个厨房,你做菜做一半了,然后需要让出来厨房让别人做,你需要做什么?收拾好你的食材,记住你刚才食材放置的位置以及处理的进度,哪个菜洗过了?盐放过了么?。。。等等这些数据就是进程上下文,当别人撤出去之后,你需要将这些状态还原,这就是上下文切换。
(二)、并发并行
下面这幅图可以很好地解释并发与并行
一个咖啡机两个队伍,就是并发;两个咖啡机,两个队伍,就是并行。
(三)、多线程
单核CPU
对于一个单CPU系统,对于多任务的实现就是并发,操作系统不断地进行着切换,将时间片分配给不同的程序,以看起来像多个程序是共同运行的。
然而单核场景下,尽管多线程在有些场景下可以提高CPU的利用率,但是对于单CPU系统(单核)系统,在有些场景下,反而会降低整体性能。
多核CPU
随着技术的发展, 能够装载的核心数目越来越多。对于多核CPU,能够真正的做到在同一瞬时,执行多个线程,是真正的并行。
所以很显然,这种场景对于真正的并行,不管你的程序任务是什么样子的,对于多线程程序,必然能够提高程序的执行速度。
二、总结
不管是进程还是线程,都是操作系统对于程序执行的抽象描述,是相关数据:寄存器状态、堆栈值等所有相关数据的集合。通过进程的相关信息的维护管理,操作系统保障多道程序可以顺利的切换执行;而对于多线程的应用程序,需要开发者对线程的数据等相关信息进行控制,以保证多线程间可以正确的运行。
保障资源的互斥访问是为了保证程序的正确性,否则再快的程序也没有意义;如果编写的程序非常的不合理,逻辑不清晰,反而可能会带来性能问题,而不是提高效率。所以多线程相关的技术的确很复杂,而且非常容易出错,而且学习成本很高,但是,他终归是为了提高CPU的利用率的同时并且保障临界资源的正确访问。
进行概念详解
(一)、进程
道程序出现之后,程序需要并发的执行,计算机的资源是共享的,而不再是某一程序运行后独享

(1)程序实体
1. 进程本身的信息(现在谁在用厨房?现在盆盆罐罐都被你放了什么?)
2. 可执行的代码是哪些?(菜谱步骤是什么?)
3. 程序运行所需要的数据是什么?(食材是什么?佐料又是什么?)

(2)进程特征
1. 动态性 2. 并发性 3. 独立性 4.异步性

(二)进程状态
(1)基本状态
创建、就绪、执行、阻塞、终止
其中核心是:就绪、执行、阻塞


如果一个正在执行的程序遇到了IO请求,这通常是比较耗时的,进程会进入阻塞状态,进入阻塞状态的进程一旦获得了想要的结果,比如IO完成,那么就再次进入就绪状态,等待CPU的临幸。
(2)挂起状态

比如资源不充足时,将一些不重要的进程暂时挂起,挂起是真正的暂停执行,是一种主动式的管理,阻塞则是被动的,挂起也意味着置换到外存中,而不是内存中。
一个静止阻塞的状态就相当于在外存中等待一个事件的完成,事件完成后,进入静止就绪状态,他此时还是不会得到CPU的调度,激活后才有机会得到CPU临幸
(3)终止状态的转换
(三)、PCB( process control block)进程控制块
进程是对于程序执行的抽象描述,那么进程控制块,这个对进程的描述,就相当于进程的元数据,用于描述进程本身。
所以说,他就是一个数据结构,记录了用于控制管理进程的各个数据项。
可见,在进程的整个生命期中,系统总是通过 PCB对进程进行控制的,亦即,系统是根据进程的PCB而不是任何别的什么而感知到该进程的存在的。
PCB是进程存在的惟一标志。

- 进程标识符
- 计算机状态
- 进程调度信息
- 进程控制信息
为了能对它们加以有效的管理,应该用适当的方式将这些PCB组织起来。目前常用的组织方式有以下两种。

(四)、进程掌控的三座大山
进程控制、进程同步、进程通信
(五)、总结
进程作为操作系统对程序执行的抽象,那么就使用了足够多的数据项对进程进行描述,所有的信息都是为了进程的管理、维护、调度、切换等。
进程看似复杂,原理也是如此,操作系统使用多个数据项(数据结构)对程序的执行进行描述,然后定义了一整套的操作逻辑与规则。
进程有状态信息,操作系统负责管理状态的切换,那么必然需要记录进程的状态信息,既然是轮流分配时间片,就好像去办理业务,排队等待一样,但是无数个场景下都有VIP的存在,进程也是,也有优先级的概念计算机的程序最终会转换为一条条的指令,每一条指令的执行都需要借助于程序计数器,程序计数器是用于存放下一条指令所在单元的地址的地方,所以想要知道并且记住程序执行的进度位置,还需要掌握程序计数器的值。
想要更好地管理进程,那么必然还会有一些统计信息,比如某进程运行了多久等记录统计信息,这些重要的信息都保存在进程的PCB中,所以说PCB是进程概念的核心,有了PCB程序才有并发执行的能力,通常,通常情况下,创建进程指的就是创建PCB。
简言之,操作系统对进程的抽象就是对于一组数据结构以及操作这些数据结构的规则逻辑的实现。
感谢: https://www.cnblogs.com/noteless/p/10350112.html
java多线程上篇(一)的更多相关文章
- java多线程上篇(二) -- 进程的控制、同步
一.进程的控制 进程的基本数据信息是操作系统控制管理进程的数据集合,这些信息就是用来控制进程的,此处我们说的进程控制就是进程的管理. 比如进程有状态,那么进程的创建.终止,状态的切换,这都不是进程自主 ...
- java多线程上篇(三) -- 进程通信和线程死锁简单介绍
进程通信指的是进程间的信息交换 ,IPC(Inter-Process Communication,进程间通信) 进程通信就相当于一种工作方式.沟通形式,进程通信主要指的就是操作系统提供的进程通信工具( ...
- Java多线程概念简介 多线程中篇(一)
Java的线程与操作系统的线程 在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...
- Java多线程4:Thread中的静态方法
一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...
- java 多线程3:Thread类中的静态方法
Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...
- java多线程(四)
使用synchronized锁实现线程同步 为什么要用线程同步 我们先来看下这段代码的运行结果: Java学习交流群:495273252 在多线程上篇博客已经介绍过了,JVM采用的是抢占式调度模型,当 ...
- java多线程的操作
上篇博客简单了介绍了Java的多线程的概念,与进程的区别,两种创建方式,状态及获取线程名称等内容.这篇文章接着介绍Java的多线程.主要从一下几方面介绍. 1 线程类的常用方法 1.1 start() ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
随机推荐
- mac 安装rabbitmq出现的问题
一直提示这个文件权限问题. 然后试了各种办法.chown user:group / chmod 777 等等.都没有解决. 最后查到 chmod 666 /users/xxx/.erlang.cook ...
- PHP 多维数组 根据字段排序
这个太常用了,记录下.方便后面用 /** * @param $arr [要排序的数组] * @param $condition [要排序的条件, for array('id'=>SORT_DES ...
- PHP开发高可用高安全App后端☆
第1章 本章先讲解课程所含技术点,并演示相关的项目,让小伙伴对课程有个初步的认知,然后再带领小伙伴进行功能的分析,表的ER总关系图 第2章本章主要讲解课程的一些准备工作知识.包括工具.环境.模板等. ...
- Tkinter 之Menu菜单标签
一.参数说明 语法 作用 MenuBar = tk.Menu(window) 创建一个菜单栏 fileBar = tk.Menu(MenuBar, tearoff=0) 创建一个菜单项,不分窗. Me ...
- linux服务器执行cd和ls等等命令都有卡顿现象问题记录
一 执行命令free -gh 1. free 命令显示系统内存的使用情况,包括物理内存.交换内存(swap)和内核缓冲区内存. 2. -g 表示以G单位显示, -m以兆单位显示, h会在数字后面 ...
- Redis学习(一) —— 基本使用与原理
一.数据结构 string Redis字符串是可修改字符串,在内存中以字节数组形式存在. 下面是string在源码中的定义,SDS(Simple Dynamic String) struct SDS& ...
- Vue源码分析(一) : new Vue() 做了什么
Vue源码分析(一) : new Vue() 做了什么 author: @TiffanysBear 在了解new Vue做了什么之前,我们先对Vue源码做一些基础的了解,如果你已经对基础的源码目录设计 ...
- NLog用法
NLog是什么 NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.NLog是一个简单灵活的.NET日志记录类库.通过使用NLog,我们可以在任何一种 ...
- python arcgis
- 留个纪念,过了这么多年,又干回Android了!
这个博客中的好多Android知识已经老得不像样子了,没想到,还有干回来的一天.怎么说呢,只要坚持一下,总会有机会能做自己爱做的事情的. 加油! ---- 于武汉出差的第5天