队列和双队列如何实现数据结构中队列的核心思想,就跟我们排队买票看电影是一样的。关键是谁在前面,谁先买票。入队(enqueue),顾名思义,就是在队列后面加一个人入队。按照先进先出的规则,排在最前面的人买完票后,就会离队(dequeue)。双队列(deque)我们在排队的时候通常会遵循先进先出的规则,但是在某些特殊情况下,也会出现特殊情况。在JavaScript中,还有一个unshift()方法可以用来插队。我们在下面的例子中称它为dequeAdd。另一种情况是,如果有些人等不及排在队尾,他们可能会离开。这种情况下,我们可以使用弹出栈的pop()来实现。我们在下面的例子中称它为dequeRemoveclassQueue{constructor(){this.queue=[];}enqueue(item){returnthis.queue.push(item);}dequeue(){returnthis.queue.shift();}dequeAdd(item){returnthis.queue.unshift(item);}dequeRemove(item){returnthis.queue.pop(item);}peek(){returnconsole.log(this.queue[0]);}}通过队列(process)和线程(thread)查看浏览器任务管理进程Chromium采用多进程架构(multi-processarchitecture)。新选项卡是一个新的浏览器进程。在浏览器进程中,有多个线程。Chromium中有两个核心线程,一个是主线程,一个是IO线程。因为浏览器是面向前端用户的,所以其架构设计的主要目标是让主线程和IO线程快速响应。为了达到这个目的,需要将阻塞IO或复杂操作分配给其他线程处理,线程间的通信问题通过消息传递来解决。可以说,Chromium使用的是高并发,但不是高并行架构。对于页面加载的脚本中要执行的任务,会通过任务队列通过事件循环交给UI主线程。如果问题可以被主线程解决,就会被处理。如果无法解决,则由IO线程或专门的线程进行处理,处理结果通过消息通信发送给主线程。线程池有一个共享任务队列。在Chromium线程管理中,并不提倡使用锁的结构,而是提倡顺序或者虚拟线程管理的概念。因为在谷歌看来,序列本身是线程安全的。因为在虚拟线程管理中,只有当一个任务执行完毕后,下一个任务才可能分配给线程池中的另一个工作线程执行,所以下一个任务必须根据上一个任务的执行结果来执行。任务按顺序执行。这里我们可以打个比方。比如在我们的项目管理中,会有一个需求池。这个需求池就是我们的任务队列,虚拟线程管理就像一个项目经理。在Chromium中,锁通常用于多个线程(工作线程)可以访问一个数据资源,但一次只允许一个线程访问这些资源或数据的情况。在Chromium中,使用互斥锁。环形队列与线程间数据传递环形队列是一种特殊的队列。循环队列首尾相连。它也被称为环形缓冲区,可用于进程或线程之间的数据传输。为什么环形队列适合做Node数据流缓存?核心好处是当一个数据元素被使用时,剩余的数据元素不需要移动它们的存储位置。对于循环队列,我们??一般需要两个指针,一个是头指针,一个是尾指针。头指针指向下一个要添加的数据,尾指针指向下一个要读取的数据。读取数据时,我们增加尾指针;写入数据时,我们增加头指针。例如,假设我们有一个16位缓冲区。第一步,我们增加了4位数据,头指针移动到3,如果再增加3,头指针就会移动到6。如果这时候,我们读到前4,那么尾指针就会移动reach4.那么在程序中如何实现这个环形队列呢?从实现上看,一般会创建两个数组,一个是原来用来定义环形队列的属性和方法的数组,第二个是实际用来存放数据的环形队列数组。在原始数组中,主要存储了三个关键属性,分别是头指针、尾指针和环队列长度。同时包含几个核心方法:原始数组中属性的获取和设置,环形队列数组中数据的读写。这样就可以实现循环队列。我们来看看它在缓存数据流方面的应用。这种环形队列通常与“生产者、消费者”模式结合使用,通常在环形队列的读写方法中加入互斥量,实现互斥访问。如下图所示,我们可以看到有4个工作线程。2个是生产者,2个是消费者。生产者负责写入数据,消费者负责读取数据。通过加锁,同一时间只有一个生产者可以写,读的时候也只有一个消费者可以读。在数据流等大量数据源源不断进入队列,再从队列中取出进行缓存处理的情况下,环形队列的使用大大提高了生产者和消费者之间的协作效率。数据流缓冲在很多应用中都有体现。除了进程管理之外,数据流缓冲还用于网络和文件系统。在网络中,字节数据根据数据包的大小被分成块进行传输;在文件系统中,数据块根据内核缓冲区大小被分成块进行处理。所以无论是HTTP数据请求和反馈,还是文件到目的地的传输,这些数据的传输都会用到循环队列缓冲区。极客时间《Jvascript进阶实战课》学习笔记Day16
