世界是数字的

这本书是普林斯顿大学教授Brian W. Kernighan 由他开的课程“我们世界中的计算机” 的讲义整理而来,本书主要从硬件、软件和通信三个方面讲了计算机的来世今生,是一本非常好的计算机科普读物。即使是学计算机专业的,我认为也很值得的一读(其实是我基础学的不好啦)。虽然计算机在我们生活中随处可见,甚至可能你的生活已经离不开它,但我们很少知道他们运行的原理。本书不仅从宏观上讲述了计算机发展,而且又能回到现实生活中,告诉我们计算机如何工作,如何改变我们的生活方式。下面主要记录了些我的摘抄和笔记。

信息的通用数字表示

这种取代之所以可行,是因为信息被表示为数字形式而不是专门形式(比如底片上曝过光的感光材料,或者录音带 上的磁化布局)。纸质邮件被数字邮件所取代,纸质地图被电子地图所取代。总之, 信息的不同模拟表示形式被统一的数字表示形式所取代。 我认为这是个很大的进步,正是在这个基础之上,很多东西都能数字化表示,也更加方便用于计算机计算。

硬件

运行中的程序,比如 Word、iTunes 或浏览器,它们的指令就放在内存里;这些程序操作的数据,比如屏幕上显示的照片、正在编辑的文档、正在播放的音乐等,也是放在内存里的;而 Windows、Mac OS X 或其他操作系统,也就是能让你在同一时间运行多个应用程序的幕后功臣,它们运行时的指令还是放在内存里。

磁盘保存信息的方法是对旋转的金属盘片表面的磁性材料上的微小区间进行不同方向的磁化。计算机工作时的嗡嗡声和咔嗒声就是磁盘把磁头移向盘片表面正确位置时发出来的。

闪存也是非易失性的,信息保存为电路里的电荷,每一个电路元件上的电荷不需要加电就可以保持其状态。里面保存的电荷可以通过测试来读取其中的值,也可以擦掉后用新的值覆盖写 入。目前闪存仍然比同容量的传统硬盘贵,但是速度快、轻便、可靠并且节电,在手机、相机等设备中广泛使用,将来可能会取代机械硬盘,比如现在日益流行的SSD闪存。

计算机里的电子线路是由大量基本元件搭建起来的,但基本元件的类型却只有很少几 种。其中最重要的一种是逻辑门电路,用来根据一个或两个输入值计算一个输出值,也就是用输入的电压或电流信号来控制输出的电压或电流信号。只要把足够多的门电路用正确的方式连接起来,就能执行任何计算。

在计算机里面,晶体管基本上就是个开关,也就是用电压控制电流通断的设备。任何复杂系统都 可以构建在这么简单的基础之上。

比特、字节与信息表示

计算机是数字处理器。它们存储和处理离散的信息,这些信息表现为不连续的块,具有不连续的值,基本上就是一个个数值。而与之相对的模拟信息,则是平滑变化的值。

外部世界的数据——声音、图片、运动、温 度,等等一切,在输入端都会尽可能早地转换为数字形式,而在输出端则会尽可能晚地转换回模拟形式。原因就在于数字化的数据容易处理,无论最初来源是什么,数字化数据都可以用多种方式来存储、传输和处理,但模拟信息则不行。

模数转换

文中第2.2节讲述了图片,音乐的数字化原理。胶卷相机的成像,是通过把胶片感光区曝露给被拍物体反射的光线实现的,胶片上不 同区域接收到的不同颜色的光量不同,从而影响胶片上的染料。在胶片显影、印相时,彩色染料数量决定了显示出来的颜色变化。 对数码相机来说,镜头把影像聚焦到一块位于红、绿、蓝滤镜后面的矩形感光器阵列上,感光器由微小的光敏探测器组成。每个探测器存储一定数量的电荷,与落在它上 面的光量成正比。这些电荷被转换为数字值,照片的数字表示就是这些表现光强度的数值序列。探测器越小,数量越多,电荷测量的结果就越精细,数字化图像就能越精确地反映原始的影像。

什么是声音?音源通过振动或快速运动引起空气压力的波动,人的耳朵把这种压力变 化转换为神经活动,经大脑解释之后就形成了“声音”。1870 年代,托马斯·爱迪生 制造了一个叫做“留声机”的机器,这台机器能把声波转换为蜡筒上类似的螺旋沟槽,而通过这些沟槽又能再次创造出同样的气压波动来。把声音转换为沟槽就是“录音”,而从沟槽换回到气压波动就是“回放”。爱迪生的发明迅速地得到改进,1940 年代就出现了密纹唱片(long-playing record)或简称 LP,而且至今还在使用(尽管数量已经不多了)。麦克风随着时间推移把变化的声压转换为变化的值并记录下来,然后根据这些值在乙烯基的盘片上压制出与声压一致的螺旋沟槽。播放 LP 时,唱针随着沟槽 起伏,其运动轨迹被转换为波动的电流,电流经过放大后驱动扬声器或耳机,通过它 们的振动薄膜产生声音。 其实文中讲述的更详细,看起来也更有意思。

软件

能够让计算机完成某种任务的指令序列通称软件。

算法

谢天谢地,指数级算法总算是有点用武之地的。有些算法,特别是密码学中的算法,都是让特定计算任务具有指数级难度的。对于这样的算法,只要选择了足够大的 N,其他人在不知道某个秘密捷径的情况下,是不可能通过计算直接解决问题的。

可在多项式时间内解决的问题,计算机科学家称这类问题为“P”(即“Polynomial”,多项式)。 现实中大量的问题或者说很多实际的问题似乎都需要指数级算法来解决,也就是说,我们还不知道对这类问题有没有多项式算法。这类问题被称为“NP”问题。 NP 的意思是“非确定性多项式”(nondeterministic polynomial),这个术语大概的意思是:这些问题可以用一个算法在多项式时间内靠猜测来解决,而且该算法必须每次都能猜中。在现实生活中,没有什么能幸运到始终都做出正确的选择,所以这只 是理论上的一种设想而已。

程序

不同处理器的汇编语言只能用于为该处理器编写程序。汇编语言通常都与 CPU 的指 令一一对应,能够以特定方式将指令编码为二进制格式,也知道信息在存储器中如何 存放。

而独立于任何 CPU 体系结构的“高级”编程语言的问世真是程序员的福音。 用高级语言编写的代码经过一个翻译程序,可被翻译为目标处理器的汇编指令。这些汇编指令则会进一步被转换为比特,从而能够加载到存储器中并执行。这个翻译程序通常被称作编译器。高级语言程序独立于各种体系结构,通常无需任何修改即可在不同的体系结构上运行, 只要换个编译器编译一下就行。

高级语言——>不同机器使用不同的编译器(中间文件)——>汇编器变成机器语言

Java 最初的目标是开发小型嵌入式系统,例如家用电器和电子设备中的系统,因 此对速度要求不高,但对灵活性的要求很高。Java 的目标后来变成了在网页中运行, 虽然没有成功,但它在 Web 服务中的应用却非常广泛 。另 外,由于去掉了一些危险的特性,并且内建内存管理等避免出错的机制,因此 Java 也 比 C 安全。现在Java又在到安卓中火了一把,这是不是又返璞归真了呢。

软件系统

20 世纪 50 年代初,还没有应用程序与操作系统之分。计算机操作员的任务就是把程序输入计算机,然后把计算结果送交相应的程序员。操作系统最初就是为了代替人工操作员完成上述工作才诞生的。

删除的假象
假设是你明确地执行清空操作。那么这个操作首先清除“回收站”文件夹中的条目,然后把其中文件占用的块回写到空闲块列表。但是,这些文件的内容并没有被删除。 换句话说,原始文件占用的每个块中的所有字节都会原封不动地呆在原地。除非相应的块从空闲块列表中被“除名”并奉送给某个应用程序,否则这些字节不会被新内容覆盖。 比如 Mac 中的“安全擦除”选项在释放磁盘块之前,会先用随机生成的比特重写其中的内容。

解释器和虚拟机是模拟真正或假想计算机的程序,可以面向它们编译并运行代码。JavaScript 程序就是面向解释器编译运行的。

通信

网络

改变要通过声音信号传输的信息的形式叫调制。相反,把这种形式再转换成比特叫解调。而能够完成调制和解调功能的设备就叫调制解调器(modem)。

一个网站要有域名,你还需要为自己的网站准备主机,也就是存放网站内容以对外提供服务的计算机。 同时还需要找一个域名服务器,当别人查询你的域 IP 地址时,好让它告诉人家你主机的 IP 地址即域名解析。

互联网协议(IP)提供的包传递服务是不可靠、无连接的。所谓“无连接”,就是说每个 IP 包都是独立的,和其他 IP 包无关。互联网协议没有状态或记忆力,就是说这 个协议一旦把包传给下一个网关,就不再需要保存关于这个包的任何信息。 IP 包中有个很有趣的部分是 TTL(生存时间,Time To Live 的缩写) ,互联网中一次典型的传包过程通常会经过 15 到 20 个网关,所以经过了 255 跳的包显然有问题,很可能是走环路了。TTL 并不能消除环路,但能防止个别包在遇到环路时永远转圈。

在 TCP 中,字节流切分成片段,放到 TCP 包也就是所谓的报文段里。 在两台计算机主机之间建立 TCP 连接时,不仅要指定计算机,还要指定计算机上的端 口。每个端口表示一个独立的会话。端口用两字节(即 16 位)二进制数表示,于是就有 65 536 个可用端口。这样,在理论上每台主机可以同时承载 65536 个 TCP 会话。

MIME 的意思是多用途互联网邮件扩展(Multipurpose Internet Mail Extensions),实际上它是 SMTP 之外的另一 个协议。

Napster 为我们展示了另外一种模型:中心服务器列出了现在可共享的音乐,但音乐文件本身还是存储在用户自己的计算机上;当文件传输时,文件直接从一个 Naspter 用户传到另一个用户,并不经过中心系统。这样的组织方式就叫 点对点,共享者就是其中的对等点(peer)。

万维网

点击链接,浏览器就会打开一个到 w3.org 域的 80 端口的 TCP/IP 连接,然后发送 HTTP 请求,获取 URL 中域名后面部分表示的信息。 HTTP 协议里有一个从客户端(你的浏览器)向服务器传递信息的机制,叫通用网关接口(Common Gateway Interface,CGI)。只看这个名字,很难想象它能用来传递用 户名和密码、查询条件、单选按钮和下拉菜单选项。CGI 机制在 HTML 里用 … 标签来控制。

HTTP 协议是“无状态”的。“无状态”的意思是,HTTP 服务器不必记住不同客户端,发送的请求信息,只要向客户端返回了请求的页面,它就可丢弃有关这次数据交换的全部记录。

服务器通常为每个客户端分配一个唯一的识别码,包含在 cookie 里;而和这个识别码相关联的永久信息如登录状态、购物车内容、用户喜好等,则由服务器上的数据库来维护。 每当用户再次访问这个网站时,服务器就用 cookie 识别出用户原来之前来过,为其建立或恢复信息。

病毒的传播需要人工介入,也就是只有你的操作才能催生它的传播;而蠕虫的传播却不需要你的援手。

入侵者往往会在个人计算机上安装僵尸(zombie)程序,这类程序平时潜伏着,一旦控制者从互联网发来指令,就会发作并执行诸如发送垃圾邮件等攻击。这些程序 一般也叫肉鸡(bot),控制它们的各个网络通常叫僵尸网络(botnet)。 拒绝服务攻击是精心策划的,通常用僵尸网络来完成:沦陷的肉鸡接到命令后,会在指定时间访问指定网站,从而导致流量骤增。

以前的对称秘钥加密很难解决秘钥分发的问题,由于不需要传送共享的密钥,公钥方案有效解决了密钥分发的问题。 而这里公钥是公开的,公钥加密的主要缺点是算法的运算速度慢,比 AES 这种密钥加密算法要慢好几个数量级。所以,通常不会用公钥加密算法加密全部数据,而是分两步走:先用公钥加密协商出一个共享的会话密钥,再用 AES 加密接下来批量传输的数据。

数字签名:张三首先用自己的私钥对消息进行加密,然后把结果公布出去,然后任何人都能用张三的公钥来解密该消息。因为除了张三之外再也没有别人知道他的私钥,因此接收者可以断定这条消息一定是张三加密过的。

因为公钥算法很慢,所以一般不直接用公钥算法对文档签名,而是签署从原始文档提取出来的小得多的文档。选用适当方法生成的这种小文档无法伪造,也无法从其他文档生成同样的签名值。这样的小文档就叫做消息摘要或密码学散列,目前广泛使用的消息摘要算法有两个。一个是罗纳德·李维斯特开发的 MD5,生成 1 2 8 位 的 摘 要 。 另 一 个 是 S H A - 1 , 来 自 N I S T ( 美 国 国 家 标 准 技 术 研 究 所 ), 生 成 1 6 0 位的摘要。

数据,信息和隐私

搜索引擎一般是将搜索结果是以预先计算好的缓存页面的索引为依托的。
看到作者对安全的讨论,才真的意识到个人的隐私在互联网面前是那么的脆弱,不说那些黑客什么的,单单是那些广告商对人精准的定位都已经让人瞠目结舌了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值