热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

进程与线程---------共享与私有

进程process:是计算机中已运行程序的实体。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。同一程序

进程process
             是计算机中已运行程序的实体。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。

             同一程序可产生多个进程(一对多关系),以允许同时有多位用户运行同一 程序,却不会相冲突。

             进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

             在很多现代操作系统中,一个进程的(虚)地址空间大小为4G,分为系统空间和用户空间,系统空间为所有进程共享,而用户空间是独立的,一般win进程的用户空间是2G.

线程thread
            是操作系统能够进行运算调度的最小单位。是独立调度和分派的基本单位。

           一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务;一个线程可以创建和撤销另一个线程。

           线程可以为操作系统内核调度的内核线程。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈), 但是同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

 

 

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时运行,但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。

 

            一个进程中的所有线程共享该进程的地址空间,但它们有各自独立的(/私有的)栈(stack),win线程的缺省堆栈大小为1M。堆heap的分配与栈有所不同,一般是一个进程有一个C运行时堆,
这个堆为本进程中所有线程共享,win进程还有进程默认堆,用户也可以自己创建堆。用操作系统术语,就是线程切换的时候实际上切换的是一个可以称之为线程控制块的结构(TCB),里面
保存所有将来用于恢复线程环境的必须信息,包括所有必须保存的寄存器集,线程的状态。

 

           堆是公有的空间,分为全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以像系统要额外的堆,但是记得
用完了要还给操作系统。要不然就是内存泄漏。

          是线程独有的,保存其运行状态和局部自变量。栈在线程开始的时候初始化,每个线程的栈相互独立。因此,栈是Thread safe的。操作系统在切换线程的时候后自动切换栈,即切换
SS<栈段寄存器>/ESP<栈顶指针>寄存器。栈空间不需要再高级语言里面显示的分配和释放。

 

线程管理:
                 将线程公有的信息放在进程控制块里,将线程独有的信息存放在线程控制块中。

 

    如何区分哪些信息时共享?哪些私有?
              一般的评价标准是:如果某些资源不独享会导致线程运行错误,则该资源就由某个线程独享,而其他资源都由进程里面的所有线程共享。

 

    对于进程一线程的实现如何做解释?
            首先应该明白进程的调度,创建等实质上都是有操作系统实现的,即进程的实现只能由操作系统内核来实现,而不存在用户态实现的情况。
             对于线程,线程的管理者可以是用户也可以是操作系统本身。因此,线程的实现就应该分为内核态线程实现和用户态线程实现。

 

   内核态线程实现:
                  线程时进程的不通过执行序列,即线程是独立运行的基本单位,也是CPU的基本单位。


   操作系统如何实现线程管理?
           首先操作系统向管理进程一样,应该保持维护线程的所有资源,将线程控制块存放在操作系统的内核空间中。那么此时操作系统就同时掌控进程控制块和线程控制块。

            优点:用户编程简单;不容易阻塞。缺点:效率低,需要修改操作系统。

 

   用户态线程实现:
           用户自己做线程的切换,操作系统无需知道线程的存在。
           需要创建一个调度线程,在执行完需主动把资源释放给其他线程使用。          优点:灵活,无需修改操作系统实现。缺点:需要考虑很多原因,


现在操作系统的线程实现模型:
            用户态执行负责进程内部线程在非阻塞时的切换;内核态的操作系统负责阻塞线程的切换。每个内核态线程可以服务一个或多个用户态线程。

线程什么时候会从用户态切换到内核态:
            首先,如果程序运行过程中发生中断或者异常,系统将自动切换到内核态运行中断或异常处理机制;或者,程序进行系统调度也会从用户态切换到内核态。

 


推荐阅读
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • Java并发机制详解及其在数据安全性保障中的应用方案 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 深入浅析JVM垃圾回收机制与收集器概述
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》的阅读心得进行整理,详细探讨了JVM的垃圾回收机制及其各类收集器的特点与应用场景。通过分析不同垃圾收集器的工作原理和性能表现,帮助读者深入了解JVM内存管理的核心技术,为优化Java应用程序提供实用指导。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
  • MySQL数据库安装图文教程
    本文详细介绍了MySQL数据库的安装步骤。首先,用户需要打开已下载的MySQL安装文件,例如 `mysql-5.5.40-win32.msi`,并双击运行。接下来,在安装向导中选择安装类型,通常推荐选择“典型”安装选项,以确保大多数常用功能都能被正确安装。此外,文章还提供了详细的图文说明,帮助用户顺利完成整个安装过程,确保数据库系统能够稳定运行。 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • 在Python网络编程中,多线程技术的应用与优化是提升系统性能的关键。线程作为操作系统调度的基本单位,其主要功能是在进程内共享内存空间和资源,实现并行处理任务。当一个进程启动时,操作系统会为其分配内存空间,加载必要的资源和数据,并调度CPU进行执行。每个进程都拥有独立的地址空间,而线程则在此基础上进一步细化了任务的并行处理能力。通过合理设计和优化多线程程序,可以显著提高网络应用的响应速度和处理效率。 ... [详细]
  • 面向对象编程的核心概念包括类与对象、封装技术、继承机制、多线程处理及线程同步、异常管理。类是现实世界对象的抽象表示,包含属性(特征)和方法(行为)。对象则是类的具体实例,用于实现抽象数据类型。通过封装技术,可以隐藏对象的内部细节,保护数据的安全性。继承机制允许子类继承父类的属性和方法,提高代码的复用性和可维护性。多线程处理和线程同步技术则用于实现并发操作,提升程序的执行效率。异常管理机制则确保程序在遇到错误时能够优雅地处理,提高系统的健壮性。 ... [详细]
author-avatar
N个小灰流_701
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有