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多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
随机推荐
- python2和python3区别
字符编码: py3中默认字符编码是unicode:py2中默认字符编码是 ASCII,如果文件中出现了中文,需要在顶部加入coding声明#coding:utf8 让用户输入:py3中直接使用inpu ...
- ORACLE批量导入图片到BLOB字段
要插入图片的表不是固定的,而且是批量插入很多张,还要考虑到因为图片的文件名错误,修改后要再次插入,此时应避免已经插入的重复执行操作, 浪费时间. 所以就选择先用一张临时表来暂时保存从文件系统读取的照片 ...
- Js 之常见手势操作插件 Hammer.js
一.下载 链接:https://pan.baidu.com/s/1UbEtSbT1xcmdzzTCaWmW1A提取码:ldqy 二.案例 三.代码 <!DOCTYPE html> < ...
- css让文字竖着排列 writing-mode 属性
writing-mode 属性 writing-mode 属性定义了文本在水平或垂直方向上如何排布. 语法格式如下: writing-mode: horizontal-tb | vertical-rl ...
- final和finally和finalize的区别
final 修饰类,不能被继承 修饰方法,不能被重写 修饰变量,只能赋值一次 finally 是try语句中的一个语句体,不能单独使用,用来释放资源 finalize 是一个方法,当垃圾回收器确定不存 ...
- Kibana的安装与配置
Kibana的安装与配置 配置 [root@es01 kibana-5.6.3-linux-x86_64]# egrep -v '^$|^#' config/kibana.yml server.hos ...
- 常用sql2
mysql中的NULL的判断 mysql> delete from `zhangchao` where x='NULL'; Query OK, 0 rows affected (0.00 ...
- osg 3ds模型加载与操作
QString item1 = QString::fromStdString(groupParam->getChild(k)->getName()); QStandardItem* ite ...
- python中列表,元组的乘法
直接上code吧,还可以这么玩儿 li=[1,] li=li*3 print(li) out: [1, 1, 1] =========== >>> t=(1,2) >>& ...
- Node.jsp配环境更新中)
设置用户密码sudo passwd user1sudo passwd root 创建新用户sudo useradd -d /home/share -m sharesu share设置新用户密码sudo ...