operating system basic

obj,lib,exe

obj是编译过的二进制文件,cpp对应的二进制格式就是obj,一堆obj的集合是libobj文件是未经重定位的,obj只给出的是程序的相对地址,而exe给出的是绝对地址,obj经链接器和资源文件链接后就成了可执行文件exe了。

编译器的工作流程

1.预处理 展开头文件 .c->.i
2.编译 c语言到汇编语言 .i->.s
3.汇编 汇编语言到机器语言 .s->.o
4.链接 ??? .o->.exe或者elf文件
5.加载并运行

elf

fork

fork子进程都从父进程那里得到了什么?

僵尸进程

cache与buffer

cache:cpu和内存之间一种高速存储器,存储一段时间内可能频繁访问的内存页面,对应的有那几种页面置换算法,一定程度上缓解cpu和内存速度不匹配的问题,现在的intel处理器好像都是三级缓存了。
其实更广义的缓存,小黑哥说的好,热点数据,cpu记录一级cache的热点数据,一级cache记录二级cache的热点数据…三级cache记录内存的热点数据,内存记录硬盘的热点数据,硬盘记录网络的热点数据(分布式系统)。
要缓存就要记录你缓存了的数据的元信息,对应的有MMU中的TLB(页表缓冲),页表,文件描述符表,再到分布式系统如hadoop的namenode记录datanode的一些元信息。
记录元信息,就要消耗资源,但当数据达到一定程度,这些消耗的资源对于他带来的价值相对来说可以忽略的话,就要考虑加了,要不也不会分这么多层,cpu》一级cache》二级cache》三级cache》内存》硬盘》网络。
buffer:我要读硬盘,一个扇区一个扇区读也是读,几个扇区几个扇区(块,一般是八个扇区4096B)读也是读,那我是一个扇区读呢还是一下读取几个扇区呢?读文件,我一个字节一个字节读也是读,我多个字节读也是读,那我是一个一个读呢还是一次读取多个呢?等等
往往我通过预先读(写)的时间消耗,比我需要时再读(写)等待这些操作的时间要短。所以我要采取批量操作。
cachebuffer都能改善io,cache利用的局部性原理,局部性就要记录你的局部的信息,就要涉及换入换出的策咯问题;buffer主要是批量操作,批量操作减少不必要的状态切换。

并行与并发

答:逻辑流的执行在时间上有重叠,就说这是并发流,并发的思想与流运行的处理器的核数或者计算机数无关
并行流是并发流的一种特殊情况,当这些逻辑流在不同的处理器核或者计算机上,我们就称它们为并行流 例:
a执行在0s-5s, b执行在3s-6s,
c执行在1s-2s;则a与c并发,a与b并发,但是b与c不并发
如果a与b还在不同的cpu上运行,那么a与b还是并行了。

进程与线程

线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是.
4)二者均可并发执行.

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。
但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,
来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.
线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈), 但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

冯诺依曼计算机体系结构

冯诺依曼计算机体系结构包含: cpu、存储器、输入输出设备,所有的单元都通过总线项链,总线分为地址总线和数据总线。

cpu

cpu由算术逻辑单元(ALU)和控制单元构成。ALU包含一个能完成算术和逻辑操作的功能单元,以及各种寄存器。控制单元包含一个程序计数器和一个指令寄存器。程序计数器指示下一步应该执行的指令,而指令寄存器包含当前指令的拷贝。

存储器

存储器是计算机存储程序和数据的部件。内存接口由三个寄存器组成:存储地址寄存器(MAR)和存储数据寄存器(MDR)和命令寄存器(CR)。

IO设备

I/O设备分为存储设备、字符设备(终端显示器、鼠标)、通信设备(如连接调制解调器的串行端口或网络接口)。每个设备都通过设备控制器与计算机的地址和数据总线相连。控制器提供一组物理部件,可以通过CPU指令操纵他们以完成I/O操作。

多道程序设计技术和分时技术

多道程序设计技术

多道程序设计技术是在计算机内存中存放几道相互独立的程序,使他们在管理程序的控制之下,相互穿插的进行,即当一个正在cpu上运行的程序因为要输入或输出而不能继续运行下去,就把cpu让给另一道程序。多道程序运行的特征是:

1.多道-计算机内存中同时存放几道相互独立的程序

2.宏观上并行-同时进入系统的几道程序都处于运行过程中

3.微观上串行—内存中的多道程序轮流或分时的占有cpu,交替执行。

分时技术

分时技术是把cpu时间划分为很短的时间片轮流的分配给各个联机作业使用,如果某个作业在分配的时间片用完之前还未完成计算,该作业就暂时中断,等待下一轮继续计算。

在多道程序设计技术和分时技术的支持下,出现了批处理系统和分时系统。

操作系统的基本概念

基本定义

操作系统是一个大型的程序系统,它负责计算机系统软、硬件资源的分配和管理;控制和协调并发活动;提供用户接口,使用户获得良好的工作环境。

操作系统的资源管理功能

操作系统资源管理的目标是提高系统资源的利用率和方便用户使用:

cpu分配

1.提出进程调度策略

2.给出进程调度算法

3.进行cpu的分派

存储管理

1.存储分配和存储无关性

如果有多个用户程序在机器上运行,其程序和数据都需要占用一定的存储空间。这些程序和数据将分别安置在主存的什么位置,各占多大区域,这些是存储问题。然而用户无法预知存储管理不见把他们的程序分配到主存的什么地方,而且用户也希望摆脱存储地址,存储空间大小等细节问题,为此,存储管理不见应提供地址重定位能力,提供重定位装配程序或地址映像结构等。

2.存储保护

由于主存中同时存放几道程序,为了防止某道程序干扰、破坏其他用户程序、存储管理必须保证每个用户程序只能访问它自己的存储空间,而不能存取任何其他范围的信息,也就是要提供存储包含的手段。存储保护必须由硬件提供支持,具体保护方法有基址、界限寄存器法、存储键和锁等。

3.存储扩充

主存空间是计算机资源中重要的资源之一,尤其是在多道运行环境下,主存资源显得更加紧张。通常使用联机辅助存储器,通过虚拟存储机制和软件去扩充主存空间。若系统具备这一功能,称该系统提供了虚拟存储技术。

设备管理

设备管理是操作系统中最庞杂、最琐碎的部分,其原因是:

1.这部分工作主要涉及很多实际的物理设备,这些设备品种繁多、用法各异;

2.各种外部设备都能和主机并行工作,而且有的设备可被多个程序所共享;

3.主机和外部设备以及各类外部设备之间的速度极不匹配,级差很大。

基于这些原因,设备管理主要解决以下问题:

1.设备无关性

用户向系统申请和使用的设备与实际操作的设备无关,即在用户程序中活在资源申请命令中使用设备的逻辑名,此即为与设备无关性。这一特性不仅为用户使用设备提供了方便,而且也提高了设备的利用率。

2.设备分配

设备分配通常采用三种基本技术:独享、共享及虚拟分配技术

3.设备的传输控制

软件资源管理

为用户提供一种简便的、统一的存取和管理信息的方法,并要解决信息的共享、数据的存取控制和保密等问题。

操作系统的特性

并发:指能处理读个哦哦同时性活动的能力

共享:指多个计算任务对资源的共同享用

不确定性:指能处理随机发生的多个事件,处理大量的、随机的时间序列,使各用户的计算任务正确地完成

虚拟性:把物理上的一个实体变成逻辑上多个对应物或把物理上的多个实体变成逻辑上的一个对应物的技术

操作系统应解决的基本问题

1.提出解决资源分配的策略

2.协调并发活动的关系

3.保证数据的一致性

4.实现资源的存取控制