进程
进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个
自己的地址空间,至少有5种基本状态,他们是:初始态、执行态、等待状态、就绪状态、终止状态
线程
线程是CPU调度和分派的基本单位,他可与同属一个进程的其他的线程共享进程所拥有的全部资源
关系:线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以是多个线程,但至少有一个线程
进程和线程的区别
- 根本方面:进程数操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
- 在开销方面:每一个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类型的线程共享代码和数据空间,每一个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
- 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时运行(通过CPU调度,在每个时间片中只有一个线程执行)
- 内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,出了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
worker
- webworker的作用,就是为javascript创造多线程环境,允许主线程创建worker线程,将一些任务分配给后者运行,在主线程运行的同时,worker线程在后台运行,两者互不干扰,等到worker线程完成计算任务,再把结果返回给主线程,这样的好处是,一些计算密集型或者高延迟的任务,被worker线程负担了,主线程(通常负责UI交互)就会很流畅,不会被阻塞或拖慢
- worker线程一旦新建成功,就始终会运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信,但是,这也造成了worker比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭
web worker注意事项
- 同源分配:分配给worker线程运行的脚本文件,必须与主线程的脚本文件同源
- DOM限制:worker线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的DOM对象,也无法使用document、window、parent这些对象。但是,worker线程可以navigation对象和location对象
- 通信联系:worker线程和主线程不在同一上下文环境,他们不能直接通信,必须通过消息完成
- 脚本限制:worker线程不能执行alert()方法和condirm()方法,但可以使用XMLHttpRequest对象发出Ajax请求
- 文件限制:worker线程无法读取本地文件,即不能打开本机的系统文件(file://),他所加载的脚本,必须来自网络