码农翻身 各章节链接

大话编程

我是一个线程

我是一个Java class

Javascript: 一个屌丝的逆袭

Java:一个帝国的诞生

JSP:一个装配工的没落

TCP/IP 之 大明王朝的邮差

TCP/IP 之 大明内阁

TCP/IP 之 蓟辽督师

CPU 阿甘

CPU 阿甘之烦恼

CPU 阿甘:函数调用的秘密

我是一个网卡

我是一个路由器

我是一个进程

我是一块硬盘(上)

我是一块硬盘(下)

我是一个键盘

张大胖的socket

张大胖学递归

学习面向对象的令狐冲

张大胖学数据库

数据库村的旺财和小强

小李的数据库之旅(上)

小李的数据库之旅(下)

漫画:什么是机器学习

那些烦人的同步和互斥问题

IE为什么把Chrome和火狐打伤了

对浏览器村的第二次采访

节约标兵IE的自述

EMail 诞生记(上)

EMail 诞生记(下)

Http 历险记(上)

Http 历险记(下)—Struts的秘密

动物王国的面向对象

冯·诺伊曼计算机的诞生

Http Server: 一个差生的逆袭

张大胖的加法器

从1加到100:一道简单的数学题挑战下你的大脑

摘录:

所谓编程,就是把自然语言的需求翻译成计算机语言, 让计算机去执行。 对于刚入行的人, 理解CPU和内存是怎么在一起工作的, 绝对是基础中的基础。

如果我们简化一下, CPU和内存其实特别简单,内存就是一个个的小格子, 每个格子都有一个编号, 格子中的数据可以被CPU所读写。

 

CPU 内部的构造超级复杂, 但我们这次只关注两个东西:

一是运算器,可以做各种运算, 但是有个限制,这个运算器不能直接操作内存进行运算, 他在运算时使用的是内部的数据格子(学名叫寄存器), 为了区分开, 我把他们叫做R1,R2,R3,R4,假设只有这么4个, 统称Rx。 

CPU必须把数据装载到寄存器中才能运算

CPU运行速度快的令人发指, 但是它能做的事情却简单的令人发指, 主要是以下四种

(1) 从内存的某个格子中读取数据放入自己内部的寄存器Rx

(2) 把Rx的数据写入内存的某个格子中(会把原有数据覆盖)

(3) 进行数学运算和逻辑运算

(4) 根据条件进行跳转

数学运算就是加减乘除, 逻辑运算就是AND , OR 这样的基本运算,没接触过的暂时可以不用深究。

根据条件进行跳转就是从一个指令跳转到另外一个指令。

切记切记: 内存只是一个个可以读写的格子, CPU简单到只能做上面描述的4件事。

因为CPU不能直接操作内存进行运算, 需要把数据从内存和CPU之间搬来搬去。

还有一个问题,CPU在运行的时候,从哪里取获得那些指令?

估计你已经想到了, 对,就是内存 ,指令也需要在内存中才能够被CPU访问到, CPU从内存读到指令以后,会进行分析(译码) , 看看这个指令是干什么的, 然后再进行运算。

 

所以我们的内存小格子中不仅仅存放的是数据,还存放着至关重要的程序指令我们需要告诉CPU第一条指令在什么地方, 然后CPU就可以疯狂的开始运行了:

这些指令在内存中肯定不是我们看到的自然语言, 而是二进制的表示

那内存的数据又是从哪里来的?  肯定是硬盘了, 我们写好的程序会放在硬盘上, 在运行的时候才调入内存。

小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?

摘录:

当你在浏览器中输入网址(例如www.coder.com)并且敲了回车以后, 浏览器首先要做的事情就是获得coder.com的IP地址,具体的做法就是发送一个UDP的包给DNS服务器,DNS服务器会返回coder.com的IP, 这时候浏览器通常会把IP地址给缓存起来,这样下次访问就会加快。

比如Chrome, 你可以通过chrome://net-internals/#dns来查看。

有了服务器的IP, 浏览器就要可以发起HTTP请求了但是HTTP Request/Response必须在TCP这个“虚拟的连接”上来发送和接收。

想要建立“虚拟的”TCP连接,TCP邮差需要知道4个东西:(本机IP, 本机端口,服务器IP, 服务器端口),现在只知道了本机IP,服务器IP, 两个端口怎么办?

本机端口很简单,操作系统可以给浏览器随机分配一个, 服务器端口更简单,用的是一个“众所周知”的端口,HTTP服务就是80, 我们直接告诉TCP邮差就行。

经过三次握手以后,客户端和服务器端的TCP连接就建立起来了! 终于可以发送HTTP请求了。

之所以把TCP连接画成虚线,是因为这个连接是虚拟的, 详情可参见之前的文章《TCP/IP之大明邮差》,《张大胖的Socket



一个HTTP GET请求经过千山万水,历经多个路由器的转发,终于到达服务器端(HTTP数据包可能被下层进行分片传输,略去不表)。

Web服务器需要着手处理了,它有三种方式来处理:

(1) 可以用一个线程来处理所有请求,同一时刻只能处理一个,这种结构易于实现,但是这样会造成严重的性能问题。

(2) 可以为每个请求分配一个进程/线程,但是当连接太多的时候,服务器端的进程/线程会耗费大量内存资源,进程/线程的切换也会让CPU不堪重负。

(3) 复用I/O的方式,很多Web服务器都采用了复用结构,例如通过epoll的方式监视所有的连接,当连接的状态发生变化(如有数据可读), 才用一个进程/线程对那个连接进行处理,处理完以后继续监视,等待下次状态变化。 用这种方式可以用少量的进程/线程应对成千上万的连接请求。

(码农翻身注:详情参见《Http Server:一个差生的逆袭》)

我们使用Nginx这个非常流行的Web服务器来继续下面的故事

对于HTTP GET请求,Nginx利用epoll的方式给读取了出来, Nginx接下来要判断,这是个静态的请求还是个动态的请求啊?

如果是静态的请求(HTML文件,JavaScript文件,CSS文件,图片等),也许自己就能搞定了(当然依赖于Nginx配置,可能转发到别的缓存服务器去),读取本机硬盘上的相关文件,直接返回。

如果是动态的请求,需要后端服务器(如Tomcat)处理以后才能返回,那就需要向Tomcat转发,如果后端的Tomcat还不止一个,那就需要按照某种策略选取一个。

两个程序的爱情故事

两个程序的爱情故事(续)

烂代码传奇

机房夜话

干掉状态:从session到token

张大胖的docker之路

从SOA到微服务

XML的传奇人生

从密码到token, 一个授权的故事

编程世界的那把锁

加锁还是不加锁,这是一个问题

这个动物园, 两年也逛不完

张大胖和CAP定理

一个翻译家族的发家史

张大胖和单元测试

 

编程语言

Javascript: 一个屌丝的逆袭

计算机语言之战

我和编程语言的爱恨情仇(上)

我和编程语言的爱恨情仇(下)

Android为什么选择了Java?

iOS为什么选择了Objective-C?

Basic :一个老兵的自述

Node.js :我只需要一个店小二 只用一个线程来处理所有请求,事件驱动编程

命令式编程 vs 声明式编程

编译还是解释?

 

程序人生

15年编程生涯,资深架构师总结的7条经验

架构师小赵

师兄说

师姐说

小王的架构师之路

小李的版本管理系统

小超穿越记

小李的Build之路(上)

小李的Build之路(下)

张大胖改Bug

我的编程之路—大学趣事

码农小王的一天

小李在外企

张大胖的需求估算

从厨师到码农

聊一聊那些神一样的程序员们(上)

聊一聊那些神一样的程序员们(中)

聊一聊那些神一样的程序员们(下)

谁是互联网之父?

一个价值百万的创业教训

让自己与众不同—提升工作的价值

看看你的“易燃性”

从无聊的工作中寻找价值

什么样的学生适合报考计算机?

谈谈程序员的职业方向(上)

谈谈程序员的职业方向(中)

谈谈程序员的职业方向(下)

谈谈培训班的作用

码农需要知道的“潜规则

学习编程的加速度

码农在工作中必备的能力

码农和英语

一声叹息

 

老司机经验

假如时光倒流,我会这么学Java

假如我是计算机系老师

学会编程,而不是学会Java

从增删改查中突围

抽象:程序员必备的能力

懒就一个字

编程的自学方法

小王买房记

从一道面试题谈谈一线码农应该具备的基本素质

想写框架的看过来

苹果手机变砖头以后

如何快速的学习一门技术

唯一不变的是变化:谈谈微信应用号

什么是企业应用?

为什么说远离企业应用开发?

勿以浮沙筑高台

为什么敏捷开发难于成功?

localhost vs 127.0.0.1

GitHub/Stackoverflow 找工作时有什么用?

动词 or 名词 :这是一个问题

如何选择入门语言

有时候,沉默是金

零Bug代码怎么炼成的?

浮点数为什么不精确?

文章错误大全

Open Source—不要为了开源而开源

一不留神,代码就腐化了

先做个“键盘侠”,再来写程序

不加断点调试的程序员是好程序员:思考, 不看代码的思考, 是最好的调试方式。

码农必备技能:烂代码的处理之道(上)

码农必备技能:烂代码的处理之道(下)

学习数据结构有用吗?

从现在开始,丰富你的简历

那些永不过时的书,你看过几本?

学好编程必备的一个品质你知道吗?

 

你最爱的Java

搞懂了这几点,你就学会了Web编程

Spring本质系列(1) -- 依赖注入

Spring本质系列(2) -- AOP

三层架构和MVC那点事儿

Java帝国之拨云见日识回调

小张的Duck Typing

JDBC的诞生

JDBC后传

一个不安分的JDBC驱动

Java帝国之 Java Bean(上)

Java帝国之 Java Bean(下)

Java帝国之 函数式编程(上)

Java帝国之 函数式编程 (下)

关于Java初学者需要知道的10件事

Junit你不知道的那些事儿

Java EE的历史

Java EE读书指南

给小白的Java EE指南(1)

给小白的Java EE指南(2)

给小白的Java EE生存指南(3):XML

给小白的Java EE生存指南(4):一只叫TOM的猫

给小白的Java EE指南(5):AJAX

给小白的Java EE生存指南(6):Java反射

 

什么是框架?

学习Java虚拟机没用? 听听当事人是怎么说的!

聊聊Java 平台上的非Java语言

Java 帝国之消息队列

Java帝国之JMS的诞生

Java帝国之单例设计模式

对Java Inputstream的一次采访

ASM: 一个低调成功者的自述

序列化: 一个老家伙的咸鱼翻身

Java IO 的自述

JDK先生最近有点烦

什么是框架(续)?

说“空话”,做实事: 谈谈多态

Kotlin初体验

 

 

闲聊

饿了么初体验

来自大脑的控诉

一个高中生是怎么玩自媒体的?

尝试“分答”

到底应不应该上培训班?

自学编程中遇到问题怎么办?

据说99%的初级程序员看完后都不迷茫了

一行代码引发的“血案”

对一个死锁问题的思考

通过外包进入名企

请开往十年前的今天

为什么自学中最好有个师傅指导一下?

这个网站值得你花时间投入

 

编程感悟

看看“悲催”的码农得学多少东西?

学习编程的四兄弟

那些年,我后悔没做好的事情

我为什么对后端编程情有独钟?

当我们在学习编程语言时,我们在学习什么?

编程需要多少数学知识?

想成为编程高手,一定要学汇编吗?

你必须要理解的计算机核心概念

 

职场

我所尊敬的三位女程序员

凡事必先骑上虎背,给性格内向的程序员聊几句

我们向印度人学习什么?

你去下家面试,怎么评价你在这家公司做的工作?

 

开发流程

你的需求是怎么描述的?

白话敏捷软件开发

  • 70
    点赞
  • 418
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值