JS single thread and how the web

2017-11-06  本文已影响0人  Komolei
  1. 知道了什么是线程。线程是进程中独立执行的单位。线程是操作系统进行运算调度的最小单位,是进程中的一个实体,由cpu调度的分派的基本单位。也是进程中的一个独立执行单元

  2. JS是单线程的,因为设计成这样的,其在某一时间只能执行一个任务,会阻塞其他任务进行。当新的任务加入的时候,会放在任务队列的最后面,当其前面的都执行完了,才会执行这个任务。突然,有一个任务耗时很长,而后面的任务又在等待执行,那这样就会造成浏览器“假死”,这一现象就相当于你平常在浏览网站的时候,突然怎么点击都没有反应一样。为了避免假死,过了好久,浏览器会给你个弹框,会提示要能不能结束该进程。

  3. 这个时候,你就会想,当我进行I\O(输入\输出)操作的时候,JS岂不是要等着我输入,才会进行下面的操作吗?
    其实不然,在设计者发现当用户要进行输入还未输入的时候,将这个任务先挂起来,当用户真的开始输入的时候,在来执行这个任务。这个会挂起任务,在等待输入,然后将挂起的任务开始执行的这个机制,被称为Event Loop!

  4. JS在运行的时候,其的引擎除了提供一个运行线程(因为JS是单线程,但是引擎并不是,引擎可以提供多线程,js脚本在线程上跑,别的线程在后台进行配合),还提供一个消息队列。这个相当于你在挂号一样的,你挂好号了,然后去看医生,医生那边知道你的消息,但是还没有叫你去看病一样。那你现在就在等待医生叫到你的号码,让你去看病。在程序中,就表现为你的号码,就是你挂的号相当于消息,而当医生叫到你,然后你在去医生那边看病这一行为为消息的响应,也就是程序中的回调函数。可以简单来说,你就是个回调函数,而触发你去医生那边看病,是不是因为医生叫到你的号码,你才去的,不然你只能排队。同时也要记得当医生叫到你的号码的时候,你没有去,医生是不是过一会就会叫下一个号。是不是说明你这个号码没有什么用处,因为这个号码的作用是让你去看病,但是你没有去看,说明这号码没有发挥自己的用处。这个对应在JS就是消息的遗失,一般消息跟回调函数是一起存在的,不然消息没有什么作用。

  5. setTimeout(),会在指定时间向消息队列插入一条消息,这个相当于我们在看医生的时候,是不是看见有时候自己被插队一样。当医生手上还在看病人的时候,是不是看完这个病人再看他,在JS中就是当消息队列中所有消息都处理完,在处理setTimeout的消息一样。当然医生没有病人再看,你说让他插队看,也是跟排队看一样。

  6. Event Loop机制:内部的一个循环,一轮一轮地处理消息队列中的消息,相当于执行消息的回调函数。
    update:虽然之前写过。但是发现自己并不是完全搞明白。所以又重写了一篇。查了一天的资料在写的。11.23/2017

Importent thing

  1. 我这两天浏览文章的时候,才发现。js是单线程的,但是浏览器并不是的。以前就知道页面是如何在网页中展示的过程。简单提一下

ok ,I forget something。

When client sent request to server,there is a course.
The client send request use url,and the url will be analyzed by DNS serve provider。The DNS serve provider will transform url

A picture is worth a thousand words

ShowPage.png

Now,the websocket Protocol is useful. You can see this article1 article2 👈

Other Reference

the threads of web

When web work,there are five threads to work .
The threads are the GUI render thread ;setTimeOut trigger thread ;js engine thread;async http request thread;event trigger thread;
and you should know the javascript engine thread is opposed to the GUI render thread
more infomation

上一篇 下一篇

猜你喜欢

热点阅读