浅谈进程&&线程
进程是资源分配的最小单位,线程是程序执行的最小单位
进程
概念:
可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和调度的基本单位 。 可以看作是一个容器:容纳线程、内存(并不是物理内存而是虚拟内存)及数据的容器
组成
进程一般由程序,数据集合和进程控制块三部分组成。
|程序用于描述进程要完成的功能,是控制进程执行的指令集;
|数据集合是程序在执行时所需要的数据和工作区;
|程序控制块包含进程的描述信息和控制信息,是进程存在的唯一标志
特征
|动态性:进程是程序的执行,同时进程有生命周期。
|并发性:多个进程可同存于内存中,能在一段时间内同时执行。
|独立性:资源分配和调度的基本单位。
|制约性:并发进程间存在制约关系,造成程序执行速度不可预测性,必须对进程的并发执行次序、相对执行速度加以协调。
|结构特征:进程由程序块 、数据块、进程控制块三部分组成。
线程
|进程之间的切换开销较大,无法满足越来越复杂的程序的要求了=>线程。
| 线程是一个进程中代码的不同执行路线 ,是程序执行流的最小单元。
|一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组成。
|线程池:保存多个线程对象的容器,实现线程对象的重复利用
进程和线程的相关知识
|应用程序必须运行在某个进程的某个线程上
|一个进程至少有一个运行的线程:主线程(进程启动后自动创建);也可以运行多个线程,可以说程序是多线程运行的
|进程内数据( 包括代码段,数据集,堆 ,打开文件和信号等)可以供其中的线程共享,但多个进程的数据不能共享
| 多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间
任务调度
大部分操作系统的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态,等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行” => 并发(多线程)
JS:单线程
执行代码段的基本流程:
1.初始化代码(设置,绑定,发送不代表执行其内部的回调代码)
设置定时器
绑定监听
发送ajax请求
2.之后某个时刻执行回调代码
setTimeout(function(){
console.log('2222')
},2000)
setTimeout(function(){
console.log('1111')
},1000)
setTimeout(function(){
console.log('1111')
},0) //以 0 为第二参数调用setTimeout并不表示在0毫秒后就立即调用回调函数,而是要等初始化代码执行完才开始计时
funcion fn(){
console.log('fn()')
}
fn()
console.log('alert之前')
alert('alert执行了') //暂停计时,点击确定后,才恢复计时
console.log('alert之后')
//输出 fn() alert之前,就会alert弹窗,过了很久点击确定不会立刻输出1111 2222
事件循环
栈里面是初始化代码的执行(两个特殊:定时器,事件监听) =>回调函数交给浏览器模块管理 => 特定的时间事件发生时,回调函数及数据放入callback queue队列