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

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

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

什么是进程?

  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. VirtualBox共享文件夹 Windows 7 (宿主机) + Ubuntu 12.04

    1 安装增强功能包1.1 运行Ubuntu并登陆,菜单“设备”->“安装增强功能包(Install Guest Additions)”ubun1.2 桌面上会多出一个光盘图标,光盘默认自动加载到 ...

  2. mongodb基本使用(一)

    1.启动.停止和重启mongodb服务 brew services start mongodb  ---启动 brew services stop mongodb --停止 brew services ...

  3. vs2013+python+ cocos2d-x-3.3rc0环境搭建

    1.vs2013安装一路next,安装即可,时间1~2个小时 2.解压cocos2d-x-3.3rc0   build文件夹里会有名为  cocos2d-win32.vc2012的sln文件  打开  ...

  4. Spring笔记②--各种属性注入

    Ioc 反转控制 反转资源获取的方向 分离接口与实现 采用工厂模式 采用反转控制   Di 依赖注入 依赖容器把资源注入   配置bean 通过全类名(反射) 配置形式:基于xml方式 Ioc容器的b ...

  5. Head First Java & 构造函数

        java继承中对构造函数是不继承的,只是调用(隐式或显式). ----------------------------------------------------------------- ...

  6. SQL Server 无法连接到本地服务器

    未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接:     解决办法: 在服务中启动SQL Server (MSSQLSERVER)这个服务.

  7. vue 中使用better-scroll 遇到的问题

    以下是遇到问题以及解决方法 1.使用v-for 循环循环出来的列表,不能滚动. 原因是没有给wrapper 父层 加高度,当子层的高度大于父层的高度,才能滚动 打印scroll 对象,显示如此 竟然相 ...

  8. 初期测评 E 迷障

    https://vjudge.net/contest/240302#problem/E 通过悬崖的yifenfei,又面临着幽谷的考验—— 幽谷周围瘴气弥漫,静的可怕,隐约可见地上堆满了骷髅.由于此处 ...

  9. 很有用的高级 Git 命令

    10 个很有用的高级 Git 命令 迄今,我已经使用Git很长一段时间了,考虑分享一些不管你是团队开发还是个人项目,都受用的高级git命令. 1. 输出最后一次提交的改变 这个命令,我经常使用它 来发 ...

  10. 使用 Vagrant 打造跨平台开发环境fffff

    Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史. 我们可以通过 Va ...