C#线程篇---让你知道什么是线程(1)
线程线程,进程进程,到底什么是线程,什么是熟练多线程编程?
今天来和大家一起讨论讨论线程基础,让大家知道线程的基本构造。
说线程之前,先要了解下进程,这个可不能不知道。
什么是进程?
Microsoft设计操作系统内核时,他们决定在一个进程中运行应用程序的每一个实例,进程也不过就是个应用程序实例要使用资源的集合。(见过烤玉米,烤甘蔗的没?如下图:)
一个进程就好比一个烤筒,一个进程与其他进程互不干涉。操作系统为他们设立了一个虚拟地址空间,确保一个进程使用的代码和数据无法由另一个进程访问。这就保证了一个应用程序的健壮性。
现在问题又来了,当一个进程进入无限循环了会怎么样?
也就是程序没反应了,无限占用CUP,使CPU不能执行其他任何东西了,所以,进程是健壮(因为不会被破坏,而且也很安全),但还是会引起系统停止响应,也就是我们常说的“死机”。
这时,Microsoft拿出的解决方案就是线程。也就是说,线程运行于进程之中。
讲到线程,先来看看什么是线程:
- 线程内核对象, Windows为应用程序所创建的每个线程都有一个线程内核对象,这个对象包含一组对线程进行描述的属性,除此之外,还包含一个线程上下文(thread context),这个上下文是一个内存块,这个内存块用来包含CPU的寄存器集合(什么?你不知道CUP寄存器?火速去百度)。
- 线程环境块,包含一个内存块和一个异常处理链,还有些本地存储数据,GDI图形使用的一些数据结构。个人感觉没啥用,知道有就行。
- 用户模式栈,用来用户的操作带来的局部变量和实参,好比函数,程序执行到Add(i),那么它在执行函数之前会存下进入函数的地址,然后等函数调用完成之后再返回先前记录的地址,然后执行下一步。这个用户模式栈也就这用,要知道的是,Windows最少要为它分配1MB内存。
- 内核模式栈,在用户模式栈传递实参使会用到内核模式栈,调试大家都用过吧? 在调试程序的时候,是不是不能修改代码了?关键就在这,你执行程序之后,用户模式栈不能访问内核栈,你写的代码都送去内核了。
- DLL线程连接和线程分离通知,用过引用吧?这东西就是你在调用外部程序时需要提前引用一下的原因。加载这个程序,需要用到引用,正如没有引用,你程序就会出错。
现在来看看,大家熟悉的任务管理器,对线程来个形象的了解:
看到进程了? 看到线程了?
1个线程占用1MB , 1264个线程就占用1264MB。我就开了个VS 和SQL 两个大程序。程序开的不多。
再看看每个进程的线程数:
线程数也看到了,SQL-46个线程,最高内存使用。
再来说说 经常遇到的情景,假设你正在玩一个大型游戏,突然老师来了,你要装作你正在干活,然后Tab+Alt,然后屏幕一黑,急了,怎么还没跳过去!!快点啊!!
o(∩_∩)o
现在来说说,一个Alt+Tab,Windows做了哪些事。
Windows之所以能快速接收我们的操作,我们觉得是时时在接收我们的输入,其实,在你不输入的时候,此线程已经提前终止此线程,而你的输入,唤醒文本输入线程只需要5毫秒。
并且这中间还存在一个叫上下文切换的东西,它的切换速度30毫秒,在Windows没有操作响应的时候,它做的切换工作超乎你的想象,因为有这个功能,保证了Windows的健壮性、快速反应等。
上下文切换,不是看不到的,回到那个情景,Alt+Tab,我们现在都知道它是在执行一个不同的线程,在你切换到桌面的时候,
游戏的线程代码和数据还在CUP的高速缓存当中(高速缓存能使CPU不需要经常访问内存,它访问缓存的速度比内存快得多),你的操作使CPU需要访问新的数据代码,而这些代码在内存中,
所以CPU又要重新读内存,重新填充告诉缓存,以恢复高速执行状态。
好了现在我们知道Alt+Tab发生了什么事了。上下文切换所需时间,取决于CPU架构和速度,填充缓存取决于应用程序大小和CPU缓存大小等原因。
以上如有有理解错误的地方,请大家提醒指正,谢谢。
C#线程篇---让你知道什么是线程(1)的更多相关文章
- C#线程篇---Task(任务)和线程池不得不说的秘密(5)
在上篇最后一个例子之后,我们发现了怎么去使用线程池,调用ThreadPool的QueueUserWorkItem方法来发起一次异步的.计算限制的操作,例子很简单,不是吗? 然而,在今天这篇博客中,我们 ...
- C#线程篇---Task(任务)和线程池不得不说的秘密
我们要知道的是,QueueUserWorkItem这个技术存在许多限制.其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值,这些问题使得我们都不敢启 ...
- iOS开发:(线程篇-上)线程和进程
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- JAVA技术专题综述之线程篇(1)
本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield( ...
- Java面试知识点之线程篇(三)
前言:这里继续对java线程相关知识点进行总结,不能间断. 1.yield()方法 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执 ...
- Java面试知识点之线程篇(二)
前言:接上篇,这里继续对java线程相关知识点进行总结. 1.notify和notifyall的区别 notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的 ...
- Java面试知识点之线程篇(一)
前言:在Java面试中,一定会遇到线程相关问题,因此笔者在这里总结Java中有关线程方面知识点,多数从网上得来(文中会贴出主要参考链接),有些也是笔者在面试中所遇到的问题,如有错误,请不吝指正.主要参 ...
- Python3 与 C# 并发编程之~ 线程篇
2.线程篇¶ 在线预览:https://github.lesschina.com/python/base/concurrency/3.并发编程-线程篇.html 示例代码:https://gith ...
- 每天五个java相关面试题(7)--线程篇
首先关于线程能够先看我之前这篇博文熟悉一下线程生命周期的图示以及文字说明 好開始了: 1.java 中有几种方法能够实现一个线程? 答:有两种实现方法.各自是继承 Thread类与实现Runnable ...
随机推荐
- unset命令详解
基础命令学习目录首页 功能说明:unset是一个内建的Unix shell命令,在Bourne shell家族(sh.ksh.bash等)和C shell家族(csh.tcsh等)都有实现.它可以取消 ...
- java的第一个实验
实验一 Java开发环境的熟悉 北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1352 姓名:林涵锦 学号:20135213 成绩: ...
- LCA(最近公共祖先)算法
参考博客:https://blog.csdn.net/my_sunshine26/article/details/72717112 首先看一下定义,来自于百度百科 LCA(Lowest Common ...
- lintcode-514-栅栏染色
514-栅栏染色 我们有一个栅栏,它有n个柱子,现在要给柱子染色,有k种颜色可以染. 必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案. 注意事项 n和k都是非负整数 样例 n = 3, ...
- 软工网络15团队作业8——Beta阶段敏捷冲刺(Day2)
提供当天站立式会议照片一张 每个人的工作 1.讨论项目每个成员的昨天进展 赵铭: 根据计划安排,继续学习数据库. 吴慧婷:做Beta阶段的计划,并为界面设计寻找素材,学习界面优化. 陈敏: 根据任务, ...
- ORACLE:一列的多行数据拼成字符串
查询表中的一个字段,返回了多行,就把这么多行的数据都拼成一个字符串. 例: id name 1 aa 2 bb 3 cc 要的结果是&quo ...
- Robot Framework 教程 (2) - 页面元素定位
上一篇文章中,简单模拟了一个baidu搜索并截图的过程,在搜索过程中,我们需要对搜索框.搜索按钮进行定位.本篇文章主要介绍一下具体的定位方法. 我们的脚本如下: *** Settings *** Li ...
- Installing Percona XtraDB Cluster on CentOS
PXC简介 Percona XtraDB Cluster(简称PXC集群)提供了MySQL高可用的一种实现方法. 1.集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上. 2.每个节 ...
- 根据端口号,利用DOS命令杀死进程
比如利用DOS命令找出占用8080端口的程序的PID 然后用DOS命令杀死该进程 kill
- ldap添加memberof支持
安装请查看上一篇博客,传送门:https://www.cnblogs.com/crysmile/p/9470508.html 如果使用LDAP仅仅作为用户统一登录中心,则参考安装文档即可:如果ldap ...