线程线程,进程进程,到底什么是线程,什么是熟练多线程编程?

今天来和大家一起讨论讨论线程基础,让大家知道线程的基本构造。

说线程之前,先要了解下进程,这个可不能不知道。

什么是进程?

  Microsoft设计操作系统内核时,他们决定在一个进程中运行应用程序的每一个实例,进程也不过就是个应用程序实例要使用资源的集合。(见过烤玉米,烤甘蔗的没?如下图:)

一个进程就好比一个烤筒,一个进程与其他进程互不干涉。操作系统为他们设立了一个虚拟地址空间,确保一个进程使用的代码和数据无法由另一个进程访问。这就保证了一个应用程序的健壮性。

现在问题又来了,当一个进程进入无限循环了会怎么样?

也就是程序没反应了,无限占用CUP,使CPU不能执行其他任何东西了,所以,进程是健壮(因为不会被破坏,而且也很安全),但还是会引起系统停止响应,也就是我们常说的“死机”。

这时,Microsoft拿出的解决方案就是线程。也就是说,线程运行于进程之中。

讲到线程,先来看看什么是线程:

  1. 线程内核对象, Windows为应用程序所创建的每个线程都有一个线程内核对象,这个对象包含一组对线程进行描述的属性,除此之外,还包含一个线程上下文(thread context),这个上下文是一个内存块,这个内存块用来包含CPU的寄存器集合(什么?你不知道CUP寄存器?火速去百度)。
  2. 线程环境块,包含一个内存块和一个异常处理链,还有些本地存储数据,GDI图形使用的一些数据结构。个人感觉没啥用,知道有就行。
  3. 用户模式栈,用来用户的操作带来的局部变量和实参,好比函数,程序执行到Add(i),那么它在执行函数之前会存下进入函数的地址,然后等函数调用完成之后再返回先前记录的地址,然后执行下一步。这个用户模式栈也就这用,要知道的是,Windows最少要为它分配1MB内存。
  4. 内核模式栈,在用户模式栈传递实参使会用到内核模式栈,调试大家都用过吧?  在调试程序的时候,是不是不能修改代码了?关键就在这,你执行程序之后,用户模式栈不能访问内核栈,你写的代码都送去内核了。
  5. 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)的更多相关文章

  1. C#线程篇---Task(任务)和线程池不得不说的秘密(5)

    在上篇最后一个例子之后,我们发现了怎么去使用线程池,调用ThreadPool的QueueUserWorkItem方法来发起一次异步的.计算限制的操作,例子很简单,不是吗? 然而,在今天这篇博客中,我们 ...

  2. C#线程篇---Task(任务)和线程池不得不说的秘密

    我们要知道的是,QueueUserWorkItem这个技术存在许多限制.其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值,这些问题使得我们都不敢启 ...

  3. iOS开发:(线程篇-上)线程和进程

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  4. JAVA技术专题综述之线程篇(1)

    本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield( ...

  5. Java面试知识点之线程篇(三)

    前言:这里继续对java线程相关知识点进行总结,不能间断. 1.yield()方法 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执 ...

  6. Java面试知识点之线程篇(二)

    前言:接上篇,这里继续对java线程相关知识点进行总结. 1.notify和notifyall的区别 notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的 ...

  7. Java面试知识点之线程篇(一)

    前言:在Java面试中,一定会遇到线程相关问题,因此笔者在这里总结Java中有关线程方面知识点,多数从网上得来(文中会贴出主要参考链接),有些也是笔者在面试中所遇到的问题,如有错误,请不吝指正.主要参 ...

  8. Python3 与 C# 并发编程之~ 线程篇

      2.线程篇¶ 在线预览:https://github.lesschina.com/python/base/concurrency/3.并发编程-线程篇.html 示例代码:https://gith ...

  9. 每天五个java相关面试题(7)--线程篇

    首先关于线程能够先看我之前这篇博文熟悉一下线程生命周期的图示以及文字说明 好開始了: 1.java 中有几种方法能够实现一个线程? 答:有两种实现方法.各自是继承 Thread类与实现Runnable ...

随机推荐

  1. stat命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/yexiangcsdn/article/details/81012732 stat命令用于显示文件的状态信息.stat命令的 ...

  2. delphi 图像处理 二值化

    procedure TDR_QM_ZP_Form.Image_EZH( Bmp: TBitmap ); var p: PByteArray; Gray, x, y: Integer; begin // ...

  3. java List.get

    并不能 用如果List在i位置值不存在 并不能 List.get(i) !=null 判断 会抛异常 版权声明:本文为博主原创文章,未经博主允许不得转载.

  4. Teamwork(The second day of the team)

    梦之翼 5.20工作汇报: Master:杨灵超 产品负责人:杨家安 第一次Sprint的目标和时间: 目标:这一次的sprint我们想先做成一个可以运行的可以展示,但是功能或许还不是很完善的一个模型 ...

  5. JAVA之路(二)

    学道酬勤,这是第二次学习JAVA,感觉如醍醐灌顶一样,理解很多思想和道理. 本博只是自己对JAVA的一些理解,具体定义以及用法百科里有. 我为什么在博客园内记录自己的学习过程呢,因为我想有人知道我在学 ...

  6. 16_常用API_第16天(正则表达式、Date、DateFormat、Calendar)_讲义

    今日内容介绍 1.正则表达式的定义及使用 2.Date类的用法 3.Calendar类的用法 ==========================================第一阶段======= ...

  7. json 数组

    /** * 获取 选中的id * @returns {*} */function getCheckedList(){ var groups =[]; $("input[name='check ...

  8. 解决登录不上网页得tomcat(授权manager-gui角色的操作如下)

    1:编辑/usr/local/tomcat/conf/tomcat-users.xml文件,在没有注释的内容中添加: <role rolename="manager-gui" ...

  9. vue开发完成后打包后图片路径不对

    用vue做了一个小的移动端项目,从头到尾做下来,感觉自己好多东西都没弄清楚过.也学到了很多,已整理笔记在自己电脑上,但是比较零散,空了再来仔细整理整理. 于是,上周五模拟好数据(接口还未写),准备打包 ...

  10. 远程修改VMware ESXi服务器的密码(SSH)

    1,用vSphere client登录到服务器,将SSH启用. 2,使用ssh连接工具(我用的是secureCRT)远程登录,输入passwd,键入两次新密码,OK.