My Github

随笔分类 -  【012】计算机专业基础

数据结构与算法、操作系统原理、计算机网络原理、深入理解计算机系统...
摘要:Introduction to TCP/IP目前国内讲解HTTP协议的书是在太少了,记忆中有两本被誉为经典的书《HTTP权威指南》与《TCP/IP详解,卷1》,但内容晦涩难懂,学习难度较大。其实,HTTP协议并不复杂,理解起来也不会花费太多学习成本,这本书的出现就及时缓解了该问题。对基础及核心部分的深入学习是成为一名专业技术人员的前提,以不变应万变才是立足之本。此外,这本书也是我的2016年度读书计划中的一本,它和《图解TCP/IP》一起作为计算机网络基础部分为我温故知新了一把,谢谢作者和译者,画了这么多图解让我们理解。 阅读全文
posted @ 2016-10-30 21:05 EdisonZhou 阅读(5815) 评论(3) 推荐(13) 编辑
摘要:Introduction to TCP/IP这是一本图文并茂的网络管理技术书籍,旨在让广大读者理解TCP/IP的基本知识、掌握TCP/IP的基本技能。 书中讲解了网络基础知识、TCP/IP基础知识、数据链路、IP协议、IP协议相关技术、TCP与UDP、路由协议、应用协议、网络安全等内容,引导读者了解和掌握TCP/IP,营造一个安全的、使用放心的网络环境。 同时,这本书也是我的2016年度读书计划中的一本。 阅读全文
posted @ 2016-10-23 15:53 EdisonZhou 阅读(25403) 评论(4) 推荐(59) 编辑
摘要:前面阐述了操作系统具有进程管理、内存管理、外存管理三大核心功能,但是计算机归根是为人类服务的,这就要求计算机必须提供某种机制使得人们可以向计算机发出命令或操纵计算机。也就是说计算机与人之间必须存在某种沟通的机制,这种沟通的机制就是计算机的输入输出机制。输入输出的存在才使得计算机的存在有了意义,就像一个人,如果没有输入输出,那么就不能与外部世界打交道。 阅读全文
posted @ 2016-01-24 02:19 EdisonZhou 阅读(4938) 评论(0) 推荐(1) 编辑
摘要:操作系统是一个魔术师,其提供给用户的就是各种幻想:抽象。进程抽象的是CPU,虚拟内存抽象的是内存,对于磁盘来说,操作系统提供给用户的帮助就是在磁盘外面包裹一层容易使用的抽象,用户直接与这层抽象打交道,而无需了解磁盘的技术细节。在操作系统中,这层为磁盘提供的抽象就是:文件系统。 阅读全文
posted @ 2016-01-24 00:01 EdisonZhou 阅读(4391) 评论(0) 推荐(0) 编辑
摘要:计算机是处理数据的机器,而数据就需要有地方存放。在计算机中,可供数据存放的地方并不太多,除了内存之外,最主要的存储数据的媒介就是磁盘。对于大多数计算机领域的人来说,磁盘通常被看做是一种外部设备。可是,对于现代操作系统来说,磁盘是不可或缺的。虽然早期的操作系统可以基于磁带,但由于操作系统复杂性和性能的不断提升,用磁带作为操作系统的载体已经不合时宜,取而代之的是磁盘。由于操作系统需要存放在磁盘上,且操作系统内的文件系统也是基于磁盘,所以,从某种程度来说,磁盘是操作系统不可分割的一部分,理解磁盘将对理解操作系统的原理具有重要的意义。 阅读全文
posted @ 2016-01-17 02:00 EdisonZhou 阅读(4936) 评论(1) 推荐(3) 编辑
摘要:分页内存管理存在页表大、速度慢、共享困难等缺陷,特别是一个进程只能占有一个虚拟地址空间。于是,新的管理模式—分段管理系统横空出世,分段管理就是将一个程序按照逻辑单元分成多个程序段,每一个段使用自己单独的虚地址空间。这样,一个段占用一个虚拟地址空间,就不会再发生空间增长时碰撞到另一个段的问题,从而避免因空间不够而造成编译失败的情况。而段页式管理是将程序分为多个逻辑段,在每个段里面又进行分页,即将分段和分页组合起来使用。 阅读全文
posted @ 2016-01-09 00:29 EdisonZhou 阅读(7069) 评论(1) 推荐(5) 编辑
摘要:在上一篇介绍的几种多道编程的内存管理模式中,以交换内存管理最为灵活和先进。但是这种策略也存在很多重大问题,而其中最重要的两个问题就是空间浪费和程序大小受限。那么有什么办法可以解决交换内存存在的这些问题呢?答案是分页,它是我们解决交换缺陷的“不二法门”。分页系统的核心在于:将虚拟内存空间和物理内存空间皆划分为大小相同的页面,如4KB、8KB或16KB等,并以页面作为内存空间的最小分配单位,一个程序的一个页面可以存放在任意一个物理页面里。 阅读全文
posted @ 2016-01-02 01:35 EdisonZhou 阅读(33887) 评论(0) 推荐(13) 编辑
摘要:操作系统的两个角色分别是魔术师和管理者,在管理者这个角色中,除了CPU之外,内存是操作系统要管理的另外一个重要资源。内存管理需要达到两个目标:一是地址保护,即一个程序不能访问另一个程序的地址空间。二是地址独立,即程序发出的地址应该与物理主存地址无关。这两个目标就是衡量一个内存管理系统是否完善的标准,它是所有内存管理系统必须提供的基本抽象。 阅读全文
posted @ 2015-12-31 00:17 EdisonZhou 阅读(6409) 评论(0) 推荐(8) 编辑
摘要:我们都见过交通阻塞,一大堆汽车因为争夺行路权,互不相让而造成阻塞,又或者因为车辆发生故障抛锚或两辆车相撞而造成道路阻塞。在这种情况下,所有的车都停下来,谁也无法前行,这就是死锁。死锁的发生,归根结底是因为对资源的竞争。在一个系统里存在多个线程,而这些线程共享该计算机系统里的资源。因为资源竞争而造成系统无法继续推进就难以避免了。本篇就来了解一下什么是死锁,如何应对死锁。 阅读全文
posted @ 2015-12-22 00:11 EdisonZhou 阅读(5674) 评论(3) 推荐(4) 编辑
摘要:我们都知道,进程是运转中的程序,是为了在CPU上实现多道编程而发明的一个概念。但是进程在一个时间只能干一件事情,如果想要同时干两件或者多件事情,例如同时看两场电影,我们自然会想到传说中的分身术,就像孙悟空那样可以变出多个真身。虽然我们再现实中无法分身,但进程却可以办到,办法就是线程。线程就是我们为了让一个进程能够同时干多件事情而发明的“分身术”。 阅读全文
posted @ 2015-12-14 00:34 EdisonZhou 阅读(7108) 评论(1) 推荐(16) 编辑
摘要: 进程作为人类的发明,自然也免不了脱离人类的习性,也有通信的需求。如果进程之间不进行任何通信,那么进程所能完成的任务就要大打折扣。人类的通信方式无外乎对白(通过声音沟通)、打手势、写信、发电报、拥抱等方法。同理,进程也可以通过同样的方式来进行通信。本篇我们就来看看进程的这些交互方式。 阅读全文
posted @ 2015-12-06 01:37 EdisonZhou 阅读(5269) 评论(3) 推荐(11) 编辑
摘要: 在多进程并发的环境里,虽然从概念上看,有多个进程在同时执行,但在单个CPU下,在任何时刻只能有一个进程处于执行状态,而其他进程则处于非执行状态。那么问题来了,我们是如何确定在任意时刻到底由哪个进程执行,哪些不执行呢?这就涉及到进程管理的一个重要组成部分:进程调度,跟随本篇来一起复习下进程调度吧! 阅读全文
posted @ 2015-12-05 00:23 EdisonZhou 阅读(7703) 评论(1) 推荐(12) 编辑
摘要: 进程管理、内存管理和文件管理是操作系统的三大核心功能,那么什么是进程呢?顾名思义,进程就是进展中的程序,或者说进程是执行中的程序。当一个程序被加载到内存之后就变为了进程。因此,我们可以得到:进程=程序+执行。本篇将会对进程、进程模型、进程状态以及进程的缺陷等进行学习,为后续学习进程调度与进程通信打下坚实基础。 阅读全文
posted @ 2015-12-04 00:11 EdisonZhou 阅读(7281) 评论(0) 推荐(12) 编辑
摘要: 上一篇中我们了解了操作系统在计算机系统中扮演着魔术师和管理者的角色,它是一种软件,运行在硬件智商,又为更高层的应用软件提供服务。因此,对底层硬件的了解将帮助我们更好地掌握操作系统。那么,就跟随本篇一起了解下计算机硬件基本知识、内核态与用户态、操作系统结构、系统调用等基本概念吧,有了这些基础,我们再去学习进程管理会有更好的基础。 阅读全文
posted @ 2015-11-28 01:36 EdisonZhou 阅读(14811) 评论(4) 推荐(25) 编辑
摘要: 操作系统原理是大学计算机专业最为重要的一门专业基础课程之一,对于操作系统核心原理的理解对于一个合格的程序员来说十分重要,于是我继续我的“三大原理,两个协议,一种结构”复习,三大原理中操作系统原理首当其冲,这里主要依靠阅读《操作系统之哲学原理》来进行复习,将其中重要的部分记录下来,与各位分享。当然,更推荐大家去读读这本书,相信都会有一定收获。 阅读全文
posted @ 2015-11-26 00:09 EdisonZhou 阅读(15413) 评论(7) 推荐(33) 编辑
摘要:题目:写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。这看起来是道很简单的题目,实现其基本功能,大部分人都能用10行之内的代码解决。可是,当我们要把很多特殊情况即测试用例都考虑进去,却不是一件容易的事情。 阅读全文
posted @ 2015-09-21 22:25 EdisonZhou 阅读(7543) 评论(4) 推荐(4) 编辑
摘要:本题是对于字符串翻转基本算法的两个应用。题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。 阅读全文
posted @ 2015-09-21 00:41 EdisonZhou 阅读(4748) 评论(0) 推荐(1) 编辑
摘要:此篇包含两道题目,都是针对二叉树遍历算法的应用。题目一:输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。题目二:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 阅读全文
posted @ 2015-09-20 14:13 EdisonZhou 阅读(20711) 评论(0) 推荐(3) 编辑
摘要:题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。既然输入的数组是排序的,那么我们很自然地就能想到用二分查找算法。在题目给出的例子中,我们可以先用二分查找算法找到一个3。由于3可能出现多次,因此我们找到的3的左右两边可能都有3,于是我们在找到的3的左右两边顺序扫描,分别找出第一个3和最后一个3。 阅读全文
posted @ 2015-09-20 11:04 EdisonZhou 阅读(7311) 评论(0) 推荐(0) 编辑
摘要:题目:输入两个链表,找出它们的第一个公共结点。碰到这道题,很多人的第一反应就是蛮力法:在第一链表上顺序遍历每个结点,每遍历到一个结点的时候,在第二个链表上顺序遍历每个结点。如果在第二个链表上有一个结点和第一个链表上的结点一样,说明两个链表在这个结点上重合,于是就找到了它们的公共结点。如果第一个链表的长度为m,第二个链表的长度为n,显然该方法的时间复杂度是O(mn)。 阅读全文
posted @ 2015-09-20 00:23 EdisonZhou 阅读(8255) 评论(1) 推荐(2) 编辑