Java并发专栏(一)—— Process vs Thread
一.前言
程序是代码和数据的集合,是一种静态实体。不具有代码执行和数据处理的能力,更多是一种行为的描述。
如果将程序和处理器结合,处理器将程序加载至内存,然后执行程序代码处理数据。这时就是可执行的程序。对于可执行的程序,如何描述?
二.进程
定义
进程是程序运行的实例,简单的说,是一个运行的程序。它是计算机操作系统资源分配的最小单位。
表现形式
一般一个程序运行起来,操作系统都会为期创建一个或者多个进程。比如一个java应用启动后,对应一个java的进程。如:
PID COMMAND %CPU TIME #TH #WQ #PORTS MEM PURG CMPRS PGRP PPID STATE
62600 java 0.0 00:00.28 19 2 75 16M 0B 0B 57916 57916 sleeping
资源分配
操作系统创建每个进程时,都为其分配运行时的系统资源:
- 处理器
- 内存
- 文件句柄
等等....
进程状态转换
进程的状态有:new,ready,running,waiting,teminated。这些状态随着操作系统的调度和进程的运行情况会发送切换:
进程创建管理
一个进程可以创建一个或者多个其他子的进程,每个子进程都分配独立的资源,父子进程之间资源的隔离导致其必须通过系统调用才能会话。
操作系统为每个进程维护维护一份数据结构,该数据结构包含了进程的所有信息,叫做PCB(全称Process Control Block),包含进程以下信息:
- 进程识别号;
- 进程状态;
- 程序计数器;
- cpu调度信息;
- 内存管理信息;
- I/O状态信息;
.....等等
三.线程
定义
线程是在进程内的执行实体。上面提到应用程序启动时,会为其创建进程并为其分配相应的系统资源,单同时创建一系列的线程,运行程序代码处理数据。它是计算机操作系统可调度执行的最小单元。
表现
一个进程中创建了多个线程,分别执行程序处理数据。
1.一个进程
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20557 jetty 20 0 2858m 734m 7468 S 0.3 39.1 357:36.03 java
2.多个线程
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20583 jetty 20 0 2858m 734m 7468 S 99.9 39.1 0:13.88 java
20559 jetty 20 0 2858m 734m 7468 S 0.0 39.1 0:18.40 java
20563 jetty 20 0 2858m 734m 7468 S 0.0 39.1 0:05.00 java
20564 jetty 20 0 2858m 734m 7468 S 0.0 39.1 1:11.42 java
20565 jetty 20 0 2858m 734m 7468 S 0.0 39.1 0:00.25 java
关系
- 一般进程创建后会伴随启动一个主线程,主线程中再可以创建额外的子线程;
- 线程都是在进程内,共享进程被分配的资源;
- 在一个进程中的多线程思想和多任务多程序非常类似;
为什么要有多线程
从以上的进程和线程的描述中可以看出:
- 创建进程需要进行大量资源的初始化、分配,非常消耗性能;
- 因为每个进程都拥有自己的隔离资源,所以进程会话需要进行系统调用,进程之间的交互代价高昂;
采用多线程的优势:
- 线程共享进程的资源,减少创建进程时带来的资源分配;
- 线程间可以通过共享资源进行会话;
- 在多核cpu时,可以进行并行处理;
- 线程之间隔离,不影响进程;
参考
Processes and Threads
Processes and Threads
Processes and Threads
附件
Java并发专栏(一)—— Process vs Thread的更多相关文章
- Java并发专栏
1. Java并发 2. 守护线程与非守护线程 3. 为什么启动线程用start()而不用run()? 4. Java线程join方法总结 5. 生产者与消费者 6. wait.notify/noti ...
- Java并发基础(上)——Thread
并发编程可以使我们将程序划分为多个分离的,独立运行的任务.通过多线程机制,这些独立任务都将由执行线程来驱动.在使用线程时,CPU将轮流给每个任务分配占用时间,每个任务都觉得自己在占用CPU,但实际上C ...
- JAVA并发编程——守护线程(Daemon Thread)
在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称 ...
- 【Java并发编程】14、Thread,线程说明
线程的状态:New.Runnable.Blocked.Waiting.Timed waiting.Terminated 1. RUNNABLE,对应"就绪"和"运行&qu ...
- Java并发编程(三)Thread类的使用
一.线程的状态 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以下这几个状态:创建(new).就绪(runnable).运行(running).阻塞(blocked).time wait ...
- 【Java并发系列01】Thread及ThreadGroup杂谈
img { border: solid black 1px } 一.前言 最近开始学习Java并发编程,把学习过程记录下.估计不是那么系统,主要应该是Java API的介绍(不涉及最基础的概念介绍), ...
- Java并发编程:Thread类的使用
Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...
- [转]Java并发的四种风味:Thread、Executor、ForkJoin和Actor
这篇文章讨论了Java应用中并行处理的多种方法.从自己管理Java线程,到各种更好几的解决方法,Executor服务.ForkJoin 框架以及计算中的Actor模型. Java并发编程的4种风格:T ...
- 【转】Java并发编程:Thread类的使用
一.线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于对Thread类中的方法的理解. 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以 ...
随机推荐
- webpack4 打包静态资源
demo 代码点此,开始之前,先做点准备工作. 准备工作 准备一个空文件夹,然后执行下列命令: npm init -y npm i -D webpack webpack-cli 然后创建一个 dist ...
- 【转】Linux上安装rz和sz命令
简介 lrzsz 官网入口:http://freecode.com/projects/lrzsz/ lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议 windows 需要向ce ...
- flink Periodic Watermarks 自定义周期性水印
1.BoundedOutOfOrdernessGenerator /** * This generator generates watermarks assuming that elements ar ...
- Centos7安装elasticSearch6
Elasticsearch6.0 1.Elasticsearch: Elasticsearch是一个基于 ...
- PHP扩展使用-GD
一.相关函数 1. 获取信息 gd_info() #查看当前系统环境gd库支持的图片格式 getimagesize(imagefile) #获取图像大小,非GD库函数 imagex(imagefile ...
- 001-OpenStack-基础环境
OpenStack-基础环境 1.实验描述 通过搭建 OpenStack 的 ocata 版,来学习虚拟化技术 2.实验环境 [你可能需要][CentOS 7 搭建模板机]点我快速打开文章 [你可能需 ...
- 2.3 Scala面向对象编程基础
一.类 1.类的定义 Unit表示什么都不返回 方法体最后一句的值,就是方法的返回值. 2.类成员的可见性 3.方法的定义方式 定义方法的时候加圆括号,调用时可以加圆括号c.getValue()也可以 ...
- FFMPEG+SDL实现视频播放器
一. 前言 基于学习ffmpeg和sdl,写一个视频播放器是个不错的练手项目. 视频播放器的原理很多人的博客都有讲过,这里出于自己总结的目的,还是会做一些概况. 二. 视频播放器基本原理 2.1 解封 ...
- 201871010132--张潇潇--《面向对象程序设计(java)》第十六周学习总结
博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh 这个作业的要求在哪里 https://www.cnblogs.c ...
- XSS-Stored
存储型XSS (持久性XSS) 将恶意JavaScript代码存储在数据库,当下次用户浏览的时候执行 Low <?php if( isset( $_POST[ 'btnSign' ] ) ) { ...