国庆期间看了看《码农翻身》这本书的第一章-计算机的世界你不懂。
从中和计算机网络等课程进行对比和细化。
1. 线程
线程一出生就被编了一个唯一的编号,其作用是处理系统分配给它的任务。
线程有三种状态,等待状态,就绪状态,运行状态。
当线程的执行时间过长时会被cup中断从而进入等待状态,处于等待状态的线程在进入运行状态之前必须先进入就绪状态。
一个线程如果占用了大量的cpu资源将会被kill掉然后当做垃圾回收。
处于线程池中的线程在处理完任务后不会被注销,系统重启后线程池全部销毁。
Memcached线程可以帮助网站缓存很多用户数据而且还是分布式的。
在使用线程的时候一定要注意加锁(大Boss操作系统可以解决)
2. TCP/IP
TCP连接是虚拟的,连接的状态信息并不会在路上保存:相反,连接的状态信息是在两端维持的。
三次握手主要是为了验证通信双方的发信和收信能力没有问题。
- 第一次握手:客户端发信,服务器端收到,这时服务器就明白客户端发信能力和自己的收信能力都是没有问题的。
- 第二次握手:服务器发信客户端收到了,此时客户端明白自己的收发信能力和服务器的收发信能力都没有问题,但此时服务器端还不知道自己的发信能力和客户端的收信能力,所以需要第三次握手。
- 第三次握手:客户端发信,服务器端收信,这样就消除了服务器端对于客户端的收信能力的担忧。
两端发送的信息并不是直接到达的,中间将会经过多个路由器的转发。在传输的过程中可能会发生数据包丢失的情况,所以TCP传输采取了超时重传的机制,当经过了一定的时间还没有收到确认包的时候,发送端会重新发送数据。
两个地点传递信息的两种方式,一种是在两点间建立确定的信息通路,信息传递准确,代价高;另一种是建立不确定的通路,代价较低,可靠性也低,丢失则重传。
TCP建立连接需要地址和端口,连接是虚拟的,连接状态信息在两端维持。要进行三次握手。使双方都确认自己和对方的收发能力没问题。信息分成小包经过一系列路由器发送,接收方确认之前发送的包已到达接受方后再发下一个包。如果有丢失等情况则重发。
3. CPU阿甘
我的脑容量很小,所以醒来以后只想起我的创造者告诉我的几件事情:
(1)你的工作就是运行指令。(只负责运行指令其他不管)
(2)你不能保存指令,你的指令全在内存里。
(3)你的第一条指令放在地址0xFFFFFFF0处。
那还有什么可说的,感觉去取第一条指令吧。运行时我只关心两件事:
(1)我工作必备的寄存器就放在我面前的工作台上。
(2)程序计数器,我用它记住我要执行的下一条指令地址。
缓存:根据局部性原理,将经常访问的东西存放在缓存中,这样就不用每次都访问内存了,可以加快速度,因为访问内存是很慢的。 (访问了内存地址之后,不久之后还会再次访问。这就是程序的局限性原理!!!)
4. 进程
冯诺依曼提出存储程序的思想,将专用计算机变成通用计算机。操作系统一开始处理程序是批处理形式的,一次只能运行一个程序。由于硬盘和内存的速度远低于CPU,CPU经常闲置。为了充分利用CPU能力,产生了多任务系统,同时运行多个程序,每个运行的程序叫进程。操作系统维护一个进程控制块(PCB),并经常切换进程。
多个进程共享内存产生了内存访问越界的问题,解决方法有静态重定位和动态重定位,最后产生内存管理单元来控制内存访问。
由于多进程系统可能出现某一进程长期占用CPU导致其它进程假死的问题,产生了分时操作系统,系统定时切换进程。
由于程序内存占用量越来越大,产生了内存分块装载进内存的想法,同样是基于局部性原理。程序也可以比内存大得多。可以给每个程序一个超级大的虚拟空间,再通过MMU映射到真实内存地址上。操作系统维持一个页表,用来映射虚拟页面和物理页面。如果访问一个还没有被映射到物理内存的页面,就会产生缺页中断,操作系统负责到硬盘中调取。地址分成页号和偏移量,MMU负责完成地址的转换。CPU把最常用的页表放到缓存里,加快访问速度。
一个程序被分成了代码段,数据段和堆栈段,操作系统维护一个段表。在每个页的内部,仍然按分页来处理。地址也变成了段号+偏移量。程序非法访问内存,就会产生段错误(segmentation fault)。
装载器创建虚拟地址空间,用一个数据结构把程序的数据颌和代码在硬盘上的位置记录下来,操作系统为程序建立进程,进程开始。代码被读入内存并执行。运行完成,内存空间被清理,覆盖。
由于进程开销过大,在一个程序内部 可以使用多个线程共享进程的所有资源,其目的是像切换进程那样切换线程。程序员要注意不要让线程同时访问一个资源产生冲突。