《C#并发编程经典实例》学习笔记-进程(process)和线程(thread)
本文主要参考自孙钟秀主编的《操作系统教程》一书中关于进程和线程的部分。
进程
为什么引入进程?
一,刻画系统动态性,发挥系统并发性,提高资源利用率。
以C#为例,在编辑器Visual Studio Code写了几行代码,保存为cs文件。在未运行状态的下的代码,称之为静态的程序。静态的程序是一个相对的概念。当程序运行起来,它的运行依赖于处理器(CPU)和主存储器资源,我可以称之为动态的程序。以该程序动态执行的过程为基本单位,抽象出一个概念,进程,即进行中的程序。
进程二字,主要是强调动态性。处理器调动进程,存储器为进程分配进程空间,为处理器分配调动控制进程的空间,进程因此创建。当资源不足,或者需等待某个事件发生,进程暂停执行。乃至最后进程运行结果,程序退出主存储器,进程消亡。进程的出现到消亡,无疑是在不断地动态变化。
二,解决共享性。
当你完成一个公用函数时,该函数可以被多个程序调用。
函数A在被程序甲调用,程序甲正在等待写入磁盘数据操作的返回,处理器空闲,为提高处理器利用效率,程序乙于此同时开始执行,进入起始点a。
此时,如何描述函数A?A处于等待点?A处于起始点a?试着引入进程的概念,将函数和程序联系起来,A对于程序甲构成进程A甲,A对于程序乙构成进程A乙。进程A甲处于等待点,进程A乙处于起始点。
进程(process)这个名词最早是1960年在MIT的MULTICS和IBM公司的 TSS/360系统中提出的,直到目前对进程的定义和名称均不统一,不同的系统中采用不同的术语名称,例如,MIT称进程(process),IBM公司称任务(task)和 Univac公司称活动(active)。可以说进程的定义多种多样,国内学术界较为一致的看法是:进程是一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位(1978 年全国操作系统学术会议)。
进程属性:
- 结构性。进程至少有三要素组成:程序块、数据块、进程控制块。
- 共享性。多个进程可共享相同的程序。
- 动态性。进程是动态的概念,有生命周期。程序作为一组有序指令的序列合集,是静态概念,程序可以作为一种系统资源永远存在。
- 独立性。进程既是系统中资源分配和保护的基本单位,也是系统调度的独立单位(单线程进程)。凡是未建立进程的程序,都不能作为独立单位参与运行。通常,每个进程都可以各自独立的速度在 CPU上推进。
- 制约性:并发进程之间存在着制约关系,进程在进行的关键点上需要相互等待或互通消息,以保证程序执行的可再现性和计算结果的惟一性。
- 并发性:进程可以并发地执行,进程的并发性能改进资源利用率和提高系统效率。
线程
随着并行技术、网络技术和软件设计技术的发展,给并发程序设计效率带来了一系列新的问题,主要表现在:
- 进程时空的开销大,频繁的进程调度将耗费大量处理器时间,要为每个进程分配存储空间限制了操作系统中进程的总数。
- 进程通信的代价大,每次通信均要涉及通信进程之间或通信进程与操作系统之间的信息传递。
- 进程之间的并发性粒度较粗,并发度不高,过多的进程切换和通信延迟使得细粒度的并发得不偿失。
- 不适合并行计算和分布并行计算的要求,对于多处理器和分布式的计算环境来说,进程之间大量频繁的通信和切换,会大大降低并行度。
- 不适合客户!服务器计算的要求。对于 C/S结构来说,那些需要频繁输入输出并同时大量计算的服务器进程(如数据库服务器、事务监督程序)很难体现效率。
如果说操作系统中引入进程的目的是为了使多个程序能并发执行,以改善资源使用率和提高系统效率,那么,在操作系统中再引入线程,则是为了减少程序并发执行时所付出的时空开销,使得并发粒度更细、并发性更好。
进程可以分为两项功能:一是独立分配资源,二是被调度分派执行。分配资源仍由进程实现,无需频繁切换。抽出线程的概念,将被调度分派执行的任务移交给线程,可以被频繁的调度和切换。
进程和线程的相对概念
单线程(结构)进程(single threaded process):进程在任一时刻只有一个执行控制流
在单线程(结构)进程(single threaded process)中,进程和线程的概念可以不加区分。
多线程(结构)进程(multiple threaded process):
- 在同一进程中设计出多条控制流;
- 多控制流之间可以并行执行;
- 多控制流切换不需通过进程调度;
- 多控制流之间还可以通过内存区直接通信,降低通信开销
多线程环境中进程的定义:进程是操作系统中进行保护和资源分配的基本单位。
它具有:
- 一个虚拟地址空间,用来容纳进程的映像;
- 对处理器、其他(通信的)进程、文件和 I/O资源等的有控制有保护的访问。
而传统进程原先所承担的控制流执行任务交给称作线程的部分完成。
多线程环境中的线程概念:线程是操作系统进程中能够独立执行的实体(控制流),是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的实体(控制流),这就是多线程。同一个进程中的所有线程共享进程获得的主存空间和资源,但不拥有资源。
线程具有:
- 线程执行状态(运行、就绪、等待⋯⋯)。
- 当线程不运行时,有一个受保护的线程上下文,用于存储现场信息。所以,观察线程的一种方式是运行在进程内一个独立的程序计数器。
- 一个执行堆栈。
- 一个容纳局部变量的主存存储区。
线程属性:
- 并发性:同一进程的多个线程可在一个或多个处理器上并发或并行地执行,而进程之间的并发执行演变为不同进程的线程之间的并发执行。
- 共享性:同一个进程中的所有线程共享但不拥有进程的状态和资源,且驻留在进程的同一个主存地址空间中,可以访问相同的数据。所以,需要有线程之间的通信和同步机制。通信和同步的实现十分方便。
- 动态性:线程是程序在相应数据集上的一次执行过程,由创建而产生,至撤销而消亡,有其生命周期,经历各种状态的变化。每个进程被创建时,至少同时为其创建一个线程,需要时线程可以再创建其他线程。
- 结构性:线程是操作系统中的基本调度和分派单位,因此,它具有惟一的标识符和线程控制块,其中应包含调度所需的一切私有信息。
进程可以划分为两个部分:资源集合和线程集合。进程要支撑线程运行,为线程提供地址空间和各种资源,它封装了管理信息,包括对指令代码、全局数据和 I/O状态数据等共享部分的管理。线程封装了执行信息,包括对CPU寄存器、执行栈(用户栈、内核栈)和局部变量、过程调用参数、返回值等线程私有部分的管理。由于线程具有许多传统进程所具有的特征,所以也把线程称为轻量进程 LWP(Light-Weight Process)。
《C#并发编程经典实例》学习笔记-进程(process)和线程(thread)的更多相关文章
- 《C#并发编程经典实例》笔记
1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期 ...
- Python笔记-进程Process、线程Thread、上锁
1.对于操作系统来说,一个任务就是一个进程(Process).比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程. 2.在一个进程内部,要同时干多件事,就需要同时运行多个“ ...
- 《C#并发编程经典实例》学习笔记—2.7 避免上下文延续
避免上下文延续 在默认情况下,一个 async 方法在被 await 调用后恢复运行时,会在原来的上下文中运行. 为了避免在上下文中恢复运行,可让 await 调用 ConfigureAwait 方法 ...
- 《C#并发编程经典实例》学习笔记—3.1 数据的并行处理
问题 有一批数据,需要对每个元素进行相同的操作.该操作是计算密集型的,需要耗费一定的时间. 解决方案 常见的操作可以粗略分为 计算密集型操作 和 IO密集型操作.计算密集型操作主要是依赖于CPU计算, ...
- 《C#并发编程经典实例》学习笔记-关于并发编程的几个误解
误解一:并发就是多线程 实际上多线程只是并发编程的一种形式,在C#中还有很多更实用.更方便的并发编程技术,包括异步编程.并行编程.TPL 数据流.响应式编程等. 误解二:只有大型服务器程序才需要考虑并 ...
- 《C#并发编程经典实例》学习笔记—2.3 报告任务
问题 异步操作时,需要展示该操作的进度 解决方案 IProgress<T> Interface和Progress<T> Class 插一段话:读<C#并发编程经典实例&g ...
- 《C# 并发编程 · 经典实例》读书笔记
前言 最近在看<C# 并发编程 · 经典实例>这本书,这不是一本理论书,反而这是一本主要讲述怎么样更好的使用好目前 C#.NET 为我们提供的这些 API 的一本书,书中绝大部分是一些实例 ...
- [书籍]用UWP复习《C#并发编程经典实例》
1. 简介 C#并发编程经典实例 是一本关于使用C#进行并发编程的入门参考书,使用"问题-解决方案-讨论"的模式讲解了以下这些概念: 面向异步编程的async和await 使用TP ...
- Python_进程process 与 线程thread
进程process 与 线程thread 的区别 各个进程独立使用内存空间,(默认)不可互相访问,线程共享内存 进程的子进程是复制一份父进程,线程没有
随机推荐
- 修改MariaDB 路径
1.把mariadb服务停掉: service mariadb stop 2.把/var/lib/mysql整个目录复制到/work, sudo mkdir /work/data sudo cp -a ...
- Forward团队-爬虫豆瓣top250项目-项目总结
托管平台地址:https://github.com/xyhcq/top250 小组名称:Forward团队 组长:马壮 成员:李志宇.刘子轩.年光宇.邢云淇.张良 我们这次团队项目内容是爬取豆瓣电影T ...
- Python学习过程中各个难点---函数篇
对于函数,我一直分不清局部变量与全局变量,今天又好好研究了下,终于搞清楚了. 例子: 其次对于global这个关键字我也是一知半解的状态,之前整个人都是懵懵的,现在搞明白了 匿名函数: 匿名函数使用关 ...
- poj 1050 最大子矩阵
a11 a12 a13 a14 a15 a21 a22 a23 a24 a25 a31 a32 a33 a34 a35 a41 a42 a43 ...
- 装mongondb数据库
装mongondb数据库装好以后进入c盘mongondb bin里边 复制地址 将其放入环境变量里边 放之前需要往前边加一个英语的;在 d盘 建一个data文档 里边简历一个db文件夹 cmd命令框输 ...
- this用法总结
在JavaScript中,this关键字可以说是最复杂的机制之一.对this的作用机制缺乏比较深入的理解很容易在实际开发中出现问题. 1.this的作用 为什么要在JavaScript中使用this呢 ...
- Hystrix 熔断机制
熔断机制相当于电路的跳闸功能,即在一定时间内,错误比例达到一定数目时业务从原来流程转移到另外的流程处理.在一段时间后,恢复到原业务逻辑. 测试代码如下 /** * @author zimu * @de ...
- .Net程序员 初学Ubuntu ,配置Nignix
1.安装VM虚拟机 2.升级VI编辑器 3.安装Nginx 4.测试localhost 5.编辑配置文件 仅仅用了记录一个过程,不会太详细 1.安装虚拟机,网上一大片,不是特别难 2.为什么要升级VI ...
- 微信 SQLite 数据库修复实践
1.前言 众所周知,微信在后台服务器不保存聊天记录,微信在移动客户端所有的聊天记录都存储在一个 SQLite 数据库中,一旦这个数据库损坏,将会丢失用户多年的聊天记录.而我们监控到现网的损坏率是0.0 ...
- 修复运行 tasklist 命令时提示 ERROR: Not found
最近碰到了一个脚本运行 tasklist 总是提示 ERROR: Not found,在这里找到了修复的方法 https://superuser.com/questions/1282867/windo ...