一.前言

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

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

二.进程

定义

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

表现形式

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

    在去年的9月26日,Oracle官方宣布Java11正式发布,这是Java大版本周期变化后的第一个长期支持版本,非常值得关注.Java9和Java10都在很短的时间内就过渡了,所以,Java11将是一 ...

  2. Scrum冲刺第一篇

    一.各个成员在 Alpha 阶段认领的任务 负责人和协作者 任务内容 陈嘉欣 设计编码规范 邓镇港 UI设计 肖烈涛 数据库设计 林德泽 设计测试计划 余晓东 用户注册登陆验证模块 陈嘉欣 余晓东 林 ...

  3. Fundebug录屏插件更新至0.5.0,新增domain参数

    摘要: 通过配置domain来保证"视频"的正确录制 录屏功能介绍 Fundebug提供专业的异常监控服务,当线上应用出现 BUG 的时候,我们可以第一时间报警,帮助开发者及时发现 ...

  4. 10. [mmc subsystem] host(第四章)——host实例(sdhci-msm说明)

    一.说明 sdhci-msm是指高通的mmc host,其使用了标准SDHC标准.故可以使用前面说的<host(第二章)--sdhci>和<host(第三章)--sdhci-pltf ...

  5. Linux系统中ps -l命令显示的英文含义

    UID:启动这些进程的用户.PID:进程的进程ID.PPID:父进程的进程号(如果该进程是由另一个进程启动的).C:进程生命周期中的CPU利用率.STIME:进程启动时的系统时间.TTY:进程启动时的 ...

  6. 【转载】CMake 两种变量原理

    原文地址:https://cslam.cn/archives/c9f565b5.html 摘要: 本文记录一下 CMake 变量的定义.原理及其使用.CMake 变量包含 Normal Variabl ...

  7. python爬虫(5)——BeautifulSoup & docker基础

    BeautifulSoup基础实战 安装:pip install beautifulsoup4 常用指令: from bs4 import BeautifulSoup as bs import url ...

  8. Flask框架整理及配置文件

    阅读目录 Flask目录结构(蓝图) pro_flask包的init.py文件, 用于注册所有的蓝图 manage.py文件,作为整个项目的启动文件 views包中的blog.py,必须要通过sess ...

  9. Spring Boot应用启动器

    SpringBoot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2)spring-b ...

  10. CF1256(div3 java题解)

    A: 题意:给定A个N元,B个一元,问是否可以凑成S元. 思路:A*i+j=S 即 A*I<=S<=A*I+B 即min(S/N,A)+B>=S: /* @author nimphy ...