一.前言

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

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

二.进程

定义

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

表现形式

一般一个程序运行起来,操作系统都会为期创建一个或者多个进程。比如一个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. vuex防止数据刷新数据刷掉

    replaceState replaceState(state: Object) 替换store的根状态,仅用状态合并或者时光旅行调试 // 在页面加载时读取localStorage里的状态信息 if ...

  2. 第九届极客大挑战——怎么又是江师傅的秘密(java反序列化)

    这道题其实是考jsp和java的,我没学过jsp,java倒是有一点了解,但是刚拿到题的时候还是看不懂java代码里的内容,所以去简单学习了下jsp(jsp教程),按照教程里的步骤搭建了eclipse ...

  3. PHP数组相关算法

    一.排序算法 1. 冒泡排序 2. 选择排序 二.查找算法 1. 遍历 2. 二分查找

  4. Linux系统中的load average(平均负载/运行队列)

    1.load average 的含义 系统负载(System Load)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度) linux系统中的Load对当前CPU工作量的 ...

  5. Unity编辑器汉化(中文语言包)

    前言 Unity官方已提供编辑器的中文语言包 在官方的帮助文档中选择中文语言 下载方法 方法一:通过Unity Hub 下载 Windows: https://public-cdn.cloud.uni ...

  6. css 最后的终章

    相对定位:参考点 相对原来的位置 1.如果是一个单独的文档流盒子,及你姐设置了相对定位,和普通盒子一样 2.相对定位后,如果调整位置,会留下坑 作用:微调元素 子绝父相 提升层级 绝对定位 参考点:父 ...

  7. Ubuntu16.04安装flume

    参考:https://www.cnblogs.com/soyo/p/7686702.html

  8. isinstance、issubbclass

    目录 isinstance issubclass subclasses Python提供了如下两个函数来检查类型: isinstance(obj, class_or_tuple):检查 obj 是否为 ...

  9. Shell编程——环境变量

    在Shell程序启动时会自动定义一组变量,这组变量就是环境变量,系统中的所有命令都可以使用这些变量参数. 1.如果在父Shell定义环境变量,在子Shell中也能查看到. (1)父Shell与子She ...

  10. linux帮助命令使用

    一. help使用 查看ls命令的帮助信息 ls --help            # 查看全部 ls --help | less   # 分页查看, q退出 二. man手册 同一命令存在于多个章 ...