美文网首页深入JavaScript
深入JavaScript Day24 - 进程与线程、事件循环、

深入JavaScript Day24 - 进程与线程、事件循环、

作者: 望穿秋水小作坊 | 来源:发表于2022-02-08 20:32 被阅读0次

一、进程与线程

1、如何一句话描述操作系统在【硬件】与【软件】之间的作用?

  • 操作系统是连接【硬件】与【软件】之间的桥梁

2、分别用一句话描述进程和线程?

  • 【进程process】进程是线程的容器
  • 【线程thread】线程是操作系统运行调度的最小单位
  • 【进程】我们可以认为,启动一个应用程序,就会默认启动一个进程(有可能是多个进程)
  • 【线程】每一个进程中,都会至少启动一个线程来执行程序中的代码,这个线程就是主线程

3、说一说单核操作系统是如何做到同时让多个进程(边听歌、边写代码、边查资料)同时工作呢?

  • CPU的运算速度非常快,它可以快速的在多个进程之间迅速切换;
  • 每个进程都会获得相应的运行时间片,所以有一种同时运行的错觉;

4、打开Chrome浏览器,每开一个tab,就可以从【活动监视器】里面观察到新开了一个【进程】。为什么Chrome要这么设计呢?

  • 这样当一个tab打开网页卡死(可能是死循环代码)后,不会导致整个Chrome卡死,不会影响其他tab的网页运行。

二、事件循环、微任务、宏任务

1、我们经常会说JavaScript是单线程的,那为什么JavaScript处理定时器、网络请求这样的操作不会卡死呢?

  • JavaScript是单线程的,但是浏览器是多线程的。
  • JavaScript线程会把耗时操作交给其他线程处理(比如定时器的计时操作),等耗时操作完毕,会把回调放入事件循环队列中,JavaScript再从循环队列取出回调进行执行。
  • 如此形成一个闭环,JavaScript线程也不会被耗时操作卡死。
image.png image.png

2、事件循环中维护着哪两个队列?

  • 【宏任务队列】macrotask queue
  • 【微任务队列】microtask queue
  • 【执行顺序】在执行任何一个宏任务前,都会先查看并执行微任务队列中的任务。

3、两个队列中分别对应放代码中的哪些API任务?

  • 【宏任务队列】ajax、setTimeout、setInterval、DOM监听、UI Rendering
  • 【微任务队列】Promis的then回调、queueMicrotask()

4、事件循环对两个对象的优先级是怎么样的?

  • ① main script 中的代码优先执行(编写的顶层script代码)
  • ② 在执行任何一个宏任务之前,保证微任务队列是空的(优先执行微任务队列中的任务)

三、面试题

1、面试题一【掌握】

image.png
setTimeout(() => {
  console.log("setTimeout1");
  new Promise(function (resolve) {
    resolve();
  }).then(function () {
    new Promise(function (resolve) {
      resolve();
    }).then(function () {
      console.log("then4");
    });
    console.log("then2");
  });
});

new Promise(function (resolve) {
  console.log("promise1");
  resolve();
}).then(function () {
  console.log("then1");
});

setTimeout(function () {
  console.log("setTimeout2");
});

console.log(2);

queueMicrotask(() => {
  console.log("queueMicrotask1");
});

new Promise(function (resolve) {
  resolve();
}).then(function () {
  console.log("then3");
});
  • 解法核心
  • ①promise构造函数的代码,不会被放在任何队列中,而是在main script中
  • ②将代码分三块进行划分【main script】【微任务】【宏任务】
  • ③在执行宏任务之前,一定要清空微任务队列里面的任务

2、面试题二【掌握】

image.png
async function async1() {
  console.log("async1 start");
  await async2();
  console.log("async1 end");
}

async function async2() {
  console.log("async2");
}

console.log("script start");

setTimeout(() => {
  console.log("setTimeout");
}, 0);

async1();

new Promise(function (resolve) {
  console.log("promise1");
  resolve();
}).then(function () {
  console.log("promise2");
});

console.log("script end");
  • 解法核心
  • ①async里面await后面的函数,相当于promise的then(理解generator + yeild)

3、面试题三【太难,忽略】

image.png

4、node的事件循环【暂时跳过吧,用到再说】

image.png image.png

相关文章

  • 深入JavaScript Day24 - 进程与线程、事件循环、

    一、进程与线程 1、如何一句话描述操作系统在【硬件】与【软件】之间的作用? 操作系统是连接【硬件】与【软件】之间的...

  • JS JavaScript事件循环机制

    JS JavaScript事件循环机制 首先区分进程和线程 进程是cpu资源分配的最小单位(系统会给它分配内存) ...

  • 事件循环机制

    想要了解javascript的事件循环机制,首先从基础概念出发;关于线程和进程 进程好比图中的工厂;有单独的的自己...

  • Node事件循环和多进程

    nodejs事件循环与多进程 why 事件循环对于深入理解nodejs异步至关重要fs, net,http,eve...

  • 进程-线程-事件循环

    19.1 进程和线程 19.2 浏览器中的Javascript线程 浏览器的每一个tab页面就会开启一个新的进程,...

  • JS事件循环

    深入理解javascript中的事件循环 (1)JS为何设计为单线程 js设计为单线程还是跟他的用途有关 试想一下...

  • js任务管理和promise

    任务管理 JavaScript是单线程。JavaScript在处理异步操作时,利用的是事件循环机制。 主线程中的任...

  • JS异步编程(2)-异步核心Event loop

    Event loop 是 JavaScript 异步编程的核心,通过事件循环机制,让单线程的 JavaScript...

  • 「翻译」Node.js 事件循环、计时器和process.nex

    什么是事件循环? 事件循环允许Node.js执行非阻塞I/O操作 - 尽管JavaScript是单线程的 - 只要...

  • Javascript异步编程

    同步模式与异步模式 事件循环与消息队列   JavaScript 单线程指的是浏览器中负责解释和执行 JavaSc...

网友评论

    本文标题:深入JavaScript Day24 - 进程与线程、事件循环、

    本文链接:https://www.haomeiwen.com/subject/xgxvkrtx.html