一.前言

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

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

二.进程

定义

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

表现形式

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

最新文章

  1. windows 用默认软件打开文档
  2. C++中的数组
  3. [NOIP2014] 提高组 洛谷P2312 解方程
  4. IOS 杂笔-3 (property参数)
  5. MoSCoW Method
  6. poj 1159 (DP LCS)
  7. 我对c++对象内存布局的理解
  8. 定时显示div
  9. 安装 Android 运行环境
  10. PBOC2.0安全系列之—脱机认证之动态数据认证(DDA)
  11. 1036: [ZJOI2008]树的统计Count
  12. Spring容器组建注解@Component和Resouces实现完全注解配置
  13. ●poj 1474 Video Surveillance
  14. iOS监听模式系列之NSNotificationCenter的简单使用
  15. python之路(3)函数和匿名函数
  16. CodeForces 958F3 Lightsabers (hard) 启发式合并/分治 多项式 FFT
  17. ionic APP二维码插件 地址
  18. 版本管理工具Git(3)VS2013下如何使用git
  19. ES6之箭头表达式
  20. 简单版nginx lua 完成流量上报于中间件

热门文章

  1. maven 学习---Maven 构建配置文件
  2. 【AI测试】也许这有你想知道的人工智能 (AI) 测试--开篇
  3. Unix/Linux/Mac os下 文件互传
  4. 如何使用 Set 来提高JS代码的性能
  5. JAVA中为什么要配置环境变量?怎么配置环境变量?
  6. 201871010118-唐敬博《面向对象程序设计(java)》第十六周学习总结
  7. flask如何返回真正意义上的json字符串?以及中文如何正常显示?
  8. 创建vector<T>容器
  9. 数据结构or算法
  10. zr2019暑期高端峰会AB组十测