首页 > 系统相关 >进程线程关系

进程线程关系

时间:2024-01-18 17:47:54浏览次数:24  
标签:关系 程序 线程 内存 进程 执行 CPU

1、什么是进程

  • 什么是进程呢?进程是程序的一次启动执行。
  • 什么是程序呢?程序是存放在硬盘中的可执行文件,主要包括代码指令和数据。
    • 一个进程是一个程序的一次启动和执行,是操作系统将程序装入内存,给程序分配必要的系统资源,并且开始运行程序的指令。
    • 进程与程序是什么关系呢?同一个程序可以多次启动,对应多个进程。比如,多次打开Chrome浏览器程序,在Process Explorer中可以看到多个Chrome浏览器进程。

2.进程基本原理

  • 在计算机中,CPU是核心的硬件资源,承担了所有的计算任务

  • 内存资源承担了运行时数据的保存任务

  • 外存资源(硬盘等)承担了数据外部永久存储的任务。

    • 计算任务的调度、资源的分配由操作系统来统领。

    • 应用程序以进程的形式运行于操作系统之上,享受操作系统提供的服务。

    • 一个进程由程序段、数据段和进程控制块三部分组成。

    image

    • 程序段一般也被称为代码段。代码段是进程的程序指令在内存中的位置,包含需要执行的指令集合

    • 数据段是进程的操作数据在内存中的位置,包含需要操作的数据集合

    • 程序控制块(ProgramControl Block,PCB)包含进程的描述信息和控制信息,是进程存在的唯一标志。PCB主要由4大部分组成:

      • 1)进程的描述信息。主要包括:进程ID和进程名称,进程ID是唯一的,代表进程的身份;进程的状态,比如运行、就绪、阻塞;进程优先级,是进程调度的重要依据。
        2)进程的调度信息。主要包括:程序起始地址,程序的第一行指令的内存地址,从这里开始程序的执行;通信信息,进程间通信时的消息队列。
      • 3)进程的资源信息。主要包括:内存信息,内存占用情况和内存管理所用的数据结构;IO
        设备信息,所用的I/O设备编号及相应数据结构;文件句柄,所打开文件的信息。
      • 4)进程上下文。主要包括执行时各种CPU寄存器的值、当前的程序计数器(PC)的值以及名种栈的值等,即进程的环境。在操作系统切换进程时,当前进程被迫让出CPU,当前进程的上下文就保存在PCB结构中,供下次恢复运行时使用。

3.线程的基本原理

  • 线程是指进程代码段的一次的顺序执行流程。线程是CPU调度的最小单位。一个进程可以有一个或多个线程,各个线程之间共享进程的内存空间、系统资源,进程仍然是操作系统资源分配的最小单位。
  • 一个标准的线程主要由三部分组成,即线程描述信息、程序计数器(Program Counter,PC)和栈内存。

image

  • 在线程的结构中,线程描述信息即线程的基本信息,主要包括:

    • 1)线程ID(ThreadID,线程标识符)。线程的唯一标识,同一个进程内不同线程的ID不会重叠。
    • 2)线程名称。主要是方便用户识别,用户可以指定线程的名字,如果没有指定,系统就会自动分配一个名称。
    • 3)线程优先级。表示线程调度的优先级,优先级越高,获得CPU的执行机会就越大。
    • 4)线程状态。表示当前线程的执行状态,为新建、就绪、运行、阻塞、结束等状态中的一种。
    • 5)其他。例如是否为守护线程等。

    在线程的结构中,程序计数器很重要,它记录着线程下一条指令的代码段内存地址。

    在线程的结构中,栈内存是代码段中局部变量的存储空间,为线程所独立拥有,

    在线程之间不共享。在JDK1.8中,每个线程在创建时默认被分配1MB大小的栈内存。栈内存和堆内存不同,栈内存不受垃圾回收器管理。

4. java 中的线程执行原理

  • 在Java中,执行程序流程的重要单位是方法
  • 栈内存的分配的单位是栈帧(或者叫方法帧)。方法的每一次执行都需要为其分配一个栈帧(方法帧),栈帧主要保存该方法中的局部变量方法的返回地址以及其他方法的相关信息。
    • 当线程的执行流程进入方法时,JVM就会为方法分配一个对应的栈帧压入栈内存;
    • 当线程的执行流程跳出方法时,JVM就从栈内存弹出该方法的栈帧,此时方法栈帧的内存空间就会被回收,栈帧中的变量就会被销毁。
    • 栈帧(方法帧)的操作是后进先出的模式,这也是标准的栈操作模式,所以存放方法帧的内存也被叫作栈内存

image

5.进程与线程的区别

  1. 线程是进程代码段的一次的顺序执行流程。一个进程由一个或多个线程组成;一个进程至少有一个线程。
  2. 线程是CPU调度的最小单位,进程是操作系统分配资源的最小单位。线程的划分尺度小于进程,使得多线程程序的并发性高。
  3. 线程是出于高并发的调度诉求从进程内部演进而来的。线程的出现既充分发挥CPU的计算性能,又弥补了进程调度过于笨重的问题。
  4. 进程之间是相互独立的,但进程内部各个线程之间并不完全独立。各个线程之间共享进程的方法区内存、堆内存、系统资源(文件句柄、系统信号等)。
  5. 切换速度不同,线程上下文切换比进程上下文切换要快得多。所以,有时线程也称为轻量级进程。

标签:关系,程序,线程,内存,进程,执行,CPU
From: https://www.cnblogs.com/ccblblog/p/17973002

相关文章

  • C++多线程
    C++多线程的语法以及使用1.线程的创建首先创建一个多线程入口函数threadmain,threadmain函数体中完成子线程所要做的事。接着在主函数中创建线程对象th,调用构造函数,并传递一个函数指针作为入口函数:threadth(treadmain);入口函数为thread构造函数的参数。之后在主线程中......
  • StringBuilder 线程不安全,到底哪里不安全?
    StringBuilder线程不安全,到底哪里不安全?在Java中,字符串拼接是一个非常常见的操作,而对于频繁变动的字符串内容,使用StringBuilder是一个性能优化的选择。但是,StringBuilder在使用上存在一个很大的限制,它是线程不安全的。在多线程环境下,不正确的使用StringBuilder可能导致数据不一......
  • 【OC】一份理解引用计数、runloop、子线程保活比较好的调试代码
    以下提供了一份ViewController.m的源代码,调试工程可以做成:AppDelegate.rootViewController=NavivationController(rootController:rootVC)然后再rootVC中点击屏幕,self.navigationControllerpush:viewController,然后就可以调试代码进行理解。#import"ViewController.h"......
  • 并发编程之多进程
    并发编程1.任务调度算法介绍1.1进程的调度问题#CPU调度进程#什么是调度算法#要想多个进程交替运行#操作系统必须对这些进程进行调度#这个调度也不是随即进行的,而是需要遵循一定的法则#由此就有了进程的调度算法。#先来先服务算法#(1)理论#先来先服务(FCFS)调......
  • 27. 多线程技术
    一、多线程技术  QThread类是PySide中的核心线程类,要实现一个线程,需要创建QThread类的有一个子类,并且实现其run()方法。  线程也有自己自己的生命周期,其中包含5种状态,分别为:新建状态、就绪状态、运行状态、阻塞状态**和死亡状态。新建状态就是线程被创建时的状......
  • 僵尸进程 孤儿进程 守护进程
    【一】僵尸进程想象一下,有一个家庭里,父母(父进程)安排孩子(子进程)去完成一个特定的任务,比如买东西。孩子出门去了,父母继续做他们的事情。当孩子完成任务后,他们会回家并告诉父母他们已经完成了任务。在这个过程中,父母需要知道孩子是否已经回来并完成了任务。如果孩子回来了,但父母没......
  • 多进程理论
    (一)什么是进程理论上正在进行的一个过程或者说一个任务负责执行任务的是CPU(二)进程和程序的区别理论上程序就是一堆代码进程是程序运行的过程需要强调的是:同一个程序执行两次,那也是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播放西游记,一个可以播放水浒传......
  • Python、Anaconda、PyCharm和终端的关系及其作用
    Python是一种高级编程语言,广泛应用于数据分析、科学计算、Web开发等领域。为了便于开发和运行Python程序,我们通常会使用一些工具和环境。其中,Anaconda是一个Python发行版,提供了大量的科学计算和数据处理库;PyCharm是一款强大的Python集成开发环境(IDE);终端(或命令行)则是执行Python代码......
  • 进程锁(互斥锁)
    进程锁(互斥锁)(1)简介进程锁(也称为互斥锁)是一种用于控制多个进程对共享资源访问的机制。在并发编程中,多个进程可能同时访问共享的数据,如果没有适当的同步机制,可能会导致数据不一致或其他问题。进程锁就是用来解决这个问题的一种同步工具。互斥锁的基本思想是,在访问共享资源......
  • 查看Buffer&Cache被哪些进程占用
    背景介绍根据运营反馈线上环境监控图表ResponseTime出现了波动,由于我之前处理过类似的情况,上次是由于Redis占用大量内存没有释放的问题导致的,所以这次我也从内存着手进行分析问题的原因。(虽然最后确定导致此问题的原因是Java代码中的问题,但对于cache内容被那些进程所占用的,仍然......