线程机制与事件机制的详细解答

162 阅读3分钟

线程机制与事件机制

进程与线程

进程(process):程序一次执行,它们各自独占一片内存空间,程序有多进程或者单进程

线程(thread):是进程内的一个独立执行单元,有单线程或多线程,是程序执行的一个完整流程,是CPU的最小调度单元

image.png

相关知识

  • 应用程序必须运行在某个进程的某个线程上面
  • 一个进程中至少有一个运行的线程:主线程,进程启动后自动创建
  • 一个进程可以同时运行多个线程,即多线程运行
  • 一个进程内的数据可以供其中的多线程直接共享
  • 多个进程之间数据不能直接共享
  • 线程池(thread pool):保存多个线程对象的容器,实现线程对象的反复利用

相关问题

  1. 比较单线程和多线程区别?

    多线程优点:能有效提升CPU的利用率

    缺点:创建多线程开销

    线程间切换开销(如果单核,多线程则每个线程互相跳转执行而不是排队式执行)

    死锁与状态同步问题

    单线程有点:顺序编码间断易懂

    缺点:效率低

  2. JS是单线程运行,但H5的Web Workers 可以多线程

  3. 浏览器运行是多线程运行

  4. 浏览器是单进程和多进程都有

浏览器内核

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

不同浏览器不一样

  • Chrome,Safari:webkit
  • FireFOx:Gecko
  • IE:Trident
  • 360,搜狗:Trident + webkit

内核由很多模块组成

  1. js引擎模块(也是程序代码):负责js程序的编译(运行前动态的)与运行

  2. html,css文档解析模块:负责页面文本的解析,读取并分解页面文档

  3. DOM/CSS:负责dom/css在内存中的相关处理,将被分解的页面文档如P标签等转换为对象

  4. 布局和渲染模块:负责页面的布局和效果的绘制(内存中的对象)

    以上均为主线程,js引擎

  5. 定时器模块:负责定时器管理

  6. DOM事件响应模块:负责事件管理

  7. 网络请求模块:负责ajax请求

    以上为分线程,浏览器负责

定时器引发的思考

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

    • 有一定延迟,不能保证真的定时执行,也有可能延迟更多
  2. 定时器的回调函数是在分线程执行的吗?

    • 在主线程执行,js是单线程
  3. 定时器如何实现?

    • 事件循环模型

JS是单线程的

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

    • setTimeOut()的回调函数在主线程中执行
    • 定时器回调函数只有在运行栈中的代码全部执行完后才可能执行
  2. 为什么js要用单线程(一个线程更新界面,排队式)?

    • 与其用途有关
    • 作为浏览器脚本语言,js的主要用途是与用户互动,及操作DOM
    • 决定了它只能是单线程,不然会带来很复杂的同步问题,冲突,两个线程针对同一目标,存在线程切换,线程功能矛盾
  3. 代码分类

    • 初始化代码 setTimeOut()
    • 回调代码 ,回调函数里的
  4. js引擎执行代码的基本流程

    • 先执行初始化代码;即一些特别的代码 回调函数(异步执行)

      • 设置定时器
      • 绑定事件监听
      • 发送Ajax请求
      • 以上这些并没有执行,类似声明
    • 后面在某个时刻才会执行回调代码,当全部初始化代码执行完毕后才有可能执行

【注】alert()暂停当前主线程执行,同时暂停计时,点击确定后,恢复程序执行和计时