.NET同步与异步之相关背景知识(六)
在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然、这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里。以下是前五篇随笔的目录:
.NET 同步与异步之封装成Task(五)
.NET 实现并行的几种方式(四)
.NET 实现并行的几种方式(三)
.NET 实现并行的几种方式(二)
.NET 实现并行的几种方式(一)
话再说回来,这五篇随笔都属于《同步与异步》系列。同步与异步、这是一个很大、很笼统的话题,以笔者所学很难将其将其介绍清楚,不过、笔者还是会尽力的。以下是笔者打算在近期介绍的一些知识点(大纲)、当然如果您有更好的意见或建议、欢迎评论留言。
1、与“同步与异步”相关的一些背景知识(即当前随笔)
线程上下文、上下文切换、竞争条件(竞态条件)、锁、死锁。
2、锁(Lock、Monitor、ReaderWriterLockSlim)(预计1-2篇随笔)
3、原子操作和自旋锁(Interlocked、SpinLock)(预计1篇随笔)
https://msdn.microsoft.com/zh-cn/library/system.threading.spinlock(v=vs.110).aspx
https://msdn.microsoft.com/zh-cn/library/system.threading.interlocked(v=vs.110).aspx
4、WaitHandle家族 (预计2篇随笔)
https://msdn.microsoft.com/zh-cn/library/system.threading.waithandle(VS.80).aspx
https://msdn.microsoft.com/zh-cn/library/system.threading.semaphoreslim(v=vs.110).aspx
5、警惕闭包中的变量捕获(预计1篇随笔)
6、线程安全的集合(预计1篇随笔)
好了,大纲暂时就先这些了,下面进入该篇随笔的正文、线程方面的相关背景知识:
线程上下文
线程的强大之处、我就不再强调了。如此强大的线程、想要“免费”使用它,似乎是不可能的,就像有句话说的那样:出来混总是要还的。
Windows中每开辟一个线程、系统都要默认分配一定量的内存空间、其中有一块内存空间用来保存CPU寄存器中的值,我们把这个内存块称为线程上下文。
内存空间中除了寄存器集合之外,还有一部分叫线程栈,线程栈的内存开销要比寄存器集合的内存开销大的多。
上下文切换
线程、是程序执行流的最小单元,它就像一个逻辑CPU(或者虚拟CPU)。在系统中多个逻辑CPU(线程)共享计算机中的物理CPU核心(一个CPU可能有多个核心)。
Windows在任何时刻,都只会把一个线程分配给一个CPU核心去运行。被分配的线程运行一个“时间片”长度后,时间片到期,此时Windows会切换上下文。
每次切换上下文,Windows都会做如下操作:
1、将CPU寄存器中的值保存到当前的线程上下文中。2、从现有的线程集合中挑选一个线程。3、将挑选的线程的上下文加载到CPU寄存器中。
上下文切换完成后,CPU会运行所选线程,直到它的时间片到期,然后再次发生上下文切换。Windows大约会30毫秒切换一次线程上下文。
事实上、上下文切换对性能的影响可能超乎了你的想象:
线程在运行时,线程所需的代码和数据都存放在CPU的高速缓存中,这使得CPU不必经常访问内存RAM(访问它的速度要比访问高速缓存的速度慢的多)。
当Windows进行上下文切换后、线程运行所需的代码和数据,可能不在CPU的高速缓存中,因此CPU必须访问RAM来填充高速缓存、以恢复CPU的高速运行。
但是,大约30毫秒后,上下文切换再一次发生了。
另外、当一个时间片结束后,如果Widnows决定继续运行同一个线程,那么将不发生上下文切换。
线程也可以自主终止其时间片,节省出来的时间、CPU可以用来运行其他线程。
关于 Thread.Sleep 方法、这里说一下它的三个特殊参数, -1, 0, 1 毫秒。
-1,当前线程将永远休眠(此参数其实没有意义,虽然Windows不再调度该线程,但它还是占用着内存)。
0,当前线程放弃了剩余的时间片,促使Windows发生上下文切换。当然此时Windows有可能还会继续运行当前休眠的线程(没有相同和更高优先级的线程需要运行的时候)
1,Sleep(0), 是不允许线程优先级较低的线程运行的, 而 Sleep(1) 会强制发生一次上下文切换。
竞争条件
假如有以下一行代码、假定当时 整形变量i的值为 0 :
i = i + ;
当有两个线程同时运行该行代码后,变量i的值变为了1。这时候的结果和预期的值2不一致,这时候我们认为是由于竞争条件引发了安全问题。
引发该问题的原因是:多个线程同时访问了共享资源。
存在竞争条件的代码,我们认为是线程不安全的代码。
锁 和 死锁
解决竞争条件的典型方案是,获取共享资源的独占式访问特权,而获取该特权的过程、我们称之为加锁。而这个特权、就是锁。
但是、加锁和释放锁的过程中开销较大、性能影响较大。还有一类更好的解决方案:原子操作,我有时候也会把它称为轻量级锁。
当两把锁相互等待对方释放的时候、我们认为此时发生了死锁。
随笔暂告一段落、下一篇随笔介绍: 锁(Lock、Monitor、ReaderWriterLockSlim)(预计1-2篇随笔)
附,Demo : http://files.cnblogs.com/files/08shiyan/ParallelDemo.zip
参见更多:随笔导读:同步与异步
(未完待续...)
.NET同步与异步之相关背景知识(六)的更多相关文章
- WEB相关背景知识(新手)
1.评估域名类型 .com——商业实体 .edu——仅限有学位或更高等学历授予资格的高等教育使用 .gov——仅限政府使用 .net——与Internrt网络支持相关的团体,通常是Internet服务 ...
- android 开发概述以及相关背景知识
参考链接:http://www.runoob.com/android/android-architecture.html http://www.runoob.com/android/android-a ...
- .NET 同步与异步之锁(Lock、Monitor)(七)
本随笔续接:.NET同步与异步之相关背景知识(六) 在上一篇随笔中已经提到.解决竞争条件的典型方式就是加锁 ,那本篇随笔就重点来说一说.NET提供的最常用的锁 lock关键字 和 Monitor. 一 ...
- {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll
Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...
- 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术
一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有 ...
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispa ...
- Java知识回顾 (9) 同步、异步IO
一.基本概念 同步和异步: 同步和异步是针对应用程序和内核的交互而言的. 同步指的是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪: 而异步是指用户进程触发IO 操作以后便开始做自己的 ...
- Java基础知识强化之多线程笔记07:同步、异步、阻塞式、非阻塞式 的联系与区别
1. 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就必须先得到返回值了. 换句话话说,调用者主动等待这个"调用"的结果. 对于 ...
- Spring Cloud 升级之路 - 2020.0.x - 1. 背景知识、需求描述与公共依赖
1. 背景知识.需求描述与公共依赖 1.1. 背景知识 & 需求描述 Spring Cloud 官方文档说了,它是一个完整的微服务体系,用户可以通过使用 Spring Cloud 快速搭建一个 ...
随机推荐
- MVVM模式和在WPF中的实现(二)数据绑定
MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- 自定义Inspector检视面板
Unity中的Inspector面板可以显示的属性包括以下两类:(1)C#以及Unity提供的基础类型:(2)自定义类型,并使用[System.Serializable]关键字序列化,比如: [Sys ...
- javascript匹配各种括号书写是否正确
今天在codewars上做了一道题,如下 看上去就是验证三种括号各种嵌套是否正确书写,本来一头雾水,一种括号很容易判断, 但是三种怎么判断! 本人只是个前端菜鸟,,不会什么高深的正则之类的. 于是,在 ...
- Redis链表实现
链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...
- 在jekyll模板博客中添加网易云模块
最近使用GitHub Pages + Jekyll 搭建了个人博客,作为一名重度音乐患者,博客里面可以不配图,但是不能不配音乐啊. 遂在博客里面引入了网易云模块,这里要感谢网易云的分享机制,对开发者非 ...
- C#中如何调整图像大小
在本篇文章中,我将介绍如何在C#中来调整你想要的图像大小.要实现这一目标,我们可以采取以下几个步骤: 1.首先要获取你想要调整大小的图像: string path = Server.MapPath(& ...
- 使用SecureCRT连接虚拟机(ubuntu)配置记录
这种配置方法,可以非常方便的操作虚拟机里的Linux系统,且让VMware在后台运行,因为有时候我直接在虚拟机里操作会稍微卡顿,或者切换速度不理想,使用该方法亲测本机效果确实ok,特此记录. Secu ...
- MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决
一.简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发.发布并支持的.有以下特点: MySQL是一种数据库管理系统. MySQL是一种关联数据库管理系统. MySQ ...
- js数组学习整理
原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...
- JS魔法堂:不完全国际化&本地化手册 之 理論篇
前言 最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...