架构师第七周总结
1、操作系统
操作系统是系统软件,它是管理其他应用程序与资源,协调和调度的中枢神经。操作系统屏蔽了底层硬件与上层应用之间的耦合关系,使得上层应用不用关心底层硬件的存在,而专注业务领域的系统开发。
进程与线程
进程是指在系统中正在运行的一个应用程序;程序一旦运行起来就是一个进程;进程是操作系统资源分配的最小单元。进程=线程+内存+文件/网络句柄
线程是指操作系统分配处理器时间资源的基本单元,或者说进程内独立执行的一个单元执行流。线程是程序执行的最小单元。线程=栈+PC(程序计数器)+TLS(线程本地存储,内存)
栈:我们通常都是说调用堆栈,其实在这里堆是没有含义的,在这里就是调用栈的意思。那么我们的栈里面有什么呢?我们从主线程的入口main函数开始,会不断的进行函数调用,每次调用的时候,会把所有的参数和返回地址压入到栈中。
PC:program counter程序计数器,操作系统真正运行的是一个个的线程,而我们的进程只是它的一个容器。PC就是指向当前的指令,而这个指令是放在内存中的。每个线程都有一串自已的指针,去指向自已当前所在内存的指针。计算机绝大部分是存储程序性的,说的就是我们的数据和程序是存储在同一片内存里的,这个内存中既有我们的数据变量又有我们的程序。所以我们的PC指针就是指向我们的内存。
TLS:thread local storage,之前我们看到每个进程都有自已独立的内存,这时候我们会想,我们的线程有没有自已独立的一块内存呢?答案是有的,就是TLS。TLS可以用来存储我们线程所有独立的数据。可以看到:线程才是我们操作系统所真正去运行的,而进程呢,则是像容器一样他把需要的一些东西放在了一起,而把不需要的东西做了一层隔离。
进程间是如何交互的呢?
答案是:通过TCP/IP的端口来实现
线程之间又是如何交互的呢?
线程之间的通信就比较简单,有一大块共享的内存,只要大家的指针是同一个就可以看到各自的内存
小结:
进程要分配一大部分的内存,而线程只需要分配一部分栈就可以了
一个程序至少有一个进程,一个进程至少有一个线程
进程是资源分配的最小单位,线程是程序执行的最小单位
一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行
线程安全
由于一个进程可以拥有多个线程,同一进程的多个线程可以并发执行,cpu对线程的执行是采用轮询的,也就是同一时刻里,只有一个线程执行,其他线程被挂起,这就会存在一个问题:资源竞争。当A线程拿到CPU执行权后,进入到程序执行,获取到临界区资源,然后被线程B给中断了,B进入程序,拿到临界区资源执行后,然后线程A重新获取CPU资源执行。这时就会对临界区资源产生混乱,发生线程的不安全。解决的办法就是对临界区资源使用锁机制,确保在对临界区资源的访问一次只能有一个线程。
锁
锁就是对临界区资源访问进行保护的一种机制,确保临界区资源访问有有序性、正确性。
锁可以分为:独占锁/互斥锁、共享锁、读写锁以及由此衍生出的其他锁机制。
不同的锁类型就是在保证在对临界区资源有序访问的前提下,提高线程并发性的一种机制。
2、文件与磁盘IO
文件最终要落地永久保存就必须借助存储介质,磁盘就是一种永久保存数据的存储介质。磁盘可以分为:传统机械磁盘和SSD磁盘。机械磁盘由于存在机械构造(读写臂、电机、盘片等),易损坏,读写速度低(随机读写)等特性,现在已越来越多的被SSD这种新型的固态磁盘所代替,SSD是用电子元器件代替机械读写臂,盘片,因此读写速度快,而且不易造成物理损坏。
不管是机械磁盘还是固态磁盘,数据存储在上面就会存在一个风险:数据丢失问题。那么为了解决这一问题, 同时提高读写速度,raid技术应用而生。
现在主流的raid技术包括:raid0、raid1、raid10、raid5、raid6
raid0:将n块磁盘组成一个磁盘阵列,对操作系统而言就是一整块磁盘,数据在写入的时候,会把数据分成N块同时向阵列中写入,这样整个写入速度提高了n-1倍。而在读取的时候,也会从N块磁盘中同时读取。raid0解决了数据的读写问题,所有磁盘也都利用上了,但是没有解决数据损坏的问题,如果阵列中的某块磁盘损坏,那么存储在上面的所有数据也都丢失了。
raid1:在raid1中,一份完整的数据是写入到N块磁盘中的,每块磁盘保存了完整的数据,这样其中的某块磁盘损坏,还有其他磁盘上有备份数据,数据的安全性得到了保证,但是数据的读写速度和单块磁盘一样。同时磁盘的利用率为50%
raid10:raid10是raid0和raid1的结合体,N块磁盘先做成raid1,然后所有的raid1再做成raid0,这样既保证了数据的读写性能,同时也保证了数据的安全。但是磁盘的利用率低,也就有50%。这是早期服务器所采用的主流raid技术。
raid5:raid5是采用raid0的思路,数据分成N个块同时随机向N-1块磁盘写入,用剩下的一个磁盘来做校验盘,这样就兼顾了数据的读写性能,同时也最大限度的利用了磁盘,但这种技术只允许阵列中的某一块盘损坏(替换后,可以通过校验盘还原数据块)。
raid6:raid6是在raid5的基础上又增加了一块盘用于存储校验,这样阵列的容错性大大提高,在保证读写速度和数据安全的前提下,最大化利用磁盘
3、HDFS分布式文件系统
raid技术虽然解决了数据读写和数据安全问题,但存储容量是存在上限的(由于物理设计,不可能无限增加磁盘)。基于raid技术的背景下,HDFS分布式文件系统应用而生。它既解决了数据的读写速度和数据安全问题,理论上存储容量也是无限扩展的(可以通过增加节点服务器,运态扩展存储能力)。
HDFS的实现原理是:在HDFS文件系统中,有namenode和datanode两种角色。namenode用于存储数据的元数据信息(文件信息、数据块存储在哪些datanode节点等信息),不存储具体的数据,datanode节点专门用于存储数据块,而且数据块在存储的时候会冗余存储多个副本,保证数据的安全。数据读写请求首先会连接namenode节点,获取文件对应存储/读取的datanode节点信息,然后再连接到具体的datanode节点去上传/下载文件。
小结:HDFS分布式文件系统并不是什么全新的技术,它是对raid的扩展和延伸,是“老瓶装新酒”。因此,在平时接触一种新的知识点/技术的时候,首先要搞懂的是它的原理和系统整体架构。由上至下去层层刨析,先把整体把握住,在具体要用到这个知识点/技术的时候再来学习它的细节性的东西。这样才能学得牢。如果一开始就从细节着手,可能弄懂了,但没有实践,过段时间是很可能会遗忘的,又需要时间来学习。
总结:操作系统是一套复杂的应用程序,它是连接底层硬件与上层应用之间的桥梁,同时也是管理底层硬件,让其有序工作的管家婆。它对用户有友好的操作界面,让用户专注用上层应用的开发和工作。
由于硬件资源是限的而且有些是非常宝贵的,因此就有各种的管理机制。
版权声明: 本文为 InfoQ 作者【傻傻的帅】的原创文章。
原文链接:【http://xie.infoq.cn/article/caa22f71e919721f10041e0c9】。文章转载请联系作者。
评论 (1 条评论)