The Hottest Porn Videos Online mecum.porn Quality porns videos Free indian porn tube videos indiansexmovies.mobi hot indian women watch online
Node版本切换
In the lastest nodejs version the Buffer() constructor has been deprecated DEP0005: Buffer() constructor# Type: Runtime (supports --pending-deprecation) The Buffer() function and new Buffer() constructor are deprecated due to API usability issues that can potentially lead to accidental security issues. As an alternative, use of the following methods of constructing Buffer objects is strongly recommended: Buffer.alloc(size[, fill[, encoding]]) - Create a Buffer with initialized memory. Buffer.allocUnsafe(size) - Create a Buffer with uninitialized memory. Buffer.allocUnsafeSlow(size) - Create a Buffer with uninitialized memory. Buffer.from(array) - Create a Buffer with a copy of array Buffer.from(arrayBuffer[, byteOffset[, length]]) - Create a Buffer that wraps the given arrayBuffer. Buffer.from(buffer) - Create a Buffer that copies buffer. Buffer.from(string[, encoding]) - Create a Buffer that copies string. As of v10.0.0, a deprecation warning is printed at runtime when --pending-deprecation is used or when the calling code is outside node_modules in order to better target developers, rather than users. how to switch diffirent versions use module n npm install n -g Usesudo n versionto install specific version And use sudo nto switch Howerver…
JavaScript MD5 function
default 32bit const md5 = function (message, bit) { var sMessage = new String(message); function RotateLeft(lValue, iShiftBits) { return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); } function AddUnsigned(lX, lY) { var lX4, lY4, lX8, lY8, lResult; lX8 = (lX & 0x80000000); lY8 = (lY & 0x80000000); lX4 = (lX & 0x40000000); lY4 = (lY & 0x40000000); lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8); if (lX4 | lY4) { if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); else return (lResult ^ 0x40000000 ^ lX8 ^ lY8); } else return (lResult ^ lX8 ^ lY8); } function F(x, y, z) { return (x & y) | ((~x) & z); } function G(x, y, z) { return (x & z) | (y & (~z)); } function H(x, y, z) { return (x ^ y ^ z); } function I(x, y, z) { return (y ^ (x | (~z))); } function FF(a, b, c, d, x, s, ac)…
Jquery Ajax Upload File (html5 FormData)
How to use Jquery Ajax to upload files with uploading progress get single file let data = $('input[tpye=file]')[0].files[0] let file = new FormData() file.append('file',data) pakage uploading progress xhr function function onprogress(){ var loaded = evt.loaded; var tot = evt.total; var per = Math.floor(100*loaded/tot) console.log(per) } function xhr(){ let xhr = $.ajaxSettings.xhr() if(onprogress && xhr.upload){ xhr.upload.addEventListener("progress" , onprogress, false); return xhr; } } use $.ajax() to upload $.ajax({ url:'url address', type:'POST', contentType:false, processData:false, data:file, xhr:xhr, success:function(res){ //handle funciton } }) more about jquery ajax
大国崛起——百年维新
日本是个善于学习的国家,善于变革的国家,尤其是近代以来,不囿于地域的局限,通过学习、改革、创新,终成世界风云格局中不可忽视的力量。 何以日本能成为东方国家中率先摆脱西方殖民统治的国家?何以日本能成为东方世界中第一个能与西方列强平起平坐的国家?在铭记历史的同时,我们也需要从历史中汲取教训。 在被西方坚船利炮敲开国门后,同清政府的消极不同,日本下定决心要改变状态。无论是出国考察的规模,财政支出的庞大,都前所未闻。在满清政府勾心斗角、纸醉金迷的时候,明治政府为支持工业,支持教育,已经在缩减皇族支出,官员自愿拿出部分薪资以支持政府改革。 各国有各国的国情,在历史的重要转折期,小国往往能更快转型。中国的历史包袱太过沉重,一直以来的天朝上国的高傲不允许中国放下身段向西方学习。这仿佛是一个垂垂老者最后的固执。 始惊、陶醉、终狂,是对日本变革的很好的总结。 此外,从日本变革的过程中,我又看到了,青年人跳动的脉搏,滚热的鲜血。 涩泽荣一,大久保利通、伊藤博文等等,一批批青年人,出现在这个历史舞台上,散发自己的光热。 战后二十年,日本又创造了奇迹,从一片废墟之上,建立起了现代化的国家,这背后的原因,值得深思。 回望历史,尤其是近代历史,每一个中国人都会发自内心的感到悲伤,屈辱,甚至愤恨。然而,铭记历史,不是为了让我们种下仇恨的种子,而是植入自强的基因,平和地看待历史,以史为鉴,是我们应该有的正确态度。 如今,中国正处于历史最关键的时期,这个国家确实存在这许多问题,然而,她自己也意识到了,只是,她的依靠不是外国的施舍,这些问题也不是靠外国的指指点点就能解决,她唯一的依靠,是我们,是处于这个风云时代的,每一个中国人。批判谁都会,而有效的不是一味的批判,是行之有效的解决办法。年轻人,共勉之!
【转】Ubuntu 16.04安装配置Nginx使用Let’s Encrypt
【原文】Ubuntu 16.04安装配置Nginx使用Let's Encrypt Let’s Encrypt是新的认证授权(CA)方式,使用它可以获得免费的TLS/SSL证书-使用HTTPS加密web server。Let’s Encrypt依然在测试阶段,目前,它只支持在Apache web服务器上实现自动安装。但是,Let’s Encrypt允许我们非常容易的获得一个免费的SSL证书,之后我们可以在web服务器上手动配置安装。 本文涉及: 在Ubuntu 16.04上安装Nginx 使用Let’s Encrypt获得免费的SSL证书 配置Nginx使用SSL证书 怎么自动更新SSL证书 安装前提 你必须有一个域名 域名的A记录指向要配置的web服务器 你还要有Ubuntu 16.04的root权限 我使用test.com和www.test.com域名做示例,本文中所有涉及test.com的地方,需要替换为你的域名。 下载Let’s Encrypt客户端 首先使用Let’s Encrypt获得SSL证书,下载letsencrypt。 letsencrypt托管在github,使用git clone下载。 如果没有安装git,安装它: $ sudo apt-get update $ sudo apt-get install git 我把Let’s Encrypt clone到/opt目录: $ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt 获得SSL证书 如果你没有安装Nginx,安装它: $ sudo apt-get install nginx 配置Nginx: $ sudo vim /etc/nginx/sites-available/default 在server块内添加: location ~ /.well-known { allow all; } /.well-known的用处:Let’s Encrypt服务器要对你的web服务器进行验证,确保是你的域名,你的服务器。 你也可以更改网站根目录,默认是/var/www/html 重新加载Nginx使更改生效: $ sudo systemctl reload nginx 获得SSL证书: $ cd /opt/letsencrypt $ ./letsencrypt-auto certonly -a webroot --webroot-path=/var/www/html -d test.com -d www.test.com 在安装过程中提示输入邮箱,用来恢复密钥 接受协议 如果成功,会输出如下信息: IMPORTANT NOTES: ... - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/test.com/fullchain.pem. Your cert will expire on 2016-06-15. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. ... 注意证书保存路径和过期时间。 如果有错误,注意打开防火墙的80和443端口。 其实证书文件保存在/etc/letsencrypt/archive目录中,/etc/letsencrypt/live/test.com里的证书只是指向/etc/letsencrypt/archive最新证书的链接。获得的证书文件: sudo ls -l /etc/letsencrypt/live/test.com cert.pem: 你域名的证书 chain.pem: Let’s Encrypt chain证书 fullchain.pem: cert.pem 和 chain.pem 合并 privkey.pem: 你的证书密钥 为了增加安全,你应该生成Diffie-Hellman: $ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 下面你需要配置Nginx使用fullchain.pem做为证书文件,privkey.pem做为密钥。 配置Nginx使用TLS/SSL 现在已经有了SSL证书,下面来配置Nginx使用证书。 编辑Nginx配置文件/etc/nginx/sites-available/default: $ sudo vim /etc/nginx/sites-available/default 找到server块,注释或删除掉以下行: listen 80 default_server; listen [::]:80 default_server; 在server块内添加如下配置代码使用HTTPS: listen…
【转】配置Nginx做Node.js应用的反向代理 (HTTPS)
【原文】配置Nginx做Node.js应用的反向代理 (HTTPS) 安装Node.js 用PPA你可以的到最新版本的node.js 执行如下命令安装PPA curl -sL https://deb.nodesource.com/setup | sudo bash - 安装 node.js: sudo apt-get install nodejs npm 为了使一些npm包正常工作(例如需要从源码构建的包),你需要安装 build-essentials 包: $ sudo apt-get install build-essential 创建一个简单的Node.js应用 更优雅的启动node.js应用:PM2: 管理Node.js应用进程 配置Nginx做为反向代理 安装Nginx 编辑配置文件 sudo vim /etc/nginx/sites-available/default 把文件中的内容替换为: server { listen 80; server_name your_domain.com; location / { proxy_pass http://localhost:8081; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } 重启nginx 添加HTTPS支持(使用免费的Let’s Encrypt) 从github clone源码: sudo apt-get -y install git bc sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt 获得SSL证书: 由于Let’s Encrypt要使用80端口做认证,所以需要暂停Nginx的运行: sudo systemctl stop nginx 获得证书: cd /opt/letsencrypt ./letsencrypt-auto certonly --standalone 根据提示提供你的信息,包括域名、邮箱啥的。 执行成功之后,证书保存到了/etc/letsencrypt/your_domain/ 配置Nginx: sudo vim /etc/nginx/sites-enabled/default 把内容替换为: # HTTP - 把HTTP请求转向到HTTPS: server { listen 80; listen [::]:80 default_server ipv6only=on; return 301 https://$host$request_uri; } # HTTPS - 反向代理 server { listen 443; server_name your_domain.com; ssl on; # Let's Encrypt生成的SSL证书: ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; # 把请求转到localhost:8081: location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; proxy_pass http://localhost:8081/; proxy_ssl_session_reuse off; proxy_set_header Host $http_host; proxy_cache_bypass $http_upgrade; proxy_redirect off; } } 注意替换上面的域名、证书路径等信息。 再次启动nginx 关于Let’s Encrypt证书的更新,看如下帖:…
Install Nginx On Ubuntu 16.04
【原文】How To Install Nginx on Ubuntu 16.04 install nginx Nginx is available in Ubuntu's default repositories, so the installation is rather straight forward. sudo apt-get update sudo apt-get install nginx Adjust the Firewall (use ufw) get a listing of the application profiles sudo ufw app list //Output Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH enable sudo ufw allow 'Nginx HTTP' verify sudo ufw status Check your Web Server systemctl status nginx Manage the Nginx Process sudo systemctl stop nginx sudo systemctl start nginx sudo systemctl restart nginx //If you are simply making configuration changes, Nginx can often reload without dropping connections. To do this, this command can be used: sudo systemctl reload nginx By default, Nginx is configured to start automatically when the server boots. If this is not what you want, you can disable this behavior by typing: sudo systemctl disable nginx To re-enable the service to start up at boot, you can type: sudo systemctl enable nginx Get Familiar with Important Nginx Files and Directories Content /var/www/html: The actual web content,…
微信小程序Notes
Tips wx.navigateTo 和 wx.redirectTo 不允许跳转到 tabbar 页面,只能用 wx.switchTab 跳转到 tabbar 页面 canvas尺寸设置需要自适应计算,使用API getSystemInfo 参考:【转】微信小程序canvas尺寸设置 - 极乐君的文章 - 知乎 踩坑记录 【转】微信小程序开发踩坑指南 小程序canvas和h5的canvas差别很大,注意区别 【转】两百条微信小程序开发跳坑指南 触控事件触发顺序 动作 触发顺序 单击 tap touchStart -> tap -> touchEnd 长按 longPress touchStart -> longPress -> tap -> touchEnd 区别单击、双击、长按事件 touchStart: function (e) { this.setData({ touchStartTime: e.timeStamp, touchFlag: true }); }, tapJudgement: function (e) { let that = this; that.setData({ touchEndTime: e.timeStamp, }); if (that.data.touchStartTime === null && that.data.touchEndTime === null) { return; } let gap = that.data.touchEndTime - that.data.touchStartTime; if (Math.abs(gap) < 350) { let currentTapTime = e.timeStamp; let lastTapTime = that.data.lastTapTime; that.setData({ lastTapTime: currentTapTime }); if (currentTapTime - lastTapTime < 300 && lastTapTime !== null) { //double tap event clearTimeout(that.data.lastTapTimeoutFunc); wx.showToast({ title: 'double tap event', }); } else { let timer = setTimeout(function () { wx.showToast({ title: 'single tap event', }); }, 300); that.setData({ lastTapTimeoutFunc: timer }); } } }, longpressHandle: function (e) { wx.showToast({ title: 'Trigger long press event', }); this.setData({ touchEndTime: e.timeStamp }); }
thumbnail
[转]为什么目前的串行比并行传输快
文章转自博客园,作者JunerLee,点击访问原文 近两年,大家听得最多的一个词可能就是串行传输了。从技术发展的情况来看,串行传输方式大有彻底取代并行传输方式的势头,USB取代IEEE 1284,SATA取代PATA,PCI Express取代PCI……从原理来看,并行传输方式其实优于串行传输方式。通俗地讲,并行传输的通路犹如一条多车道的宽阔大道,而串行传输则是仅能允许一辆汽车通过的乡间公路。以古老而又典型的标准并行口(Standard Parallel Port)和串行口(俗称COM口)为例,并行接口有8根数据线,数据传输率高;而串行接口只有1根数据线,数据传输速度低。在串行口传送1位的时间内,并行口可以传送一个字节。当并行口完成单词“advanced”的传送任务时,串行口中仅传送了这个单词的首字母“a”。 图1: 并行接口速度是串行接口的8倍   那么,为何现在的串行传输方式会更胜一筹?下文将从并行、串行的变革以及技术特点,分析隐藏在表象背后的深层原因。 一、并行传输技术遭遇发展困境 电脑中的总线和接口是主机与外部设备间传送数据的“大动脉”,随着处理器速度的节节攀升,总线和接口的数据传输速度也需要逐步提高,否则就会成为电脑发展的瓶颈。 我们先来看看总线的情况。1981年第一台PC中以ISA总线为标志的开放式体系结构,数据总线为8位,工作频率为8.33MHz,这在当时却已算是“先进技术”了,所以ISA总线还有另一个名字“AT总线”;到了286时,ISA的位宽提高到了16位,为了保持与8位的ISA兼容,工作频率仍为8.33MHz。这种技术一直沿用到386系统中。 到了486时代,同时出现了PCI和VESA两种更快的总线标准,它们具有相同的位宽(32位),但PCI总线能够与处理器异步运行,当处理器的频率增加时,PCI总线频率仍然能够保持不变,可以选择25MHz、30MHz和33MHz三种频率。而VESA总线与处理器同步工作,因而随着处理器频率的提高,VESA总线类型的外围设备工作频率也得随着提高,适应能力较差,因此很快失去了竞争力。PCI总线标准成为Pentium时代PC总线的王者,硬盘控制器、声卡到网卡和显卡全部使用PCI插槽。 图2: 并行数据传输技术向来是提高数据传输率的重要手段,但是,进一步发展却遇到了障碍。首先,由于并行传送方式的前提是用同一时序传播信号,用同一时序接收信号,而过分提升时钟频率将难以让数据传送的时序与时钟合拍,布线长度稍有差异,数据就会以与时钟不同的时序送达另外,提升时钟频率还容易引起信号线间的相互干扰。因此,并行方式难以实现高速化。另外,增加位宽无疑会导致主板和扩充板上的布线数目随之增加,成本随之攀升。 在外部接口方面,我们知道IEEE 1284并行口的速率可达300KB/s,传输图形数据时采用压缩技术可以提高到2MB/s,而RS-232C标准串行口的数据传输率通常只有20KB/s,并行口的数据传输率无疑要胜出一筹。因此十多年来,并行口一直是打印机首选的连接方式。对于仅传输文本的针式打印机来说,IEEE 1284并行口的传输速度可以说是绰绰有余的。但是,对于近年来一再提速的打印机来说,情况发生了变化。笔者使用爱普生6200L(同时具备并行口和USB接口)在打印2MB图片时,并行口和USB接口的速度差异并不明显,但在打印7.5MB大小的图片文件时,从点击“打印”到最终出纸,使用USB接口用了18秒,而使用并行口时,就用了33秒。从这一测试结果可以看出,现行的并行口对于时下的应用需求而言,确实出现了瓶颈。 你知道吗?IEEE 1284的三种接口 早期的并行口是一种环形端口,IEEE 1284则采用防呆设计的D型连接器。IEEE 1284定义了D-sub、Centronics和MDR-36等三种连接器(图3)。我们所见到打印机电缆,一端是D-sub连接器,用来与主机连接,另一端为带有锁紧装置的Centronics连接器,用来连接到打印机。连接起来不仅方便,而且十分可靠。D-sub连接器有25根插针,而Centronics连接器有36根插针,多出来的11根基本上是冗余的信号地。MDR(Mini Delta Ribbon,小型三角带)连接器也是36根插针,这种小尺寸连接器是为数码相机、Zip驱动器等小型设备而设计的,实际上很少被使用。 图3: 三种不同尺寸的并行口连接器 二、USB,让串行传输浴火重生 回顾前面所介绍的并行接口与串行接口,我们知道IEEE 1284并行口的速率可达300KB/s,而RS-232C标准串行口的数据传输率通常只有20KB/s,并行口的数据传输率无疑要胜出一筹。外部接口为了获得更高的通信质量,也必须寻找RS-232的替代者。 1995年,由Compaq、Intel、Microsoft和NEC等几家公司推出的USB接口首次出现在PC机上,1998年起即进入大规模实用阶段。USB比RS-232C的速度提高了100倍以上,突破了串行口通信的速度瓶颈,而且具有很好的兼容性和易用性。USB设备通信速率的自适应性,使得它可以根据主板的设定自动选择HS(High-Speed,高速,480Mbps)、FS(Full-Speed,全速,12Mbps)和LS(Low-Speed,低速,1.5Mbps)三种模式中的一种。USB总线还具有自动的设备检测能力,设备插入之后,操作系统软件会自动地检测、安装和配置该设备,免除了增减设备时必须关闭PC机的麻烦。USB接口之所以能够获得很高的数据传输率,主要是因为其摒弃了常规的单端信号传输方式,转而采用差分信号(differential signal)传输技术,有效地克服了因天线效应对信号传输线路形成的干扰,以及传输线路之间的串扰。USB接口中两根数据线采用相互缠绕的方式,形成了双绞线结构(图4)。 图4: 采用差模信号传送方式的USB 图5: 差分传输方式具有更好的抗干扰性能 图5是由两根信号线缠绕在环状铁氧体磁芯上构成的扼流线圈。在单端信号传输方式下,线路受到电磁辐射干扰而产生共模电流时,磁场被叠加变成较高的线路阻抗,这样虽然降低了干扰,但有效信号也被衰减了。而在差动传输模式下,共模干扰被磁芯抵消,但不会产生额外的线路阻抗。换句话说,差动传输方式下使用共模扼流线圈,既能达到抗干扰的目的,又不会影响信号传输。 差分信号传输体系中,传输线路无需屏蔽即可取得很好的抗干扰性能,降低了连接成本。不过,由于USB接口3.3V的信号电平相对较低,最大通信距离只有5米。USB规范还限制物理层的层数不超过7层,这意味着用户可以通过最多使用5个连接器,将一个USB设备置于距离主机最远为30米的位置。 为解决长距离传输问题,扩展USB的应用范围,一些厂商在USB规范上添加了新的功能,例如Powered USB和Extreme USB,前者加大了USB的供电能力,后者延长了USB的传输距离。 三、差分信号技术:开启信号高速传输之门的金钥匙 电脑发展史就是追求更快速度的历史,随着总线频率的提高,所有信号传输都遇到了同样的问题:线路间的电磁干扰越厉害,数据传输失败的发生几率就越高,传统的单端信号传输技术无法适应高速总线的需要。于是差分信号技术就开始在各种高速总线中得到应用,我们已经知道,USB实现高速信号传输的秘诀在于采用了差分信号传输方式。 差分信号技术是20世纪90年代出现的一种数据传输和接口技术,与传统的单端传输方式相比,它具有低功耗、低误码率、低串扰和低辐射等特点,其传输介质可以是铜质的PCB连线,也可以是平衡电缆,最高传输速率可达1.923Gbps。Intel倡导的第三代I/O技术(3GIO),其物理层的核心技术就是差分信号技术。那么,差分信号技术究竟是怎么回事呢? 图6: 差分信号传输电路 众所周知,在传统的单端(Single-ended)通信中,一条线路来传输一个比特位。高电平表示为“1”,低电平表示为“0”。倘若在数据传输过程中受到干扰,高低电平信号完全可能因此产生突破临界值的大幅度扰动,一旦高电平或低电平信号超出临界值,信号就会出错(图7)。 图7: 单端信号传输 在差分电路中,输出电平为正电压时表示逻辑“1”,输出负电压时表示逻辑“0”,而输出“0”电压是没有意义的,它既不代表“1”,也不代表“0”。而在图7所示的差分通信中,干扰信号会同时进入相邻的两条信号线中,当两个相同的干扰信号分别进入接收端的差分放大器的两个反相输入端后,输出电压为0。所以说,差分信号技术对干扰信号具有很强的免疫力。 图8: 差分信号传输 正因如此,实际电路中只要使用低压差分信号(Low Voltage Differential Signal,LVDS),350mV左右的振幅便能满足近距离传输的要求。假定负载电阻为100Ω,采用LVDS方式传输数据时,如果双绞线长度为10米,传输速率可达400Mbps;当电缆长度增加到20米时,速率降为100Mbps;而当电缆长度为100米时,速率只能达到10Mbps左右。 在近距离数据传输中,LVDS不仅可以获得很高的传输性能,同时还是一个低成本的方案。LVDS器件可采用经济的CMOS工艺制造,并且采用低成本的3类电缆线及连接件即可达到很高的速率。同时,由于LVDS可以采用较低的信号电压,并且驱动器采用恒流源模式,其功率几乎不会随频率而变化,从而使提高数据传输率和降低功耗成为可能。因此,LVDS技术在USB、SATA、PCI Express以及HyperTransport中得以应用,而LCD中控制电路向液晶屏传送像素亮度控制信号,也采用了LVDS方式。 四、新串行时代已经到来 差分传输技术不仅突破了速度瓶颈,而且使用小型连接可以节约空间。近年来,除了USB和FireWire,还涌现出很多以差分信号传输为特点的串行连接标准,几乎覆盖了主板总线和外部I/O端口,呈现出从并行整体转移到新串行时代的大趋势,串行接口技术的应用在2005年将进入鼎盛时期(图9)。 图9: 所有的I/O技术都将采用串行方式 1.LVDS技术,突破芯片组传输瓶颈 随着电脑速度的提高,CPU与北桥芯片之间,北桥与南桥之间,以及与芯片组相连的各种设备总线的通信速度影响到电脑的整体性能。可是,一直以来所采用的FR4印刷电路板因存在集肤效应和介质损耗导致的码间干扰,限制了传输速率的提升。 在传统并行同步数字信号的速率将要达到极限的情况下,设计师转向从高速串行信号寻找出路,因为串行总线技术不仅可以获得更高的性能,而且可以最大限度地减少芯片管脚数,简化电路板布线,降低制造成本。Intel的PCI Express、AMD的HyperTansport以及RAMBUS公司的redwood等I/O总线标准不约而同地将低压差分信号(LVDS)作为新一代高速信号电平标准。 一个典型的PCI Express通道如图9所示,通信双方由两个差分信号对构成双工信道,一对用于发送,一对用于接收。4条物理线路构成PCI Express x1。PCI Express 标准中定义了x1、x2、x4和x16。PCI Express x16拥有最多的物理线路(16×4=64)。 图10: PCI Express x1数据通道 即便采用最低配置的x1体系,因为可以在两个方向上同时以2.5GHz的频率传送数据,带宽达到5Gbps,也已经超过了传统PCI总线1.056Gbps(32bit×33MHz)的带宽。况且,PCI总线是通过桥路实现的共享总线方式,而PCI Express采用的“端对端连接”(图11),也让每个设备可以独享总线带宽,因此可以获得比PCI更高的性能。 图11: PCI Express端对端连接消除了桥路 AMD的HyperTransport技术与PCI Express极其相似,同样采用LVDS数据通道,最先用于南北桥之间的快速通信。其工作频率范围从200MHz到1GHz,位宽可以根据带宽的要求灵活选择2、4、8、16或32位。HyperTransport最先用于南北桥之间的快速通信,今后会用于所有芯片间的连接。 2.SATA,为硬盘插上翅膀 在ATA33之前,一直使用40根平行数据线,由于数据线之间存在串扰,限制了信号频率的提升。因此从ATA66开始,ATA数据线在两根线之间增加了1根接地线正是为了减少相互干扰。增加地线后,数据线与地线之间仍然存在分布电容C2(图12),还是无法彻底解决干扰问题,使得PATA接口的最高工作频率停留在133MHz上。除了信号干扰这一根本原因之外,PATA还存在不支持热插拔和容错性差等问题。 图12: 并行ATA的线间串扰 SATA是Intel公司在IDF2000上推出的,此后Intel联合APT、Dell、IBM、Seagate以及Maxtor等业界巨头,于2001年正式推出了SATA 1.0规范。而在春季IDF2002上,SATA 2.0规范也已经公布。 SATA接口包括4根数据线和3根地线,共有7条物理连线。目前的SATA 1.0标准,数据传输率为150MB/s,与ATA133接口133MB/s的速度略有提高,但未来的SATA 2.0/3.0可提升到300MB/s以至600MB/s。从目前硬盘速度的增长趋势来看,SATA标准至少可以满足未来数年的要求了。 3.FireWire,图像传输如虎添翼 FireWire(火线)是1986年由苹果电脑公司起草的,1995年被美国电气和电子工程师学会(IEEE)作为IEEE 1394推出,是USB之外的另一个高速串行通信标准。FireWire最早的应用目标为摄录设备传送数字图像信号,目前应用领域已遍及DV、DC、DVD、硬盘录像机、电视机顶盒以及家庭游戏机等。 FireWire传输线有6根电缆,两对双绞线形成两个独立的信道,另外两根为电源线和地线。SONY公司对FireWire进行改进,舍弃了电源线和地线,形成只有两对双绞线的精简版FireWire,并取名为i.Link。 FireWire数据传输率与USB相当,单信道带宽为400Mbps,通信距离为4.5米。不过,IEEE 1394b标准已将单信道带宽扩大到800Mbps,在IEEE 1394-2000新标准中,更是将其最大数据传输速率确定为1.6Gbps,相邻设备之间连接电缆的最大长度可扩展到100米。 五、“串行”能红到哪天? 阅读本文之后,如果有人问关于串行传输与并行传输谁更好的问题,你也许会脱口而出:串行通信好!但是,串行传输之所以走红,是由于将单端信号传输转变为差分信号传输,并提升了控制器工作频率的原因,而“在相同频率下并行通信速度更高”这个基本道理是永远不会错的,通过增加位宽来提高数据传输率的并行策略仍将发挥重要作用。当然,前提是有更好的措施来解决并行传输的种种问题。 技术进步周而复始,以至无穷,没有一项技术能够永远适用。电脑技术将来跨入THz时代后,对信号传输速度的要求会更高,差分传输技术是否能满足要求?是否需要另一种更好的技术来完成频率的另一次突破呢?不妨拭目以待!