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

进程与线程

时间:2022-10-22 17:12:07浏览次数:36  
标签:调度 线程 进程 执行 CPU 多道程序

简介

1、进程

  进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,简而言之就是程序的一次执行过程,也可以直接理解为电脑上的软件的运行情况,通过电脑的任务管理器可以直接查看到相应的进程,及如下图所示。 

  对进程的理解主要可以从定义、组成、组织方式、特征和通信方式四个方面入手,其具体分析情况如下所示。

  操作系统中进程的五种基本状态及其转换过程如下所示。 

  新进程的创建需要先在内存中为新进程创建一个task_struct结构,再将父task_struct内容复制至新创建的task_struct结构中,进而为新进程分配新的内核堆栈、PID,并将新task_struct的node添加至链表之中,综上所示,创建新进程相当于“复制”原进程。而在操作系统中一般调用fork()函数实现进程创建,而fork均由do_fork实现,其简化流程如下。

   

  例题(C语言):通过fork()创建两个子进程并实现输出,其中,父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。

 

2、线程

  线程(Thread)是程序执行流的最小执行单位,是操作系统能够进行运算调度的最小单位,负责当前进程中程序的执行。一个进程至少有一个线程,而一个进程则可以存在多个线程,且多个线程之间可共享数据。

  线程状态图如下所示。

  线程的生命状态与周期的示意图如下所示。

 

 

优点

1、进程

  • 进程具备顺序程序的封闭性和可再现性。
  • 多道程序设计出现后实现了并发执行和资源共享。
  • 在多道程序设计中,可通过增加CPU简单地实现扩充性能。
  • 在多道程序设计中,可以尽量减少线程加锁或解锁的影响,从而提高性能。
  • 在多道程序设计中,每个进程具备相互独立性,紫金城崩溃并不影响主程序的稳定性。
  • 在多道程序设计中,每个子进程均存在2GB地址空间及相关资源,总体能到达的上限大。

2、线程

  • 程序逻辑与控制方式简单。
  • 线程方式消耗的总资源比进程方式少。
  • 线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。
  • 同一进程下的线程间共享数据空间,从而便捷了线程间的通信机制。
  • 使多CPU系统更加有效。线程数少于COU数是不同线程可在不同CPU上运行。

 

缺点

1、进程

  • 多进程调度开销过大。
  • 进程间内存无法共享,且通讯复杂。
  • 逻辑控制复杂,需要同主程序进行交互。
  • 数据传输序跨越进程边界,仅适合少量数据传送或密集运算。
  • 操作系统调度切换多个线程要比切换调度进程在速度上快的多。

2、线程

  • 线程之间的同步和加锁控制比较麻烦。
  • 一个线程的崩溃可能影响到整个程序的稳定性。
  • 每个线程与主程序共用地址空间,受限于2GB地址空间。
  • 调度时, 要保存线程状态,频繁调度, 需要占用大量的机时。
  • 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。

 

关系

  • CPU分配给线程,即真正在处理器运行的是线程。
  • 资源分配给进程,同一个进程的所有线程共享该进程所有资源。
  • 线程在执行过程中需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。
  • 一个进程中可以存在多个线程,且至少有一个线程;而一个线程最多只能在一个进程的地址空间内活动。

注:进程是最基本的资源拥有单位和调度单位。

 

区别

  • 根本区别:进程是操作系统资源分配的基本单位,而线程则是处理器任务调度和执行的基本单位。
  • 内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
  • 影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
  • 包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;而线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
  • 执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
  • 资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会造成较大的开销;而线程则可以看做轻量级进程(Heavy—Weight Process),同一类线程共享代码和数据空间,每个线程均拥有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

标签:调度,线程,进程,执行,CPU,多道程序
From: https://www.cnblogs.com/Auion-idiot/p/16816288.html

相关文章

  • 多线程
    线程简介多任务现实中太多同时做多件事情的例子,看起来是多个任务都在做,其实本质上我们的大脑同时只做了一件事多线程原来是一条路,慢慢因为车太多了,道路阻塞,效率极......
  • UEC++ 多线程(二) AsyncTask
    AsyncTaskAsyncTask系统实现的多线程与自己实现继承的FRunnable实现的原理相似,还可以利用UE4提供的线程池。当使用多线程不满意时也可以调用StartSynchronousTask改成主线......
  • 线程与进程
    今天我们就来主要介绍一下什么是线程和进程,线程和进程并没有表面上看起来这么简单。一、进程定义:进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,......
  • 单核多线程可见性问题
    背景学习群上有个同学提出问题,如下截图这里可以看到分歧点,我认为JMM协议规定了工作内存,那么即使是单核,JAVA虚拟机也会保证线程本地内存变量的私有性,所以会存在不可见。......
  • java线程的优先级
    packageA_ShangGuiGu.Thread.ThreadDemo;/***优先级*1.MAX_Priority-----最大优先级为10*2.MIN_Priority-----最小优先级为1*3.NORM_Priority----默认优先级5*4......
  • Linux进程(一)
    操作系统概念:操作系统是管理计算机硬件与软件资源的计算机程序,简称OS。为什么要有操作系统:1.给用户提供稳定、高效和安全的运行环境,为程序员提供各种基本功能(OS不信任任......
  • 3_linux多线程
    3_linux多线程编程基本概念程序执行的最小单位进程是线程的容器,不是基本执行单位,是线程容器线程是进程中的不同执行路径,有独立的堆栈、局部变量(因为线程需要线程函数)......
  • 驱动开发:内核枚举进程与线程ObCall回调
    在笔者上一篇文章《驱动开发:内核枚举Registry注册表回调》中我们通过特征码定位实现了对注册表回调的枚举,本篇文章LyShark将教大家如何枚举系统中的ProcessObCall进程回调......
  • 驱动开发:内核枚举进程与线程ObCall回调
    在笔者上一篇文章《驱动开发:内核枚举Registry注册表回调》中我们通过特征码定位实现了对注册表回调的枚举,本篇文章LyShark将教大家如何枚举系统中的ProcessObCall进程回调以......
  • Java多线程(1):线程生命周期
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 从事Java开发这些年来,如果要问我Java当中最难的部分是什么?最有意思的部分是什么?最多人讨论的部分是什么?那我会毫不犹豫......