第九章-网络编程(上)(9.1-9.3)

第九章 - 网络编程(上)(9.1-9.3)

9.1 操作系统基础

9.1.1 操作系统概述

1、操作系统的出现

现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。现代计算机系统是一个复杂的系统。

人们无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的,有了操作系统人们就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件的编写就可以了,应用软件直接使用操作系统提供的功能来间接使用硬件。

操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序。操作系统所处的位置。

2、操作系统

操作系统位于计算机硬件与应用软件之间,本质也是一个软件。操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成,所以,单纯的说操作系统是运行于内核态的,是不准确的。

3、操作系统的作用

操作系统应该分成两部分功能:

一、作为用户与计算机硬件系统之间的接口

为应用程序提供如何使用硬件资源的抽象。操作系统算是一个巨大的软件,用来给软件系统提供能够简单控制硬件系统的接口。通过操作系统,用户能够方便、快捷的操纵计算机硬件和运行自己的程序。

(1)命令方式。(例如 Windows 的 Command Prompt,Linux 的 shell 等等。)
(2)系统调用方式。(例如系统提供的一些时钟控制函数等等。)
(3)图像、窗口方式。(就是我们日常使用的图形窗口软件等等。)

二、作为计算机系统资源的管理者

计算机的软硬件资源可分为四类:处理机、存储器、I/O 设备、信息(程序与数据)。而操作系统主要的作用也就是对这四类资源进行管理。现代的操作系统运行同时运行多道程序,操作系统的任务是在相互竞争的程序之间有序地控制对处理器、存储器以及其他I/O接口设备的分配。

三、用作扩充机器

通过操作系统,可以通过 I/O 等一系列接口扩充系统的功能(比如打印机等),增强机器的功能。


9.1.2 操作系统发展史

计算机硬件和软件共同构成计算机系统。计算机硬件的每一次革新都伴随着操作系统的发展。

操作系统的发展大致分为4个阶段。

第一代的电子管计算机诞生于20世纪40年代,当时操作系统尚未出现,程序员直接与硬件打交道;

第二代的晶体管计算机始于20世纪50年代,为了提高计算资源的使用效率,减少空闲时间,提出了单道批处理系统;

20世纪60年代,随着小规模集成电路的发展,出现了多道批操作系统,以进一步提高资源的使用效率;

20世纪70年代,大规模集成电路飞速发展,操作系统百家争鸣,涌现出UNIX、DOS、Windows、Mac OS、Linux等著名的操作系统。

随着大规模集成电路的发展,微处理器的性能日益强大,计算机逐渐从大型机发展为微型机,操作系统的发展也进入了个人计算机和工作站时代。两款著名的操作系统占领了大部分PC市场:微软公司编写的MS-DOS操作系统主要运行在IBM个人计算机和使用英特尔处理器的计算机中;UNIX则主要运行在使用摩托罗拉处理器的大型个人计算机中。

【第一代 穿孔卡片】

第一代计算机的产生背景:

第一代之前人类是想用机械取代人力,第一代计算机的产生是计算机由机械时代进入电子时代的标志,从Babbage失败之后一直到第二次世界大战,数字计算机的建造几乎没有什么进展,第二次世界大战刺激了有关计算机研究的爆炸性进展。

lowa州立大学的john Atanasoff教授和他的学生Clifford Berry建造了据认为是第一台可工作的数字计算机。该机器使用300个真空管。大约在同时,Konrad Zuse在柏林用继电器构建了Z3计算机,英格兰布莱切利园的一个小组在1944年构建了Colossus,Howard Aiken在哈佛大学建造了Mark 1,宾夕法尼亚大学的William Mauchley和他的学生J.Presper Eckert建造了ENIAC。这些机器有的是二进制的,有的使用真空管,有的是可编程的,但都非常原始,设置需要花费数秒钟时间才能完成最简单的运算。

在这个时期,同一个小组里的工程师们,设计、建造、编程、操作及维护同一台机器,所有的程序设计是用纯粹的机器语言编写的,甚至更糟糕,需要通过成千上万根电缆接到插件板上连成电路来控制机器的基本功能。没有程序设计语言(汇编也没有),操作系统则是从来都没听说过。使用机器的过程更加原始,详见下‘工作过程’

特点: 没有操作系统的概念,所有的程序设计都是直接操控硬件

工作过程: 程序员在墙上的机时表预约一段时间,然后程序员拿着他的插件版到机房里,将自己的插件板街道计算机里,这几个小时内他独享整个计算机资源,后面的一批人都得等着(两万多个真空管经常会有被烧坏的情况出现)。

后来出现了穿孔卡片,可以将程序写在卡片上,然后读入机而不用插件板

优点:程序员在申请的时间段内独享整个资源,可以即时地调试自己的程序(有bug可以立刻处理)

缺点:浪费计算机资源,一个时间段内只有一个人用。

注意:同一时刻只有一个程序在内存中,被cpu调用执行,比方说10个程序的执行,是串行的

穿孔卡带的过程:程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。

【第二代(1955~1965) 磁带存储---批处理系统】

第二代计算机的产生背景:

由于当时的计算机非常昂贵,自认很自然的想办法较少机时的浪费。通常采用的方法就是批处理系统。

特点: 设计人员、生产人员、操作人员、程序人员和维护人员直接有了明确的分工,计算机被锁在专用空调房间中,由专业操作人员运行,这便是‘大型机’。

有了操作系统的概念

有了程序设计语言:FORTRAN语言或汇编语言,写到纸上,然后穿孔打成卡片,再讲卡片盒带到输入室,交给操作员,然后喝着咖啡等待输出接口

工作过程:


第二代如何解决第一代的问题/缺点:

1.把一堆人的输入攒成一大波输入,
2.然后顺序计算(这是有问题的,但是第二代计算也没有解决)
3.把一堆人的输出攒成一大波输出
优点:批处理,节省了机时

缺点:
1.整个流程需要人参与控制,将磁带搬来搬去(中间俩小人)
2.计算的过程仍然是顺序计算-》串行
3.程序员原来独享一段时间的计算机,现在必须被统一规划到一批作业中,等待结果和重新调试的过程都需要等同批次的其他程序都运作完才可以(这极大的影响了程序的开发效率,无法及时调试程序)

【第三代(1955~1965)集成电路,多道程序系统】

第三代计算机的产生背景:

20世纪60年代初期,大多数计算机厂商都有两条完全不兼容的生产线。一条是面向字的:大型的科学计算机,如IBM 7094,见上图,主要用于科学计算和工程计算。另外一条是面向字符的:商用计算机,如IBM 1401,见上图,主要用于银行和保险公司从事磁带归档和打印服务。

开发和维护完全不同的产品是昂贵的,同时不同的用户对计算机的用途不同。IBM公司试图通过引入system/360系列来同时满足科学计算和商业计算,360系列低档机与1401相当,高档机比7094功能强很多,不同的性能卖不同的价格。360是第一个采用了(小规模)芯片(集成电路)的主流机型,与采用晶体管的第二代计算机相比,性价比有了很大的提高。这些计算机的后代仍在大型的计算机中心里使用,此乃现在服务器的前身,这些服务器每秒处理不小于千次的请求。

如何解决第二代计算机的问题1:

卡片被拿到机房后能够很快的将作业从卡片读入磁盘,于是任何时刻当一个作业结束时,操作系统就能将一个作业从磁带读出,装进空出来的内存区域运行,这种技术叫做同时的外部设备联机操作:SPOOLING,该技术同时用于输出。当采用了这种技术后,就不在需要IBM1401机了,也不必将磁带搬来搬去了(中间俩小人不再需要)

如何解决第二代计算机的问题2:

第三代计算机的操作系统广泛应用了第二代计算机的操作系统没有的关键技术:多道技术

cpu在执行一个任务的过程中,若需要操作硬盘,则发送操作硬盘的指令,指令一旦发出,硬盘上的机械手臂滑动读取数据到内存中,这一段时间,cpu需要等待,时间可能很短,但对于cpu来说已经很长很长,长到可以让cpu做很多其他的任务,如果我们让cpu在这段时间内切换到去做其他的任务,这样cpu不就充分利用了吗。这正是多道技术产生的技术背景。

多道技术:

所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行。即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。

在A程序计算时,I/O空闲, A程序I/O操作时,CPU空闲(B程序也是同样);必须A工作完成后,B才能进入内存中开始工作,两者是串行的,全部完成共需时间=T1+T2。

将A、B两道程序同时存放在内存中,它们在系统的控制下,可相互穿插、交替地在CPU上运行:当A程序因请求I/O操作而放弃CPU时,B程序就可占用CPU运行,这样 CPU不再空闲,而正进行A I/O操作的I/O设备也不空闲,显然,CPU和I/O设备都处于“忙”状态,大大提高了资源的利用率,从而也提高了系统的效率,A、B全部完成所需时间<<T1+T2。

多道程序设计技术不仅使CPU得到充分利用,同时改善I/O设备和内存的利用率,从而提高了整个系统的资源利用率和系统吞吐量(单位时间内处理作业(程序)的个数),最终提高了整个系统的效率。

单处理机系统中多道程序运行时的特点:
  (1)多道:计算机内存中同时存放几道相互独立的程序;
  (2)宏观上并行:同时进入系统的几道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕;
  (3)微观上串行:实际上,各道程序轮流地用CPU,并交替运行。

多道程序系统的出现,标志着操作系统渐趋成熟的阶段,先后出现了作业调度管理、处理机管理、存储器管理、外部设备管理、文件系统管理等功能。

由于多个程序同时在计算机中运行,开始有了空间隔离的概念,只有内存空间的隔离,才能让数据更加安全、稳定。

出了空间隔离之外,多道技术还第一次体现了时空复用的特点,遇到IO操作就切换程序,使得cpu的利用率提高了,计算机的工作效率也随之提高。

多道技术的实现是为了解决多个程序竞争或者说共享同一个资源(比如cpu)的有序调度问题,解决方式即多路复用,多路复用分为时间上的复用和空间上的复用。

空间上的复用:将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序。

时间上的复用:当一个程序在等待I/O时,另一个程序可以使用cpu,如果内存中可以同时存放足够多的作业,则cpu的利用率可以接近100%,类似于我们小学数学所学的统筹方法。(操作系统采用了多道技术后,可以控制进程的切换,或者说进程之间去争抢cpu的执行权限。这种切换不仅会在一个进程遇到io时进行,一个进程占用cpu时间过长也会切换,或者说被操作系统夺走cpu的执行权限)
详解

空间上的复用最大的问题是:程序之间的内存必须分割,这种分割需要在硬件层面实现,由操作系统控制。如果内存彼此不分割,则一个程序可以访问另外一个程序的内存,

首先丧失的是安全性,比如你的qq程序可以访问操作系统的内存,这意味着你的qq可以拿到操作系统的所有权限。

其次丧失的是稳定性,某个程序崩溃时有可能把别的程序的内存也给回收了,比方说把操作系统的内存给回收了,则操作系统崩溃。

多道批处理系统

20世纪60年代中期,在前述的批处理系统中,引入多道程序设计技术后形成多道批处理系统(简称:批处理系统)。

它有两个特点:
  (1)多道:系统内可同时容纳多个作业。这些作业放在外存中,组成一个后备队列,系统按一定的调度原则每次从后备作业队列中选取一个或多个作业进入内存运行,运行作业结束、退出运行和后备作业进入运行均由系统自动实现,从而在系统中形成一个自动转接的、连续的作业流。
  (2)成批:在系统运行过程中,不允许用户与其作业发生交互作用,即:作业一旦进入系统,用户就不能直接干预其作业的运行。

批处理系统的追求目标:提高系统资源利用率和系统吞吐量,以及作业流程的自动化。
批处理系统的一个重要缺点:不提供人机交互能力,给用户使用计算机带来不便。
  
虽然用户独占全机资源,并且直接控制程序的运行,可以随时了解程序运行情况。但这种工作方式因独占全机造成资源效率极低。

一种新的追求目标:既能保证计算机效率,又能方便用户使用计算机。 20世纪60年代中期,计算机技术和软件技术的发展使这种追求成为可能。

许多程序员怀念第一代独享的计算机,可以即时调试自己的程序。为了满足程序员们很快可以得到响应,出现了分时操作系统

如何解决第二代计算机的问题3:

分时操作系统:多个联机终端+多道技术

分时技术:把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。

  若某个作业在分配给它的时间片内不能完成其计算,则该作业暂时中断,把处理机让给另一作业使用,等待下一轮时再继续其运行。由于计算机速度很快,作业运行轮转得很快,给每个用户的印象是,好象他独占了一台计算机。而每个用户可以通过自己的终端向系统发出各种操作控制命令,在充分的人机交互情况下,完成作业的运行。

具有上述特征的计算机系统称为分时系统,它允许多个用户同时联机使用计算机。

特点:

  (1)多路性。若干个用户同时使用一台计算机。微观上看是各用户轮流使用计算机;宏观上看是各用户并行工作。
  (2)交互性。用户可根据系统对请求的响应结果,进一步向系统提出新的请求。这种能使用户与系统进行人机对话的工作方式,明显地有别于批处理系统,因而,分时系统又被称为交互式系统。
  (3)独立性。用户之间可以相互独立操作,互不干扰。系统保证各用户程序运行的完整性,不会发生相互混淆或破坏现象。
  (4)及时性。系统可对用户的输入及时作出响应。分时系统性能的主要指标之一是响应时间,它是指:从终端发出命令到系统予以应答所需的时间。

分时系统的主要目标:对用户响应的及时性,即不至于用户等待每一个命令的处理时间过长。

分时系统可以同时接纳数十个甚至上百个用户,由于内存空间有限,往往采用对换(又称交换)方式的存储方法。即将未“轮到”的作业放入磁盘,一旦“轮到”,再将其调入内存;而时间片用完后,又将作业存回磁盘(俗称“滚进”、“滚出“法),使同一存储区域轮流为多个用户服务。

多用户分时系统是当今计算机操作系统中最普遍使用的一类操作系统。

注意:
分时系统的分时间片工作,在没有遇到IO操作的时候就用完了自己的时间片被切走了,这样的切换工作其实并没有提高cpu的效率,反而使得计算机的效率降低了。但是我们牺牲了一点效率,却实现了多个程序共同执行的效果,这样你就可以在计算机上一边听音乐一边聊qq了。

实时系统

虽然多道批处理系统和分时系统能获得较令人满意的资源利用率和系统响应时间,但却不能满足实时控制与实时信息处理两个应用领域的需求。于是就产生了实时系统,即系统能够及时响应随机发生的外部事件,并在严格的时间范围内完成对该事件的处理。

实时系统在一个特定的应用中常作为一种控制设备来使用。

实时系统可分成两类:

1)实时控制系统。当用于飞机飞行、导弹发射等的自动控制时,要求计算机能尽快处理测量系统测得的数据,及时地对飞机或导弹进行控制,或将有关信息通过显示终端提供给决策人员。当用于轧钢、石化等工业生产过程控制时,也要求计算机能及时处理由各类传感器送来的数据,然后控制相应的执行机构。

2)实时信息处理系统。当用于预定飞机票、查询有关航班、航线、票价等事宜时,或当用于银行系统、情报检索系统时,都要求计算机能对终端设备发来的服务请求及时予以正确的回答。此类对响应及时性的要求稍弱于第一类。

实时操作系统的主要特点:

1)及时响应。每一个信息接收、分析处理和发送的过程必须在严格的时间限制内完成。
2)高可靠性。需采取冗余措施,双机系统前后台工作,也包括必要的保密措施等。

分时 —— 现在流行的PC,服务器都是采用这种运行模式,即把CPU的运行分成若干时间片分别处理不同的运算请求 linux系统

实时 —— 一般用于单片机上、PLC等,比如电梯的上下控制中,对于按键等动作要求进行实时处理。

通用操作系统

操作系统的三种基本类型:多道批处理系统、分时系统、实时系统。

通用操作系统:具有多种类型操作特征的操作系统。可以同时兼有多道批处理、分时、实时处理的功能,或其中两种以上的功能。

例如:实时处理+批处理=实时批处理系统。首先保证优先处理实时任务,插空进行批处理作业。常把实时任务称为前台作业,批作业称为后台作业。再如:分时处理+批处理=分时批处理系统。即:时间要求不强的作业放入“后台”(批处理)处理,需频繁交互的作业在“前台”(分时)处理,处理机优先运行“前台”作业。

从上世纪60年代中期,国际上开始研制一些大型的通用操作系统。这些系统试图达到功能齐全、可适应各种应用范围和操作方式变化多端的环境的目标。但是,这些系统过于复杂和庞大,不仅付出了巨大的代价,且在解决其可靠性、可维护性和可理解性方面都遇到很大的困难。

相比之下,UNIX操作系统却是一个例外。这是一个通用的多用户分时交互型的操作系统。它首先建立的是一个精干的核心,而其功能却足以与许多大型的操作系统相媲美,在核心层以外,可以支持庞大的软件系统。它很快得到应用和推广,并不断完善,对现代操作系统有着重大的影响。

至此,操作系统的基本概念、功能、基本结构和组成都已形成并渐趋完善。

【第四代(1980~至今)现代计算机】

进入20世纪80年代,大规模集成电路工艺技术的飞跃发展,微处理机的出现和发展,掀起了计算机大发展大普及的浪潮。一方面迎来了个人计算机的时代,同时又向计算机网络、分布式处理、巨型计算机和智能化方向发展。于是,操作系统有了进一步的发展,如:个人计算机操作系统、网络操作系统、分布式操作系统等。

1.个人计算机操作系统

个人计算机上的操作系统是联机交互的单用户操作系统,它提供的联机交互功能与通用分时系统提供的功能很相似。

由于是个人专用,因此一些功能会简单得多。然而,由于个人计算机的应用普及,对于提供更方便友好的用户接口和丰富功能的文件系统的要求会愈来愈迫切。

2.网络操作系统

计算机网络:通过通信设施,将地理上分散的、具有自治功能的多个计算机系统互连起来,实现信息交换、资源共享、互操作和协作处理的系统。

网络操作系统:在原来各自计算机操作系统上,按照网络体系结构的各个协议标准增加网络管理模块,其中包括:通信、资源共享、系统安全和各种网络应用服务。
就是添加了一些网络方面的功能。

3.分布式操作系统

表面上看,分布式系统与计算机网络系统没有多大区别。分布式操作系统也是通过通信网络,将地理上分散的具有自治功能的数据处理系统或计算机系统互连起来,实现信息交换和资源共享,协作完成任务。——硬件连接相同。

分布式:将一个大的任务拆分成几个小的任务,分配给不同的任务处理机制,具体怎么分配是由系统中的算法决定的,大家同时来运行自己的任务,然后各自将人物的返回结果再返回给你这个大的任务。

但有如下一些明显的区别:

1)分布式系统要求一个统一的操作系统,实现系统操作的统一性。
2)分布式操作系统管理分布式系统中的所有资源,它负责全系统的资源分配和调度、任务划分、信息传输和控制协调工作,并为用户提供一个统一的界面。
3)用户通过这一界面,实现所需要的操作和使用系统资源,至于操作定在哪一台计算机上执行,或使用哪台计算机的资源,则是操作系统完成的,用户不必知道,此谓:系统的透明性。
4)分布式系统更强调分布式计算和处理,因此对于多机合作和系统重构、坚强性和容错能力有更高的要求,希望系统有:更短的响应时间、高吞吐量和高可靠性。

分布式系统已经很普遍了,一般个人用不到,企业在处理比较大的任务的时候才会使用。


9.1.3 操作系统原理

1、操作系统的资源管理技术

  资源管理解决物理资源数量不足和合理分配资源这两个问题。

操作系统虚拟机为用户提供了一种简单、清晰、易用、高效的计算机模型。虚拟机的每种资源都是物力资源通过复用、虚拟和抽象而得到的产物。

虚拟机提供进程运行的逻辑计算环境。从概念上来说,一个进程运行在一台虚拟机上,可以认为一个进程就是一台虚拟机,一台虚拟机就是一个进程。

复用: 空分复用共享和时分复用共享。

a. 空分复用共享(space-multiplexed sharing): 将资源从“空间”上分割成更小的单位供不同进程使用。在计算机系统中,内存和外存(磁盘)等是空分复用共享的。

b. 时分复用共享(time-multiplexed sharing): 将资源从“时间”上分割成更小的单位供不同进程使用。在计算机系统中,处理器和磁盘机等是时分复用共享的。

虚拟: 对资源进行转化、模拟或整合,把一个物理资源转变成多个逻辑上的对应物,也可以把多个物理资源变成单个逻辑上的对应物,即创建无须共享独占资源的假象,或创建易用且多于实际物理资源的虚拟资源假象,以达到多用户共享一套计算机物理资源的目的。虚拟技术可用于外部设备(外部设备同时联机操作(SPOOLing)),存储资源(虚拟内存)和文件系统(虚拟文件系统(Virtual File System, VFS))中。

复用和虚拟相比较,复用所分割的是实际存在的物理资源,而虚拟则实现假想的同类资源。虚拟技术解决某类物理资源不足的问题,提供易用的虚拟资源和更好的运行环境。

抽象: 通过创建软件来屏蔽硬件资源的物理特性和实现细节,简化对硬件资源的操作、控制和使用。

复用和虚拟的主要目标是解决物理资源数量不足的问题,抽象则用于处理系统复杂性,重点解决资源易用性。

2. 系统调用

系统调用: 为给应用程序的运行提供良好环境,内核提供了一系列具有预定功能的服务例程,通过一组称为系统调用(System Call)的接口呈现给用户,系统调用把应用程序的请求传送至内核,调用相应的服务例程完成所需处理,将处理结果返回给应用程序。

注:系统调用的编号称为功能号

系统调用的执行过程: 当CPU执行程序中编写的由访管指令(supervisor, 也称自陷指令(trap)或中断指令(interrupt), 指引起处理器中断的机器指令)实现的系统调用时会产生异常信号,通过陷阱机制(也称异常处理机制,当异常或中断发生时,处理器捕捉到一个执行线程,并且将控制权转移到操作系统中某一个固定地址的机制),处理器的状态由用户态(user mode, 又称目态或普通态)转变为核心态(kerbel mode, 又称管态或内核态),进入操作系统并执行相应服务例程,以获得操作系统服务。当系统调用执行完毕时,处理器再次切换状态,控制返回至发出系统调用的程序。

系统调用是应用程序获得操作系统服务的唯一途径。

系统调用的作用: 
1. 内核可以基于权限和规则对资源访问进行裁决,保证系统的安全性。 
2. 系统调用对资源进行抽象,提供一致性接口,避免用户在使用资源时发生错误,且编程效率大大提高。

系统调用与函数调用的区别: 
1. 调用形式和实现方式不同。功能号 VS 地址; 用户态转换到内核态 VS 用户态。 
2. 被调用代码的位置不同。 动态调用 + 操作系统 VS 静态调用 + 用户级程序。 
3. 提供方式不同。 操作系统 VS 编程语言。

3. 操作系统内核

内核: 是一组程序模块,作为可信软件来提供支持进程并发执行的基本功能和基本操作,通常驻留在内核空间,运行于内核态,具有直接访问硬件设备和所有内存空间的权限,是仅有的能够执行特权指令的程序。

内核的功能:

a. 中断处理。中断处理是内核中最基本的功能,也是操作系统赖以活动的基础。 
b. 时钟管理。时钟管理是内核的基本功能。 
c. 短程调度。短程调度的职责是分配处理器,按照一定的策略管理处理器的转让,以及完成保护和恢复现场工作。 
d. 原语管理。 原语是内核中实现特定功能的不可中断过程。
内核是操作系统对裸机的第一次改造,内核和裸机组成了第一层虚拟机,进程在虚拟机上运行。

4. 处理器状态: 内核态和用户态

仅在内核态下才能使用的指令称为特权指令,执行这些指令不仅影响运行程序自身,而且还会干扰其他程序及操作系统。 非特权指令在内核态和和用户态下都能工作。

现代计算机为处理器建立硬件标志位,称处理器状态位,通常是程序状态字(Program Status Word, PSW)中的一位,来将处理器的状态设置为内核态或用户态。

用户态向内核态转换的情况:

a. 程序请求操作系统服务, 执行系统调用。 
b. 在程序运行时产生中断事件(如I/O操作完成),运行程序被中断,转向中断处理程序处理。 
c. 在程序运行时产生异常事件(如在目态下执行特权指令),运行程序被打断,转向异常处理程序工作。

以上三种情况都是通过中断机制发生,可以说中断和异常是用户态到内核态转换的仅有途径。

用户栈和核心栈 

a. 用户栈是用户进程空间中的一块区域。用于保存应用程序的子程序(函数)间相互调用的参数,返回值,返回点和子程序的局部变量。 
b. 核心栈是内存中操作系统空间的一块区域。用于保存中断现场和保存操作系统程序(函数)间相互调用的参数,返回值,返回点和程序的局部变量。

5. 中断(Interupt)

中断: 程序执行过程中遇到急需处理的事件时,暂时终止现行程序在CPU上的运行,转而执行相应的事件处理程序,待处理完成后再返回断点或调度其他程序的执行过程。

中断的分类:

a. 外中断(又称中断或异步中断): 来自处理器之外的中断信号,如,时钟中断、键盘中断等。外中断可分为可屏蔽中断和非可屏蔽中断。 
b. 内中断(又称异常或同步中断),来自处理器内部的中断信号,如,访管中断,硬件故障中断,程序性中断等。内中断不能被屏蔽。

中断和异常的响应: 发现中断源 → 保护现场 → 转向中断/异常事件处理程序执行 → 恢复现场

6. 进程

进程: 具有独立功能的程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位。

a. 从原理角度看,进程是支持程序执行的一种系统机制,它对处理器上运行程序的活动进行抽象。 
b. 从实现角度看,进程是一种数据结构,用来准确地刻画运行程序的状态和系统动态变化状况。

进程状态的七态模型

a. 新建态(new): 进程被创建,尚未进入就绪队列。 
b. 就绪态(ready): 进程具备运行条件,等待系统分配处理器。 
c. 挂起就绪态(ready suspend):进程具备运行条件,但目前在外存中。 
d. 运行态(running): 进程占有处理器正在运行。 
e. 终止态(exit): 进程达到正常结束点或被其他原因所终止,下一步将被撤销。 
f. 等待态(wait): 又称阻塞态或休眠态。进程正在等待某个事件完成,目前不具备运行条件。 
g. 挂起等待态(blocked suspend): 进程正在等待某个事件完成,并且在外存中。

程序和数据刻画进程的静态特征,称为进程控制块的一种数据结构刻画进程的动态特征。进程映像(process image) 包括进程控制块、进程程序块、进程核心块、进程数据块等要素。

进程控制块(Process Control Block, PCB): 进程存在的唯一标识,操作系统掌握进程的唯一资料结构和管理进程的主要依据。包括标识信息、现场信息和控制信息等信息。

进程队列(process queue): 处于同一状态的所有进程的PCB链接在一起的数据结构。 有两种队列组织方式:链接方式和索引方式。

进程切换必定在内核态而非用户态发生。

进程可以分为两部分,资源集合和线程集合。进程要支撑线程运行,为线程提供虚拟地址空间和各种资源。进程封装管理信息,线程封装执行信息。

7. 处理器调度

处理器调度层次:

a. 高级调度: 又称作业调度、长程调度。从输入系统的一批作业(job, 用户提交给操作系统计算的一个独立任务)中按照预定的调度策略挑选若干作业进入内存,为其分配所需资源并创建对应作业的用户进程。 
b. 中级调度: 又称平衡调度,中程调度。根据内存资源情况决定内存所能容纳的进程数目,并完成外存和内存中进程对换工作。 
c. 低级调度:又称进程调度/线程调度,短程调度。根据某种原则决定就绪队列中那个进程/线程先获得处理器,并将处理器出让给它使用。

低级调度算法:

a. 先来先服务(First Come First Server, FCFS)算法。 

b. 最短作业优先(Shortest Job First, SJF)算法。 

c. 最短剩余时间优先(Shortest Remaining Time First, SRTF)算法: 假设当前某进程/线程正在运行,如果有新进程/线程移入就绪队列,若它所需的CPU运行时间比当前运行的进程/线程所需的剩余CPU时间还短,抢占式最短作业优先算法强行剥夺当前执行者的控制权,调度新进程/线程执行。 

d. 最高响应比优先(Highest Response Ratio First, HRRF)算法:非剥夺式算法。其中,响应比 = (作业已等待时间 + 作业处理时间) / 作业处理时间。 

e. 优先级调度算法:优先级高的选择进程/线程优先选择。 

f. 轮转调度(Round-Robin, RR)算法: 也称时间片调度。就绪队列的进程轮流运行一个时间片。 

g. 多级反馈队列(Multi-Level Feedback Queue, MLFQ)算法。

衡量调度算法的性能指标:

a. 资源利用率: CPU利用率 = CPU有效工作时间/(CPU有效工作时间 + CPU空闲等待时间) 
b. 吞吐率: 单位时间内CPU处理作业的个数。 
c. 公平性: 确保每个进程都能获得合理的CPU份额和其他资源份额,不会出现饥饿现象。 
d. 响应时间: 从交互式进程提交一个请求(命令)直到获得响应之间的时间间隔。 
e. 周转时间: 批处理用户从向系统提交作业开始到作业完成为止的时间间隔。 
平均周转时间:T = ( ) / n , 其中  表示作业i的周转时间。 
平均带权作业周转时间: T = () / n, 其中  ,  表示作业i的周转时间。  表示作业i的运行时间。

8. 进程的交互

**进程互斥(Mutual Exclusion): ** 若干进程因相互抢夺独占型资源而产生的竞争制约关系。

进程同步(Synchronization): 为完成共同任务的并发进程基于某个条件来协调其活动,因为需要在某些位置上排定执行的先后次序而等待、传递信息或消息所产生的协作制约关系。

资源竞争会引发两个控制问题:

a. 死锁: 一组进程因争夺资源陷入永远等待的状态。 
b. 饥饿: 一个可运行进程由于由于其他进程总是优先于它,而被调度程序无限期地拖延而不能被执行。

9. 临界区管理

并发进程中与共享变量有关的程序段称为临界区(Critical Section)。共享变量所代表的资源称为临界资源(Critical Resource),即一次仅能供一个进程使用的资源。

临界区调度原则:

a. 择一而入。 一次之多只有一个进程进入临界区内执行。 
b. 忙则要等。 如果已有进程在临界区中, 试图进入此临界区的其他进程应等待。 
c. 有限等待。 进入临界区内的进程应在有限时间内退出。

临界区管理的软件算法:Peterson算法。

为每个进程设置标志,当标志值为 true 时表示该进程要求进入临界区,另外再设置一个指示器 turn 以指示可以由哪个进程进入临界区,当 turn = i 时则可由 Pi 进入临界区。

/* Peterson 算法 */

bool inside[2];
inside[0] = false;
inside[1] = false;
enum { 0, 1 } turn;

/* 进程0 */
process P0(){
    inside[0] = true;               //请求...
    turn = 1;
    while(inside[1] && turn == 1) ; //等待...

    /*临界区 */

    inside[0] = false;              //归还...
}

/* 进程1 */
process P1(){
    inside[1] = true;               //请求...
    turn = 0;
    while(inside[0] && turn == 0) ; //等待...

    /*临界区 */

    inside[1] = false;              //归还...
}

Peterson算法满足临界区管理的三个原则。

临界区管理的硬件设施:

a. 关中断。 在进程进入临界区时关中断,进程退出临界区时开中断。 
b. 测试并设置指令。 利用机器指令TS(Test and Set)实现临界区的上锁和开锁原语操作。 
c. 对换指令。 利用对换指令实现临界区的上锁和开锁原语操作。

10. 信号量(samaphore)和PV操作

PV操作都是原语操作, 不可中断。

信号量和PV操作

// 信号量
typedef struct semaphore {
    int value;                 // 信号量值
    struct pcb* list;          // 指向“等待该信号量的进程队列”的指针
};  

// P操作
void P(semaphore s){
   s.value--;                 // 信号量值减一

    // 如果信号量值小于0, 执行P操作的进程调用sleep(s.list)阻塞自己,
    // 被置成“等待信号量s”状态,并移入s信号量队列,转向进程调度程序。
    if(s.value < 0) sleep(s.list);
}

// V操作
void V(semaphore s){
    s.value++;                 // 信号量值加一

    // 如果信号量小于等于0, 则调用wakeup(s.list)释放一个等待信号量s的进程,
    // 并转换成就绪态, 进程则继续执行。
    if(s.value <= 0) wakeup(s.list);
}

a. 若信号量值 s.value 为正值, 此值等于在封锁进程之前对信号量 s 可施行P操作的次数,即,s所代表的实际可用的资源数。 
b. 若信号量值 s.value 为负值, 其绝对值等于登记在 s 信号量队列中的等待进程的数目。 
c. 通常P操作意味着请求一个资源,V操作意味着释放一个资源。在一定条件下,P操作也可表示挂起进程的操作,V操作代表唤醒被挂起进程的操作。

信号量实现互斥

semaphore mutex;
mutex = 1;

//进程Pi, i = 1, 2 ..., n
process Pi(){
    P(mutex);

    /* 临界区 */

    V(mutex);
}

11. 管程

管程(monitor) :代表共享资源的数据结构及并发进程在其上执行的一组构成就构成管程,管程被请求和释放资源的进程锁调用。

a. 条件变量。 管程内的一种数据结构。只有在管程中才能被访问,进程可以在条件变量上等待或被唤醒。只能通过 wait() 和 signal() 原语操作来控制。 
b. wait() 原语。 挂起调用进程并释放管程,直至另一个进程在条件变量上执行 signal()。 
c. signal() 原语。如果有其他的进程因对条件变量执行 wait() 而被挂起,便释放之。 如果没有进程在等待,那么相当于空操作,信号不被保存。

12. 死锁

死锁的主要解决方法: 死锁防止、死锁避免、死锁检测和恢复。

死锁产生的必要条件:

a. 互斥条件。 临界资源是独占资源,进程应互斥且排他地使用这些资源。 
b. 占有和等待条件。 进程在请求资源得不到满足而等待时,不释放已占有的资源。 
c. 不剥夺条件。已获资源只能由进程资源释放,不允许被其他程序剥夺。 
d. 循环等待条件。 存在循环等待链,其中每个进程都在等待下一个进程所持有的资源。

死锁的防止就是去破坏死锁产生的必要条件。 如,使资源可同时使用(破坏互斥条件)、静态分配资源(破坏占有和等待条件)、剥夺调度(破坏不剥夺条件)、层次分配策略(循环等待条件)等。

死锁避免: 银行家算法 (额…自己百度去吧。 = =!)

死锁检测和恢复: 进程-资源分配图(额…还是去百度吧。)

a. 如果进程-资源分配图中无环路,此时系统没有死锁。 
b. 如果进程-资源分配图中有环路,且每个资源类中只有一个资源,则系统发生死锁。
c. 如果进程-资源分配图中有环路,且所涉及的资源类有多个资源,则不一定会发生死锁。

13. 可变分区存储管理

可变分区存储分配算法:

a. 最先适应分配算法。从未分配区的开始位置开始扫描,在找到的第一个能满足长度要求的空闲区上分配存储空间。 
b. 下次适应分配算法。从未分配区上次扫描结束处开始顺序查找,在找到的第一个能满足长度要求的空闲区上分配存储空间。 
c. 最优适应分配算法。扫描整个未分配区,选择能满足用户进程要求的最小分区分配存储空间。 
d. 最坏适应分配算法。扫描整个未分配区,选择能满足用户进程要求的最大分区分配存储空间。 
e. 快速适应分配算法。为经常用到的长度的空闲区设立单独的空闲区链表。

14. 分页存储管理

基本概念:

a. 页面。 进程逻辑地址空间分成大小相等的区,每个区称为页面或页。(注: 页面的本质是逻辑地址空间) 
b. 页框(kuàng, 0.0)。 又称页帧。内存物理地址空间分成大小相等的区,其大小和页面大小相等,每个区就是一个页框。(注: 页框的本质是物理地址空间) 
c. 逻辑地址。分页存储器的逻辑地址由页号和页内偏移两部分组成。
d. 内存页框表。页框表的表项给出物理块使用情况:0为空闲,1为占用。 
e. 页表。页表是操作系统为进程建立的,是程序页面和内存页框的对照表,页表的每一栏指明程序中的某一页面和分得的页框之间的关系。

分页存储管理的地址转换

翻译快表:也称转换后援缓冲(Translation Look_aside Buffer, TLB)。用来存放进程最近访问的部分页表项。(注: 翻译快表之于页表类似于Cache之于存储器)

二级页表:把整个页表分割成许多小页表,每个称为页表页,每个页表页含有若干个页表表项。页表页允许分散对应不连续的页框。为了找到页表页,应建立地址索引,称为页目录表,其表项指出页表页起始地址。

二级页表实现逻辑地址到物理地址转换的过程: 由硬件“页目录表基址寄存器”指出当前运行进程的页目录表的内存起始地址,加上“页目录位移”作为索引,可找到页表页在内存的起始地址,再以“页目录位移”作为索引,找到页表页在内存的起始位置,再以“页表页位移”作为索引,找到页表页的表项,此表项中包含一个页面对应的页框号,由页框号和页内偏移便可生成物理地址。

注: 类比于书的目录,找某一段内容的时候,先在目录上找到对应的章节,再在对应的章节下面找具体的知识点。比如,我要在《操作系统原理》中查“多级页表”。首先我知道它是在存储管理一章的,于是就找到了“第四章 存储管理”(类似于找到了页目录表)。 然后在第四章下面找“多级页表”(类似于在页目录表下面找具体的页表页)。最后找到“多级页表”对应的页码(类似于在页表页中找到其对应的页框)。最后查阅对应的章节页码(类似于读取对应页框的数据)。

15. 分段存储管理

分段和分页的比较:

a. 分段是信息的逻辑单位,由源程序的逻辑结构及含义所决定,是用户可见的,段长由用户根据需要来确定,段起始地址可以从任何内存地址开始。引入的目的是满足用户模块化程序设计的需要。 
b. 分页是信息的物理单位,与源程序的逻辑无关,是用户不可见的,页长由系统(硬件)决定,页面只能从页大小的整数倍地址开始。引入目的是实现离散分配并提高内存利用率。

16. 虚拟存储管理

虚拟存储管理的基本思路:

把磁盘空间当做内存的一部分,进程的程序和数据部分放在内存中,部分放在磁盘上。程序运行时,它执行的指令或访问的数据在哪里由存储管理负责判断,并针对情况采取响应的措施。

请求分页虚存管理: 将进程信息副本存放在外存中,当它被调度投入运行时,程序和数据没有全部装进内存,仅装入当前使用页面,进程执行过程中访问到不在内存的页面时,产生缺页异常,再由系统自动调入。

全局页面替换策略(页面替换算法的作用范围是整个系统,不考虑进程的属主):

a. 最佳页面替换算法(Optimal Replacement, OPT)。 淘汰不再访问的页或者距现在最长时间后才访问的页。 
b. 先进先出页面替换算法(First in First Out Replacement, FIFO)。淘汰在内存中驻留时间最长的页。 
c. 最近最少使用页面替换算法(Least Recently Used Replacement, LRU)。 淘汰最近一段时间内最久未被使用的页面。 
d. 第二次机会页面替换算法(Second Chance Replacement, SCR)。 首先检查FIFO页面队列中的队首,这是最早进入内存的页面,如果其“引用位”为0,那么它最早进入且未被引用,此页被淘汰。如果其“引用位”为1,说明虽然它最早进内存,但最近仍在使用,于是将“引用位”清零,并把这个页面移到队尾,把它看做新调入的页面,再给它一次机会。 
e. 时钟页面替换算法(Clock Policy Replacement, Clock)。与SCR算法思路一致。只是用循环队列来构造页面队列,队列指针指向可能被淘汰的页面。如果队列指针指向的页的“引用位”为1,则将其置为0,同时队列指针指向下一个页。

局部页面替换算法(页面替换算法的作用局限于进程自身,要为进程维护称为工作集的一组页面): 
a. 局部最佳页面替换算法(Local Minimum Replacement, MIN)。 在t时刻时,若页面P在未来(t, t+delta)时间段内未被引用,则它被淘汰。 
b. 工作集置换算法。 在t时刻时,若页面P在未来(t-delta, t)时间段内未被引用,则它被淘汰。 
c. 模拟工作集替换算法。 
d. 缺页频率替换算法。

17. 请求段页式虚拟内存管理

虚地址以程序的逻辑结构划分为段。

实地址划分为位置固定、大小相等的页框(块)。

逻辑地址分为三个部分:段号s、段内页号p、页内位移d。对于用户而言,段式虚拟地址应该由段号s和段内位移d’组成,操作系统内部自动把d’解释成段内页号p和页内位移号d。

18. I/O硬件原理:I/O控制方式

轮询方式: 又称程序直接控制方式。使用查询指令测试设备控制器的忙闲状态位,确定内存和设备是否能能交换数据。(注:所谓轮询,就好比,老湿依次问每一个童鞋:“有问题没?”, 如果没问题,就继续问下一个童鞋。如果这个童鞋有问题,这个老湿就停下了解决这个问题。然后又继续询问下一个童鞋。)

中断方式: 要求CPU和设备控制器及设备之间存在中断请求线,设备控制器的状态寄存器有相应的中断允许位。

a. 进程发出启动I/O指令。 
b. 设备控制器检查状态寄存器的内容,执行相应的I/O操作,一旦传输完成,设备控制器通过中断请求线发出I/O中断信号。 
c. CPU收到并响应I/O中断后,转向设备的I/O中断处理程序执行。 
d. 中断处理程序执行数据读取操作,将I/O缓冲寄存器的内容写入内存。操作结束后退出中断程序恢复之前的状态。 
e. 执行中断前之前运行的进程。 
(注: 类似于老湿在上面讲课,有童鞋问问题时,老湿就记录下自己讲到的位置,然后取回答童鞋的问题,回答完之后,又回到刚刚讲课的地方继续讲课)

DMA(Direct Memory Access, 直接存储器存取)方式: 内存和设备之间有一条数据通路成块的传输数据,无须CPU干9预,实际数据传输操作由DMA直接完成。

通道方式: CPU在执行主程序时遇到I/O请求,启动在指定通道上选址的设备,一旦启动成功,通道开始控制设备进行操作,这时CPU就可以执行其他任务并与通道并行工作,直到I/O操作完成;当通道发出I/O操作结束中断时,处理器才响应并停止当前工作,转而处理I/O操作结束时间。

19. I/O软件原理

I/O中断处理程序: 通常是设备驱动程序的组成部分之一。检查设备状态寄存器内容,判断产生中断原因,根据I/O操作的完成情况进行相应处理。若数据传输有错,应向上层软件报告设备出错信息,实施重新执行;若正常结束,应唤醒等待传输的进程,使其转换为就绪态;若有等待传输的I/O命令,应通知相关软件启动下一个I/O请求。

I/O设备驱动程序: 设备驱动程序是设备专有的。把用户提交的逻辑I/O请求转化为物理I/O的启动和执行。同时监督设备是否正确执行,管理数据缓冲区,进行必要的纠错处理。

独立于设备的I/O软件

用户空间的I/O软件

20. 缓冲技术

缓冲技术的基本思想: 当进程执行写操作输出数据时,先向系统申请一个输出缓冲区,然后将数据送至缓冲区,若是顺序写请求,则不断地把数据填入缓冲区,直至装满为止,此后进程可以继续计算,同时,系统将缓冲区的内容写在设备上。当进程执行读操作输入数据时,先向系统申请一个输入缓冲区,系统将设备上的一条物理记录读至缓冲区,根据要求把当前所需要的逻辑记录从缓冲区中选出并传送给进程。

单缓冲: 是最简单的缓冲技术,每当有I/O请求时,操作系统就在内存的系统区中开设一个缓冲区。不允许多个进程同时对一个缓冲器操作。

双缓冲: CPU可把输出到设备的数据放入其中一个缓冲器(区)、让设备慢慢处理;然后,它又可以从另一个为终端设置的缓冲器(区)中读取所需要的输入数据。

多缓冲: 是把多个缓冲区连接起来组成两部分,一部分专门用于输入,另一部分专门用于输出的缓冲结构。

21. 驱动调度技术

磁盘的物理结构:

磁盘包括多个盘面,每个盘面有一个读写磁头,所有的磁头都固定在唯一的移动臂上同时移动。一个盘面上的读写磁头的轨迹称为磁道,读写磁头下的所有磁道形成柱面,一个磁道又可以划分为多个扇区。在磁盘上定位某个物理记录需要知道其柱面号、磁头号以及扇区号。定位物理记录时,磁头到达指定扇区的时间称为查找时间, 选择磁头号并旋转至指定扇区的时间称为搜索延迟。

磁道(柱面)的搜索定位算法:

a. 先来先服务算法(First Come First Server algorithm, FCFS)。 
b. 最短查找时间优先算法: 总是执行查找时间最短的请求。 
c. 扫描算法: 移动臂来回的扫过所有柱面,扫描处遇到I/O请求便进行处理。 
d. 分步扫描算法: 将I/O请求分为长度为N的子队列,按FIFO算法依次处理每个队列,而每个子队列采用扫描算法,处理完一个后再服务下一个队列。 
e. 电梯调度算法: 又称LOOK算法。 

磁头号由外向内递增。 
f. 循环扫描算法: 移动臂总是从0号柱面至最大号柱面顺序扫描,然后直接返回0号柱面重复进行,归途中不提供服务(而扫描算法归途是要提供服务的)。

22. 设备独立性

设备独立性: 用户通常不指定物理设备,而是指定逻辑设备,使得用户作业和物理设备分离开来,再通过其他途径建立逻辑设备和物理设备之间的映射,设备的这种特性称为设备独立性。

23. 虚拟设备

外部设备同时联机操作 (Simultaneous Peripheral Operations On Line, SPPPLing):

a. 预输入程序。 控制信息从输入设备至输入井,填写预输入表以便在作业执行过程中要求输入信息时可以随时找到其存放位置。 

b. 井管理程序。 作业执行过程中要求启动某台设备进程I/O操作时,作业控制程序截获这个要求并调用井管理程序控制从相应输入井读取信息,或将信息送至输出井。 

c. 缓输出程序。 当处理器空闲时,操作系统调用缓输出程序执行缓输出,它查看缓输出表是否有输出打印的文件,文件打印前还可能组织作业或文件标题,也可能对从输出井中读出的信息进行格式加工。

24. 文件逻辑结构

文件的逻辑结构的两种形式:

a. 流式文件。 一种无结构的文件,文件内的数据不再组成记录,只是一串顺序的信息集合,称为字节流文件。 
b. 记录式文件。 一种有结构的文件,包含若干逻辑记录,逻辑记录是文件中按信息在逻辑上独立含义所划分的信息单位。

25. 文件物理结构

文件物理结构: 文件的物理结构和组织是指逻辑文件在物理存储空间中的存放方法和组织关系。

常见组织方式:顺序文件、连接文件、直接文件和索引文件。

问答

1. 什么是操作系统?操作系统在计算机系统中的主要作用是什么?

    定义: 操作系统尚无严格的定义。 一般可把操作系统定义为: 管理系统资源、控制程序执行、改善人机界面、提供各种服务,并合理组织计算机工作流程和为用户方便有效地使用计算机提供良好的运行环境的一种软件系统。

    作用: 
    a. 服务用户。 操作系统作为用户接口和公共服务程序。 
    b. 进程交互。 操作系统作为进程执行的控制者和协调者。 
    c. 系统实现。 操作系统作为扩展机或虚拟机。 
    d. 资源管理。 操作系统作为资源的管理者和控制者。

2. 什么是多道程序设计?多道程序设计有什么特点?

    多道程序设计(multiprogramming): 允许多个作业(程序)同时进入计算机系统的内存并启动交替计算的方法。

    多道程序设计的特点: 从宏观上看是并行的,从微观上看是串行的。

3. 计算机操作系统为什么引入进程?

    刻画程序的并发性。
    解决资源的共享性。

4. 在分时系统中,什么是响应时间?它与哪些因素有关?

    从交互式进程提交一个请求(命令)直到获得响应之间的时间间隔称为响应时间。
    影响分时操作系统的响应时间的因素很多,如,CPU的处理速度、联机终端的数目、所用时间片的大小、系统调度开销和对换信息量的多少等。

5. 解释并发性与并行性

    计算机操作系统中把并行性和并发性明显区分开,主要是从微观的角度来说的,具体是指进程的并行性(多处理机的情况下,多个进程同时运行)和并发性(单处理机的情况下,多个进程在同一时间间隔运行的)。
    并行性是指硬件的并行性,两个或多个事件在同一时刻发生。
    并发性是指进程的并发性,两个或多个事件在同一时间段内发生。

6. 试述存储管理的基本功能。

    存储分配。
    地址映射。
    存储保护。
    存储共享。
    存储扩充。

7. 何谓地址转换(重定向)?哪些方法可以实现地址转换?

    地址重定位: 又称地址转换,地址映射。 可执行程序逻辑地址转换(绑定)为物理地址的过程。

    实现方法: 
    a. 静态地址重定位。 由装载程序实现装载代码模块的加载和地址转换,把它装入分配给进程的内存指定区域,其中的所有逻辑地址修改成内存物理地址。 
    b. 动态地址重定位。

    OS_Dynamic

    由装载程序实现装载代码模块的加载和地址转换,把它装入分配给进程的内存指定区域,但对链接程序处理过的应用程序的逻辑地址则不做任何修改,程序内存起始地址被置于硬件专用寄存器 —— 重定位寄存器。程序执行过程中,每当CPU引用内存地址(访问程序和数据)时,由硬件截取此逻辑地址,并在它被发送到内存之前加上重定位寄存器的值,以便实现地址转换。 
    c. 运行时链接地址重定位

        程序链接的三种方式: 
        a. 静态链接。在程序装载到内存和运行前,就已将它的所有目标模块及所需要的库函数进行链接和装配成一个完整的可执行程序且此后不可拆分。 
        b. 动态链接。在程序装入内存前并未事先进行程序各目标模块的链接,而是在程序装载时一边装载一边链接,生成一个可执行文件。 
        c. 运行时链接。 将某些目标模块或库函数的链接 推迟到执行时才进行。

8. 什么是文件的共享?介绍文件共享的分类和实现思想。

    文件共享: 不同进程共同使用同一个文件。
    文件共享的分类: 
    a. 静态共享。 两个或多个进程通过文件链接(一个文件同时属于多个目录,但实际上仅有一处物理存储)达到共享同一个文件的目的,无论进程是否运行,其文件的链接关系都是存在的,因此称为静态共享。 
    b. 动态共享。 系统不同的应用程序或同一用户的不同进程并发地访问同一文件,这种共享关系只有当进程存在时才可能出现,一旦进程消亡,其共享关系也就随之消失。 
    c. 符号链接共享。

9.2 网络通信原理

9.2.1 计算机网络的发展及基础网络概念

计算机网络就是将分布在不同地理位置的具有独立工作能力的多台计算机、终端及其附属设备用通信设备和通信线路链接起来,并配置网络软件,以实现资源共享的系统。

两台计算机之间的通信与两个人打电话原理是一样的。

  1,首先要通过各种物理连接介质连接。

  2,找准确确定对方计算机(准确到软件)的位置。

  3,通过统一的标准(一揽子协议)进行数据的收发。

物理连接介质,这个是网络工程师所考虑的,如果把计算机看成分布于世界各地的人,那么连接两台计算机之间的internet实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列的协议,总称为 互联网协议(Internet Protocol Suite) .

互联网协议的功能:定义计算机如何接入internet,以及接入internet的计算机通信的标准。

以太网 : 局域网与交换机

1、广播

主机之间 “一对所有” 的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。

有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。

2、ip地址与ip协议

规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示。

范围0.0.0.0-255.255.255.255

一个ip地址通常写成四段十进制数,例:172.16.10.1

a类网   10.0.0.0~10.255.255.255

b类网   172.16.0.0~172.31.255.255

c类网   192.168.0.0~192.168.255.255

3、mac地址

head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。

mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

4、ARP协议 ——查询IP地址和MAC地址的对应关系

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址。

收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。

9.2.2 广域网与路由器

1、路由器

路由器(Router),是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。 路由器是互联网络的枢纽,"交通警察"。目前路由器已经广泛应用于各行各业,各种不同档次的产品已成为实现各种骨干网内部连接、骨干网间互联和骨干网与互联网互联互通业务的主力军。路由和交换机之间的主要区别就是交换机发生在OSI参考模型第二层(数据链路层),而路由发生在第三层,即网络层。这一区别决定了路由和交换机在移动信息的过程中需使用不同的控制信息,所以说两者实现各自功能的方式是不同的。

路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成。因此,路由器具有判断网络地址和选择IP路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。

2、局域网

局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。  

3、子网掩码

  所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

  知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

比如,已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,

172.16.10.1:10101100.00010000.00001010.000000001
255255.255.255.0:11111111.11111111.11111111.00000000
AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0

 

172.16.10.2:10101100.00010000.00001010.00000010
255255.255.255.0:11111111.11111111.11111111.00000000
AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0
结果都是172.16.10.0,因此它们在同一个子网络。

总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。

9.2.3 tcp协议和udp协议

用于应用程序之间的通信。如果说ip地址和mac地址帮我们确定唯一的一台机器,那么我们怎么找到一台机器上的一个软件呢?

1、端口

  我们知道,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。

2、TCP协议

当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。

这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK[1],并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接。[1] 
TCP三次握手的过程如下:
客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。
(1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
(2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
(3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
(4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。[1] 
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
注意:
(1) “通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。[2] 
(2) 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭”(half-close)。
(3) 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。
无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。[2] 

3、UDP协议

当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。

当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

4、tcp和udp的对比

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快

现在Internet上流行的协议是TCP/IP协议,该协议中对低于1024的端口都有确切的定义,他们对应着Internet上一些常见的服务。这些常见的服务可以分为使用TCP端口(面向连接)和使用UDP端口(面向无连接)两种。 
说到TCP和UDP,首先要明白“连接”和“无连接”的含义,他们的关系可以用一个形象地比喻来说明,就是打电话和写信。两个人如果要通话,首先要建立连接——即打电话时的拨号,等待响应后——即接听电话后,才能相互传递信息,最后还要断开连接——即挂电话。写信就比较简单了,填写好收信人的地址后将信投入邮筒,收信人就可以收到了。从这个分析可以看出,建立连接可以在需要痛心地双方建立一个传递信息的通道,在发送方发送请求连接信息接收方响应后,由于是在接受方响应后才开始传递信息,而且是在一个通道中传送,因此接受方能比较完整地收到发送方发出的信息,即信息传递的可靠性比较高。但也正因为需要建立连接,使资源开销加大(在建立连接前必须等待接受方响应,传输信息过程中必须确认信息是否传到及断开连接时发出相应的信号等),独占一个通道,在断开连接钱不能建立另一个连接,即两人在通话过程中第三方不能打入电话。而无连接是一开始就发送信息(严格说来,这是没有开始、结束的),只是一次性的传递,是先不需要接受方的响应,因而在一定程度上也无法保证信息传递的可靠性了,就像写信一样,我们只是将信寄出去,却不能保证收信人一定可以收到。 
TCP是面向连接的,有比较高的可靠性, 一些要求比较高的服务一般使用这个协议,如FTP、Telnet、SMTP、HTTP、POP3等。
而UDP是面向无连接的,使用这个协议的常见服务有DNS、SNMP、QQ等。对于QQ必须另外说明一下,QQ2003以前是只使用UDP协议的,其服务器使用8000端口,侦听是否有信息传来,客户端使用4000端口,向外发送信息(这也就不难理解在一般的显IP的QQ版本中显示好友的IP地址信息中端口常为4000或其后续端口的原因了),即QQ程序既接受服务又提供服务,在以后的QQ版本中也支持使用TCP协议了。

9.2.4 互联网协议与OSI模型

互联网协议按照功能不同分为 OSI七层TCP/IP五层TCP/IP四层

每层运行常见物理设备

每层运行常见的协议

网络基础

1、物理层

物理层由来:上面提到,孤立的计算机之间要想一起玩,就必须接入internet,言外之意就是计算机之间必须完成组网。

物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0。

光纤 双绞线

2、数据链路层

数据链路层由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思。

数据链路层的功能:定义了电信号的分组方式。

以太网协议:

早期的时候各个公司都有自己的分组方式,后来形成了统一的标准,即以太网协议ethernet

ethernet规定

一组电信号构成一个数据豹,叫做‘帧’
每一数据帧分成:报头head和数据data两部分

head包含:(固定18个字节)

发送者/源地址,6个字节
接收者/目标地址,6个字节
数据类型,6个字节

data包含:(最短46字节,最长1500字节)

数据包的具体内容

head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送

mac地址

head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址

mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

广播

有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过arp协议获取另外一台主机的mac地址)

ethernet采用最原始的方式,广播的方式进行通信,即计算机通信基本靠吼

3、网络层

网络层由来:有了ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由

一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到,

这就不仅仅是效率低的问题了,这会是一种灾难

上图结论:必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,

就采用路由的方式(向不同广播域/子网分发数据包),mac地址是无法区分的,它只跟厂商有关

网络层功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址

IP协议:

规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
范围0.0.0.0-255.255.255.255
一个ip地址通常写成四段十进制数,例:172.16.10.1

ip地址分成两部分

网络部分:标识子网
主机部分:标识主机

注意:单纯的ip地址段只是标识了ip地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网

例:172.16.10.1与172.16.10.2并不能确定二者处于同一子网

子网掩码

所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

比如,已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,

172.16.10.1:           10101100.00010000.00001010.00000001

255.255.255.0:          11111111.11111111.11111111.00000000

AND运算得网络地址结果:   10101100.00010000.00001010.00000000->172.16.10.0
172.16.10.2:          10101100.00010000.00001010.00000010

255.255.255.0:         11111111.11111111.11111111.00000000

AND运算得网络地址结果:  10101100.00010000.00001010.00000000->172.16.10.0

结果都是172.16.10.0,因此它们在同一个子网络。

总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。

ip数据包

ip数据包也分为head和data部分,无须为ip包定义单独的栏位,直接放入以太网包的data部分

head:长度为20到60字节

data:最长为65,515字节。

而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。

ARP协议

arp协议由来:计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网头,然后通过以太网协议发送,在谈及以太网协议时候,我门了解到

通信是基于mac的广播方式实现,计算机在发包时,获取自身的mac是容易的,如何获取目标主机的mac,就需要通过arp协议

arp协议功能:广播的方式发送数据包,获取目标主机的mac地址

协议工作方式:每台主机ip都是已知的

例如:主机172.16.10.10/24访问172.16.10.11/24

一:首先通过ip地址和子网掩码区分出自己所处的子网

场景 数据包地址
同一子网 目标主机mac,目标主机ip
不同子网 网关mac,目标主机ip

二:分析172.16.10.10/24与172.16.10.11/24处于同一网络(如果不是同一网络,那么下表中目标ip为172.16.10.1,通过arp获取的是网关的mac)

源mac 目标mac 源ip 目标ip 数据部分
发送端主机 发送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 数据

三:这个包会以广播的方式在发送端所处的自网内传输,所有主机接收后拆开包,发现目标ip为自己的,就响应,返回自己的mac

4、传输层

传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程序,

那么我们通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。

传输层功能:建立端口到端口的通信

补充:端口范围0-65535,0-1023为系统占用端口

tcp协议:

可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

udp协议:

不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

tcp报文

tcp三次握手和四次挥手

5、应用层

应用层由来:用户使用的都是应用程序,均工作于应用层,互联网是开发的,大家都可以开发自己的应用程序,数据多种多样,必须规定好数据的组织形式

应用层功能:规定应用程序的数据格式。

例:TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。

9.3 软件开发架构

9.3.1 C/S架构

C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。

这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。

9.3.2 B/S架构

B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。

Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。


本部分内容来自:http://blog.csdn.net/yanglingwell

更多内容推荐

posted @ 2023-09-26 18:38  WNAG_zw  阅读(37)  评论(0)    收藏  举报