首页 > 系统相关 >什么是进程和线程? 为什么要引入线程? 进程和线程的区别?

什么是进程和线程? 为什么要引入线程? 进程和线程的区别?

时间:2023-07-16 20:44:31浏览次数:50  
标签:虚拟地址 调度 单位 引入 线程 进程 资源分配

 


什么是进程和线程?

什么是进程?

  • 进程是程序在某个数据集合上的一次运行活动(不仅包含正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说 CPU、内存、网络资源等),也是操作系统进行资源分配和保护的基本单位

    通俗来说,进程就是程序的一次执行过程,程序是静态的,它作为系统中的一种资源是永远存在的。而进程是动态的,它是动态的产生,变化和消亡的,拥有其自己的生命周期

    举个例子:同时挂三个 QQ 号,它们就对应三个 QQ 进程,退出一个就会杀死一个对应的进程。但是,就算你把这三个 QQ 全都退出了,QQ 这个程序死亡了吗?显然没有。

什么是线程?

  • 一个进程中可以有多个线程,它们共享这个进程的资源比如代码段、数据段、打开的文件等,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。线程又称为迷你进程,它比进程更容易创建,也更容易撤销

    举个例子,QQ 和 Chrome 浏览器是两个进程,Chrome 进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件

    操作系统会给每个进程分配一个虚拟地址空间(vitural address),每个进程包含的栈、堆、代码段这些都会从这个地址空间中被分配一个地址,这个地址就被称为虚拟地址,底层指令写入的地址也是虚拟地址。该进程下的所有线程共享这个虚拟地址空间。

    有了虚拟地址空间后,CPU 就可以通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到内存之前会先被转换成合适的物理地址,这个虚拟地址到物理地址的转换过程称为地址翻译/地址转换(address translation)。

    地址翻译需要 CPU 硬件和操作系统的密切合作:CPU 上的内存管理单元(Memory Management Unit,MMU)就是专门用来进行虚拟地址到物理地址的转换的,不过 MMU 需要借助存放在内存中的页表,而这张表的内容正是由操作系统进行管理的,操作系统为每个进程建立了一张页表

为什么要引入线程?

在引入线程前,进程是操作系统进行资源分配和独立调度的基本单位。

由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,需要较大的时空开销,限制了并发程度的进一步提高。为减少进程切换的开销,把进程作为资源分配单位和调度单位这两个属性分开处理,即进程还是作为资源分配的基本单位,但是不作为调度的基本单位(很少调度或切换),把调度执行与切换的责任交给线程,即线程成为独立调度的基本单位,它比进程更容易(更快)创建,也更容易撤销。

记住这句话!引入线程前,进程是资源分配和独立调度的基本单位。引入线程后,进程是资源分配的基本单位,线程是独立调度的基本单位。

进程和线程的区别?

线程与进程的比较如下:

  • 进程是资源(包括内存、打开的文件等)分配的基本单位,线程是 CPU 调度的基本单位;

  • 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;

  • 线程和进程一样具有就绪、阻塞、执行三种基本状态,同样具有状态之间的转换关系;

  • 线程能减少并发执行的时间和空间开销;

    对于线程相比进程能减少开销,体现在:

    • 线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,比如内存管理信息、文件管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们;
    • 线程的终止时间比进程快,因为线程释放的资源相比进程少很多;
    • 同一个进程内的线程切换比进程切换快,因为同一个进程下的线程共享该进程的虚拟地址空间等资源,所以在切换时,这些共享资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据。所以,线程的上下文切换相比进程,开销要小很多;
    • 由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了;

    所以,不管是时间效率,还是空间效率线程比进程都要高

标签:虚拟地址,调度,单位,引入,线程,进程,资源分配
From: https://www.cnblogs.com/wangprince2017/p/17558496.html

相关文章

  • spring boot 接口多线程
    SpringBoot接口多线程在单线程的环境中,当接口请求过多时,容易造成阻塞和性能问题。为了提高系统的响应速度和吞吐量,我们可以使用多线程来处理接口请求。本文将介绍如何在SpringBoot中使用多线程处理接口请求,并给出相应的代码示例。什么是多线程多线程是指在一个进程中同时执行......
  • Java-多线程-八股文
    线程安全的理解?线程安全说的是,当多个线程并发访问互斥资源时,读写互斥资源的代码逻辑能正常处理,获得正确结果,不会互相干扰的情况。守护线程的理解?守护线程是与普通线程相区分的概念,用户一般使用的就是普通线程,普通线程有自身独立的生命周期,而守护线程的生命周期取决于普通......
  • 类似nohup在windows通过cmd后台运行进程方法
    Linux后台运行进程时,通常使用如下方法:nohup"运行的内容"&windows相应功能的命令行如下(此方法进程有页面,可能会在桌面展示,关闭窗口后进程消失。callstart/min"n""运行的内容"cmd下难以实现nohup能力,但使用powershell可以。以下powershell方法,可实现后台运行,退出power......
  • Python的多线程(threading)与多进程(multiprocessing )
    可以用来做后台任务,可以在djangoview中调用,当做异步任务考核系统中要的threading,用来异步考核结果和考核进度的统计Python的多线程(threading)与多进程(multiprocessing)......
  • JAVA----线程池
    线程池线程的状态:1新建状态(没启动)2可运行状态(可能在运行,也可能等待cpu时间片)3阻塞(等待获取排他锁,或者等待其他线程唤醒,不醒无法获取时间片)4限期等待(一段时间后被系统自动唤醒)5死亡:可能任务执行结束或产生异常结束。线程池的状态:RUNNING:运行状态,可以接受新任务......
  • 线程安全 与 非线程安全
    线程安全:多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 非线程安全:在运行中不提供数据访问保护,这就可能导致多个线程先后更改数据,最后所得的数据......
  • 进程、线程、多线程
    一、概念1进程的概念程序在服务器上运行时,占据的计算资源合集,称之为进程进程之间不会相互干扰---进程间的通信比较困难(分布式)进程是计算机操作系统中正在运行的程序的实例。通过任务管理器可以查看运行进程。前台进程:用户可以看见相应的操作界面,如:浏览器进程等后台进程......
  • 依赖注入-xml-引入外部属性文件
    尚硅谷Spring-31比较常见的引用外部属性的场景是引用mysql1.加入依赖<!--MySQL驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency>&l......
  • C# 启动或关闭window系统某个进程
    C#启动、关闭windows系统某个进程 privateDictionary<string,string>ServiceList=newDictionary<string,string>();//服务文件对应服务名称publicvoidInit(){ServiceList.Add("print","SP");ServiceList.Add("cashbox",......
  • 线程的状态
    常见操作系统的线程状态是五种创建--> 就绪 --> 运行 -> 阻塞 --> 终止 java中定义了六中,主要是依据锁的行为create--> runnable -->waiting -->time_waiting-->blocked --> terminatejava中的runnable是包含了就绪和运行两种状态,就绪没有......