一.前言

程序是代码和数据的集合,是一种静态实体。不具有代码执行和数据处理的能力,更多是一种行为的描述。

如果将程序和处理器结合,处理器将程序加载至内存,然后执行程序代码处理数据。这时就是可执行的程序。对于可执行的程序,如何描述?

二.进程

定义

进程是程序运行的实例,简单的说,是一个运行的程序。它是计算机操作系统资源分配的最小单位。

表现形式

一般一个程序运行起来,操作系统都会为期创建一个或者多个进程。比如一个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

关系

  • 一般进程创建后会伴随启动一个主线程,主线程中再可以创建额外的子线程;
  • 线程都是在进程内,共享进程被分配的资源;
  • 在一个进程中的多线程思想和多任务多程序非常类似;

为什么要有多线程

从以上的进程和线程的描述中可以看出:

  1. 创建进程需要进行大量资源的初始化、分配,非常消耗性能;
  2. 因为每个进程都拥有自己的隔离资源,所以进程会话需要进行系统调用,进程之间的交互代价高昂;

采用多线程的优势:

  1. 线程共享进程的资源,减少创建进程时带来的资源分配;
  2. 线程间可以通过共享资源进行会话;
  3. 在多核cpu时,可以进行并行处理;
  4. 线程之间隔离,不影响进程;
参考

Processes and Threads

Processes and Threads

Processes and Threads

附件

Processes and Threads.pdf

Java并发专栏(一)—— Process vs Thread的更多相关文章

  1. Java并发专栏

    1. Java并发 2. 守护线程与非守护线程 3. 为什么启动线程用start()而不用run()? 4. Java线程join方法总结 5. 生产者与消费者 6. wait.notify/noti ...

  2. Java并发基础(上)——Thread

    并发编程可以使我们将程序划分为多个分离的,独立运行的任务.通过多线程机制,这些独立任务都将由执行线程来驱动.在使用线程时,CPU将轮流给每个任务分配占用时间,每个任务都觉得自己在占用CPU,但实际上C ...

  3. JAVA并发编程——守护线程(Daemon Thread)

    在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称 ...

  4. 【Java并发编程】14、Thread,线程说明

    线程的状态:New.Runnable.Blocked.Waiting.Timed waiting.Terminated 1. RUNNABLE,对应"就绪"和"运行&qu ...

  5. Java并发编程(三)Thread类的使用

    一.线程的状态 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以下这几个状态:创建(new).就绪(runnable).运行(running).阻塞(blocked).time wait ...

  6. 【Java并发系列01】Thread及ThreadGroup杂谈

    img { border: solid black 1px } 一.前言 最近开始学习Java并发编程,把学习过程记录下.估计不是那么系统,主要应该是Java API的介绍(不涉及最基础的概念介绍), ...

  7. Java并发编程:Thread类的使用

    Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...

  8. [转]Java并发的四种风味:Thread、Executor、ForkJoin和Actor

    这篇文章讨论了Java应用中并行处理的多种方法.从自己管理Java线程,到各种更好几的解决方法,Executor服务.ForkJoin 框架以及计算中的Actor模型. Java并发编程的4种风格:T ...

  9. 【转】Java并发编程:Thread类的使用

    一.线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于对Thread类中的方法的理解. 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以 ...

随机推荐

  1. wpf 工程生成dll

    在WPF项目里,当工程里包含窗体时候, 不可以使用类库的方式生产dll,虽然系统支持引用exe 文件,但总是觉得不如dll习惯,后来发现,新建个项目,类型选择“WPF自定义类件库”,名称和工程名称相同 ...

  2. Scrum 冲刺第一篇

      我们是这次稳了队,队员分别是温治乾,黄思扬,莫少政,余泽端,江海灵 码云地址为:https://gitee.com/sixers/activityWall-Web 一.各个成员在 Alpha 阶段 ...

  3. Linux进程管理 (篇外)内核线程简要介绍【转】

    转自:https://www.cnblogs.com/arnoldlu/p/8336998.html 关键词:kthread.irq.ksoftirqd.kworker.workqueues 在使用p ...

  4. JAVA基础复习day-01

    1.基础语法 1.1.基础语法规则 1.1.1.Java代码实现 代码示例: public class Hello{ public static void main(String[] args){ S ...

  5. LeetCode 669. Trim a Binary Search Tree修剪二叉搜索树 (C++)

    题目: Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so th ...

  6. flask 搭建简单restful接口,moco基础

    from flask import Flask, jsonify, abort, make_response app = Flask(__name__)app.config['JSON_AS_ASCI ...

  7. 简析平衡树(四)——FHQ Treap

    前言 好久没码过平衡树了! 这次在闪指导的指导下学会了\(FHQ\ Treap\),一方面是因为听说它可以可持久化,另一方面则是因为听说它是真的好写. 简介 \(FHQ\ Treap\),又称作非旋\ ...

  8. windwos文件句柄数限制

    1.修改注册表,位置如下: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Windows 2.设置 1.GDIProc ...

  9. [LeetCode] 694. Number of Distinct Islands 不同岛屿的个数

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  10. python3中用django下载文件,中文名乱码怎么办?

    前段时间被某个前端小可爱鄙视了一下,说我博客都一年不更新了,我不服,明明还有俩月才到一年呢.不过说是这么说,还是要更新一下的. 以上都是借口,下面开始正文.     我公司的某个内部系统,用djang ...