关于“线程”与“阻塞”

关于“线程”与“阻塞”

这个问题有可能是我个人的疑惑,或许其他人一看就明白,人总有转不过弯的时候!

NodeJS是单线程的异步操作,在书上讲这一点的时候往往会拿出常规的做法来与之对比:单线程的阻塞操作。

书中写道:

线程在执行中如果遇到磁盘读写或网络通信(统称为 I/O 操作),
通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同
时将资源让给其他的工作线程,这种线程调度方式称为 阻塞。当 I/O 操作完毕时,操作系统
将这个线程的阻塞状态解除,恢复其对CPU 的控制权,令其继续执行。

比如单线程中遇到一个读取txt文件的操作,按照上面的说法,此时该线程的CPU控制权被剥夺了。当这个操作完成后该线程再重新拥有CPU控制权。

我大感不解:既然失去了CPU,那这个对txt的处理是谁做的呢,难道还有另外一个CPU不成? 

我一直认为计算机上所有执行的操作全都是CPU来完成,其实不然。就拿读取硬盘上的某txt文件来说,CPU发出读取txt指令,但具体的读取操作并

不是CPU去做的,而是硬盘去做的。CPU只是负责把指令送到数据总线,是其它设备接到命令并按照CPU的要求去处理数据,然后再把数据送来到

总线接口处。此时通知CPU,CPU才会再次接手工作对数据进行下一步操作。

我对这个解释还是比较满意的,如果有问题希望大家多多指出。

 

《JavaScript编程精解》读书笔记

 
摘要: 7.1模块js本身其实没有类的概念,所以平时写js都是在一个全局环境中任意的写,当然这是初学者的一般做法。这样就时的代码非常的乱,也会使自己出现函数调用错误、变量重定义等很多问题,如何解决就要靠模块化了。就是把有一定关联的变量或者函数集中放到一个‘地方’。关于这里的‘地方’可以是一个函数,一个js文件,或者是文件夹。总之就是让代码分开,别纠缠在一起。从最简单的一个例子说起,比如下面两个独立函数: function forEachIn(object,action){ for(var property in object){ if(Object.prototy...阅读全文
posted @ 2013-01-09 16:11 张小然 阅读(1158) | 评论 (6) 编辑
 
摘要: 4.1这一章的内容比较少,一共几页,而且多以文字叙述为主,挑自己觉得要用的地方写一下。首先,js是很少抱怨的语言,他很多情况下不管好的坏的都会接受而且不会报错,我们在错误检查的时候就会很头痛。比如函数的参数可变,可接收几乎任意多的参数,而且类型也不固定。你想传入的该是一个整型,但是调用时你故意传两个字符型,它会默默忍受,不吱声。最简单的错误就是语法错误了,给力的IDE基本能解决这个问题,(推荐:Webstorm)。还有运行时错误,这个我了解不多,比如内存、网络、cpu等引起的错误。其它的错误就是程序员考虑不周造成的了,以前看过一本js的书,jsdom编程艺术,都说这本书不错,我发现书中代码有一阅读全文
posted @ 2012-12-13 17:21 张小然 阅读(63) | 评论 (0) 编辑
 
摘要: 2.1剖析函数的定义函数的定义很简单,形如function square(x){return x*x;} 其中函数名为square。我想说的是在js中函数都是有返回值的,即使你没用return关键字,那它默认会返回undefined。另外需要强调的一点是js的一切都是值,函数也是值。当代码在执行的时候,会先扫描所有的函数定义,所以不用担心函数定义如果写在了执行代码后面是否会去调用函数的问题。在执行之前准备工作其实已经做好了这些。局部变量的定义前用var关键字,否则会视为定义了一个全局的变量。在函数中定义的变量一般不能被函数外调用,函数外的变量在函数内可随便调用。在js中还有一个重要的概念就是‘阅读全文
posted @ 2012-12-08 23:31 张小然 阅读(1051) | 评论 (2) 编辑
 
摘要: 3.1 此小节书中讲了一个故事,此处略过.....3.2 基本数据结构 属性的概念不多说了。关于对象的概念,跟其它的语言是一样的。下面是关于js中对象的常用操作:View Code //生成一个对象的方式var person = {name:"zhangran",age:23};//修改属性的值person.age = 24;//alert(person.age); //result:24delete person.age;//alert(person.age); //result:undefined//添加一个属性person.address = "Beijin阅读全文
posted @ 2012-12-02 20:31 张小然 阅读(734) | 评论 (3) 编辑
 
摘要: 5.1抽象:归根结底程序是要解决生活中的问题,但多数时候现实中的问题总是很复杂,而尽量降低程序复杂程度的办法就是进行抽象化处理。把许多实际的复杂关系抽象成更简单的逻辑运用到程序当中。这是我对编程中抽象的理解。函数式编程就是通过巧妙的函数组合来创建抽象。5.2高阶函数:简单点说高阶函数就是处理其他函数的函数,也就是函数的嵌套。js是面向函数的一门语言,在js的世界里任何东西都是值类型的,当然函数也不例外。它与其他语言(比如说C#)最明显的差异就是函数能够完全像值一样去生成,去传递。你可以把函数作为另一个函数的参数来使用,也可以在一个函数的内部再定义一个新的函数。当然你也许会想到C#中的lambd阅读全文
posted @ 2012-11-25 23:41 张小然 阅读(1210) | 评论 (4) 编辑
 
摘要: 开篇:最近老赵(jeffrey zhao)发起了一个倡导正版书籍的活动(详情)。我非常幸运的获得了老赵免费赠送的一本《javascript编程精解》,如果是常来博客园的肯定不会陌生,正是由汤姆大叔翻译的那本。这里再次感谢老赵。前几天老赵号召我们这些受赠的同学积极利用资源,把每个人读过的书以读书笔记的形式分享出来,增加交流机会的同时也是对每个人的督促。很赞的一个想法,为了积极响应号召,特意建了一个博客分类-- name:《javascript编程精解》和当前这篇目录文章。计划:我的计划是按照书中的目录以章为单位来写博客,每星期更新一章,因为平时可能有事情忙,最晚会在周末更新。目录: (橙色代表正阅读全文
posted @ 2012-11-19 14:22 张小然 阅读(438) | 评论 (3) 编辑
 
分类: 概念理解
标签: 阻塞
原文地址:https://www.cnblogs.com/Leo_wl/p/2990760.html