程序员的自我修养笔记第一章

Posted tab_tab_tab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员的自我修养笔记第一章相关的知识,希望对你有一定的参考价值。

                1.2万变不离其宗

早期的计算机体系的硬件设计:

虽然经过N年变化变成这样:

看似复杂,却没有摆脱原来的框架模型,和原来的模型核心几个点:IO、内存、CPU始终没有没有改变。因此是可以看成是最早的模型,或者说标题= = 万剑不离其宗。。。
好吧。。。总的也就这么多。现在记录下这一节学到的东西吧
1.计算机历史:早期的计算机CPU频率和内存频率几乎保持着一致性,所以看图1-1发现内存竟然和CPU挂在同一条总线。
改进1(速度方向上的):后来CPU频率远远超出内存IO频率,因而,引入了系统总线,把CPU从总线上分离出去。
改进2(大量数据方向上的):后来后来的图形化设备的流行,极度需要大量数据快速在CPU和内存之间交换,因而引入了南北桥,专门负责处理处理这些。。。(北桥挂高速IO设备,南桥挂低速IO设备,呃,至于怎么记忆…可以把北桥想象成人的心脏,快速运作)
2.SMP和多核处理
引入原因:CPU具有物理瓶颈,速度不是无限大的,一块有限芯片里面集成的电路密度也是有限的,如果太密就有什么物理上的电子之间的相互影响之类的,这个不太懂,不过大概意思就是这样。。。
频率上限:4GHZ
改进思路1:改进工艺,用全新的技术来做(废话,不太现实)
改进思路2:SMP(对称多处理器) 意思就是使用若干个相互独立的CPU一样。
这时候我们是时候进行一波数学上的分析了,假设有一个CPU价格为x元,SMP 系统集成了k个CPU,那么价格就≈kx。对于商用服务器来说,或许能承受,但是对于个人用户来说就难以承受了。这就是SMP体系的缺点1:价格高
另外,不是集成CPU越多就越high,因为程序不是所有的都是可以分离的,有得程序是不具有相互独立性的,就好像生孩子一样,一个孕妇生孩子要10个月,十个孕妇生一个孩子不能只是一个月一样。。。。SMP体系的缺点2:不一定越多核心越快
因此引入了多核处理器
改进2:多核处理器,CPU的组件也是有贵有便宜的,因此可以选择核心的一些必不可少的组件来构造多核,对于一些昂贵的,比如缓存组件有关的可以选择共享。这样,多核处理器无法解决缺点2,但是他能解决缺点1,适合大众使用。。。
记住重点:SMP和多核处理器几乎没有任何区别,只是前者拥有独立缓存后者是共享缓存。
1-3计算机体系结构

一般最下面的一层是硬件,由硬件出厂商定义的接口,呃,这个可以忽略掉,知道就好了。
然后操作系统利用硬件接口实现了一系列功能,作为接口提供给用户程序使用,这个就是第二层:系统调用。使用系统调用请记住:调用系统调用代价是极度昂贵的!
呃,其实上面没讲什么….重点是一句话:
系统调用是通过软中断来实现的,Linux系统的中断0x80作为中断调用号,windows用0x2E作为系统调用号。
1-4不要让CPU打盹
- -!沿着计算机发展历史往前走吧!
早期:单道程序设计,操作系统只能跑一个程序,一个程序跑完才能下一个,缺点不用说了吧,几乎都是缺点,唯一好处就是这样实现比较简单
中期:多道程序设计: = =发现单道程序太水了,一个进程可能不是密集计算型任务,假设99%时间都在IO,那么你的CPU也就在99%的时间内空转着!!!这谁也受不了吧,CPU可是超级昂贵的啊,在那个时候。于是人们想出来让一个进程IO时候,阻塞该进程,让别的进程继续在CPU跑起来。。。。但是请记住是IO时候才会让进程让CPU,当然,手残的程序员主动调用相应系统调用可能也会发生这种进程切换。。。但是这种不太现实,,,
每个程序员都希望自己占用的资源足够多。于是有得程序员默默写下下面的语句while(1);这时候CPU就完全被它占用了,其他程序员的进程看上去就好像“死机”了一样。。。留下一群一脸懵逼的程序员
这就是多道程序设计的第一个缺点:进程不主动放弃CPU就不会调度,请记住while(1)!
然后直接说第二个缺点吧:缺乏优先级,可能有的进程是很快就完成计算,然后就结束的。。。。但是却因为简单的调度策略,一直排队排了十分钟。。。比如用户点击鼠标。。。。
作为用户,你能忍受点击鼠标十分钟后才反应吗?你能忍受别的程序写了一个死循环然后你的计算机就“死机”,你只能重启吗?
后期:分时系统,,,,这时候操作系统就像是ZF,所有的部门,所有的用户程序级别都比他低!!并且每个进程相互独立,相互不影响。然后在操作系统老大的指点下,CPU给某一个进程跑一段时间,然后时间片用完了,就可以把它“踢”出来,让别的进程进去。当然,有更高优先级进程来到,也可以把当前占用CPU的进程踢出去。
这时候我就用一个简单的例子来形容吧,人的世界……..假设在银行只有一个窗口,一群人来这里办理业务
调度策略1:
逐个逐个客户服务,呃,假设前面有人身份证忘了带,然后回家取,这时候银行所有人都在等着这个人,只有他拿了身份证回来并且完成注册并且满意的离开了,才轮到下一个。
调度策略2:
也是逐个逐个客户服务,不过这时候窗口的银行MM学会聪明了,问客户带了身份证没有?带了银行卡没有?没有?没有就自己回去取,然后再过来排队吧!但是客户不主动走,银行MM就不能嫌弃人家的。。。。
调度策略3:
呃,这时候我们的银行MM实在太漂亮,有得人一直不舍得离开,顺势在那里勾搭起妹子来………所以银行不得不定下以下策略:每个用户最多10分钟,假设10分钟后还没办完,就要给下一个用户办理,这样虽然对大多数用户来说都更公平。。这时候又来了问题,超级客户来了,总不能让他等吧?所以银行都是有一个VIP窗口…..
计算机在模拟着现实世界…….
1.4-2硬件
磁盘的基本单位是扇区,大小一般是512字节,磁盘分成x1个扇片,一个扇片有两个扇面,一个扇面上有x2个磁道,一个磁道分成(非均等)x3个扇区。那么磁盘大小为x1*2*x2*x3*512大小。(磁盘计算公式
逻辑扇区编号:意思就是给上面的那么多个扇区编号,让别人用起来简单点,不是复杂的说第几扇片第几扇面第几磁道第几扇区,而是简单的说**扇区就可以了。
1-5内存
有限的内存资源分配给进程,注意点有
a.进程的隔离,防止进程访问或者破坏其他进程的内容
b.内存利用率问题,如果考虑整个程序装入内存,然后执行一段时间后再调度出来,轮到该进程再把它从磁盘装入内存,那么效率无疑是噩梦级别的
c.程序的运行地址不明确,也就是所谓的重定向问题,唉,举例子吧,例如在VC底下最常见的一个地址就是0x0012ff7c,几乎每一个VC下编译的程序都用到了这个地址,或者说是逻辑地址,但是你们觉得如果这个逻辑地址就是直接的物理地址。。会照成什么后果??是不是两个VC程序都能同时跑起来?你们觉得现实吗?这样做的话。很明显这是不合理的,因而才有逻辑地址,线性地址,物理地址的概念。在linux系统上,逻辑地址可以姑且认为是形如0x0012ff7c之类的地址,由程序在编译时候所明确使用的地址。为了简化本文,姑且认为线性地址=逻辑地址吧,具体来说,线性地址是经过段映射后得到的地址,但是Linux平台把段映射设置成一种非常特殊的映射,映射前后,地址值本身没有发生任何改变,Linux把真正区分物理地址的工作留给了我们亲爱的页式映射,也就是所谓的线性地址到物理地址的这个过程中。具体想了解的可以自行网上查阅相关资料。
关于段映射和页映射,还有进程线程之类的,我以后再写相应内容吧,,,,不想写的太简单了 - -!

以上是关于程序员的自我修养笔记第一章的主要内容,如果未能解决你的问题,请参考以下文章

读书笔记|《程序员的自我修养》- 04 可执行文件的装载与进程

读书笔记|《程序员的自我修养》- 04 可执行文件的装载与进程

程序员的自我修养

程序员的自我修养

程序员的自我修养读后感一

读书笔记|《程序员的自我修养》- 03 静态链接