• 线程机制与事件机制:进程与线程 浏览器内核 定时器引发的思考 JS是单线程执行的 浏览器的事件循环(轮询)模型


    进程与线程

    进程

    程序的一次执行,它占有一片独有的内存空间
    可以通过windows任务管理器查看进程

    线程

    是进程内的一个独立执行单元
    是程序执行的一个完整流程
    是CPU的最小调度单元

    图解

    相关知识

    应用程序必须运行在某个进程的某个线程上。
    一个进程中至少有一个运行的线程:主线程,进程启动后自动创建。
    一个进程中也可以同时运行多个线程,我们会说程序是多线程运行的。
    一个进程内的数据可以供其中的多个线程直接共享。
    多个进程之间的数据是不能直接共享的,进程间的内存是独立的。
    线程池:保存多个线程对象的容器,实现线程对象的反复利用。

    相关问题

    1.何为多进程与多线程?

    多进程运行:一应用程序可以同时启动多个实例运行
    多线程:在一个进程内,同时有多个线程运行

    2.比较单线程与多线程?

    多线程

    优点
    (1)能有效提升CPU的利用率
    缺点
    (1)创建多线程开销
    (2)线程间切换开销
    (3)死锁与状态同步问题

    单线程

    优点
    (1)顺序编程简单易懂
    缺点
    (1)效率低

    3.JS是单线程还是多线程?

    (1)js是单线程运行的
    (2)但使用H5中的Web Workers可以多线程运行

    4.浏览器运行是单线程还是多线程的?

    都是多线程的

    5.浏览器运行是单进程还是多进程?

    (1)大部分是多进程,通过任务管理器查看浏览器是否多进程运行

    浏览器内核

    支撑浏览器运行的最核心的程序

    不同的浏览器可能不一样

    内核由很多模块组成

    主线程:
    js引擎模块 : 负责js程序的编译与运行
    html,css文档解析模块 : 负责页面文本的解析(将页面文本都转换为对象)
    DOM/CSS模块 : 负责dom/css在内存中的相关处理
    布局和渲染模块 : 负责页面的布局和效果的绘制(内存中的对象)
    ……

    分线程:
    定时器模块 : 负责定时器的管理
    DOM事件响应模块 : 负责事件的管理
    网络请求模块 : 负责服务器请求(常规/Ajax)
    ……

    定时器引发的思考

    1. 定时器真是定时执行的吗?

    定时器并不能保证真正定时执行
    一般会延迟一丁点(可以接受),也有可能延迟很长时间(不能接受)

    2. 定时器回调函数是在哪个线程执行的?

    在主线程执行的,js是单线程的

    3. 定时器是如何实现的?

    事件循环模型(后面讲)

    JS是单线程执行的

    1. 如何证明js执行是单线程的?

    setTimeout()的回调函数是在主线程执行的。
    定时器回调函数只有在运行栈中的代码全部执行完后才有可能执行。

    2. 为什么js要用单线程模式, 而不用多线程模式?

    JavaScript的单线程,与它的用途有关。
    作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作Dom。
    这决定了它只能是单线程,否则会带来很复杂的同步问题。

    3.代码的分类

    (1)初始化代码
    (2)回调代码(回调函数包含的代码)

    4.js引擎执行代码的基本流程

    先执行初始化代码:包含一些特别的代码(设置定时器、绑定事件监听、发送ajax请求)
    后面在某个时刻才会执行回调代码。

    浏览器的事件循环(轮询)模型

    1.模型原理图

    2.相关重要概念

    (1)执行栈
    所有的代码都是在此空间中执行的
    (2)浏览器内核
    js引擎模块(在主线程处理)
    其它模块(在主/分线程处理)
    (3)任务队列、消息队列、事件队列都指的是callback queue(回调函数队列)
    (4)事件循环:从任务队列中循环取出回调函数放入执行栈中处理(一个接一个)
    (5)事件驱动模型 :上面整个原理图
    (6)请求响应模型 :客户端与服务器之间请求响应的过程

    3.所有代码分类

    初始化执行代码(同步代码):包含绑定Dom事件监听、设置定时器、发送ajax请求的代码
    回调执行代码(异步代码:必须在所有初始化代码执行后才有可能得到执行的代码)处理回调逻辑

    4.js引擎执行代码的基本流程

    初始化代码 ----> 回调代码

    5.模型中的2个重要组成部分

    事件(定时器/Dom事件/ajax)管理模块
    回调队列

    6.模型的运转流程

    (1)执行初始化代码,将事件回调函数交给对应模块管理
    (2)当事件发生时,管理模块会将回调函数及其数据添加到回调队列中
    (3)只有当初始化代码执行完后(可能需要一定时间),才会循环遍历读取回调队列中的回调函数执行

    学识浅薄,如有错误,恳请斧正,在下不胜感激。

  • 相关阅读:
    可翻页查看(more、less)
    在CentOS 6.0下面永久关闭SELinux和防火墙
    Linux(CentOS 6.4)设置VNC远程桌面连接
    CentOS Linux防火墙配置及关闭
    ubuntu12.04循环登录,无法进桌面的问题
    转载 vi替换windows换行符为linux换行符
    sublime忽略打开工程中某些文件夹,不在搜索之列
    erl_0021 erlang和java的内存模型比较(引用)
    erl_0020 《面对软件错误构建可靠的分布式系统》读书笔记001 “面向并发COPL”
    erl_0019《硝烟中的erlang》 读书笔记005 “进程信息"
  • 原文地址:https://www.cnblogs.com/yin-jie/p/14764949.html
Copyright © 2020-2023  润新知