0%

进程(process)和线程(thread)

CPU

CPU是计算机的核心,其负责承担计算机的计算任务。这里我们比喻为一个工厂

进程

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。我们这里将进程比喻为工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

线程

在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程,线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元。这里把线程比喻一个车间的工人,即一个车间可以允许由多个工人协同完成一个任务。

阅读全文 »

继承

类的继承:

1
2
3
4
5
6
function inherits(child, parent) {
var f = function() {}
f.prototype = parent.prototype;
child.prototype = new f();
child.prototype.constructor = child;
} //这是一个封装函数,再进行类的继承时,可以用这个函数来套用
阅读全文 »

原型链

  1. JavaScript并非通过类而是直接通过构造函数来创建实例
  2. 构造函数
  • 构造函数模式的目的就是为了创建一个自定义类,并且创建这个类的实例。构造函数模式中拥有了类和实例的概念,并且实例和实例之间是相互独立的,即实例识别。
  • 构造函数习惯上首字母大写,需要使用new关键字来调用
1
2
3
4
5
6
7
8
9
10
function Person(name, age, gender) {
this.name = name
this.age = age
this.gender = gender
this.sayName = function() {
alert(this.name)
}
}
var per = new Person("孙悟空", 18, "男");
console.log(per); //当我们直接在页面中打印一个对象时,事件上是输出的对象的toString()方法的返回值
阅读全文 »

闭包

目的

使用闭包主要是为了设计私有的方法和变量

优点

可以避免全局变量的污染

缺点

  1. 闭包会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏。
  2. 在Javascript中,函数即闭包,只有函数才会产生作用域。

特性

  1. 函数嵌套函数
  2. 在函数内部可以引用外部的参数和变量
  3. 参数和变量不会以垃圾回收机制回收

TCP建立后包含多少HTTP,以及相关衍生的概念

一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DOM 怎么被构建,被绘制出来。

但是你有没有想过,收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?
要搞懂这个问题,我们需要先解决下面五个问题:
现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?

一个 TCP 连接可以对应几个 HTTP 请求?

一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?

为什么有的时候刷新页面不需要重新建立 SSL 连接?

浏览器对同一 Host 建立 TCP 连接到数量有没有限制?

阅读全文 »

跨域

概念

指一个域下的文档或脚本试图去请求另一个域下的资源。

  1. 资源跳转: a链接、重定向、表单提交
  2. 资源嵌入:

XSS、CSRF安全

web端的安全攻击有CSRF和XSS两种。

CSRF

概念

CSRF(Cross-site request forgery)跨站请求伪造,是通过伪装成受信任用户的请求来利用受信任的网站进行攻击。

阅读全文 »

JS垃圾回收

JS的垃圾回收机制是为了以防内存泄漏。

内存泄漏:

就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。

变量的生命周期

当一个变量的生命周期结束之后它所指向的内存就应该被释放。JS有两种变量,全局变量和在函数中产生的局部变量。局部变量的生命周期在函数执行过后就结束了,此时便可将它引用的内存释放(即垃圾回收),但全局变量生命周期会持续到浏览器关闭页面。

JS垃圾回收方式

标记清除(mark and sweep)

大部分浏览器以此方式进行垃圾回收,当变量进入执行环境(函数中声明变量)的时候,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”,在离开环境之后还有的变量则是需要被删除的变量。标记方式不定,可以是某个特殊位的反转或维护一个列表等。

引用计数(reference counting)

这种方式常常会引起内存泄漏,低版本的IE使用这种方式。机制就是跟踪一个值的引用次数,当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,当这个变量指向其他一个时该值的引用次数便减一。当该值引用次数为0时就会被回收。

“可达性” 值

就是那些以某种方式可访问或可用的值,它们被保证存储在内存中。

深入了解:https://www.cnblogs.com/huaweiyun/p/14435787.html

  1. 奥森图标(Font Awesome)提供丰富的矢量字体图标—通过CSS可以任意控制所有图标的大小 ,颜色,阴影。
  2. SWIG是一个接口编译器,用于将用C和C ++编写的程序与脚本语言(例如Perl,Python,Ruby和Tcl)连接起来。它通过获取C / C ++头文件中的声明并使用它们来生成脚本语言访问基础C / C ++代码所需的包装器代码来工作。此外,SWIG提供了各种自定义功能,可让您定制包装过程以适合您的应用程序。
  3. tableconvert是一个在线表格转换的工具,可以把填写的表格生成markdown,sql等语句。
阅读全文 »

一、实现call函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function.prototype.c = function(t) {
if (typeof this !== "function") {
throw new TypeError('Error')
}
//当传入的t为基础类型时,直接挂载fn会报错
if (typeof t !== 'object') {
t = new Object(t);
}
//t为可选参数,如果不传的话默认上下文为window
t = t || window
//给t创建一个fn属性,并将值设置为需要调用的函数
t.fn = this
//call可以传入多个参数作为调用函数的参数,所以需要将参数剥离出来
const args = [...arguments].slice(1)
const result = t.fn(...args)
//调用函数并将对象上的函数删除
delete t.fn
return result
}
阅读全文 »