体系结构与操作系统拾遗

体系结构与操作系统拾遗

Part1. 体系结构基础

1. 冯·诺依曼体系结构

  1. 计算机处理的数据和指令一律用二进制数表示
  2. 顺序执行程序
    1. 计算机运行过程中,把要执行的程序和处理的数据首先存入主存储器(内存),计算机执行程序时,将自动地并按顺序从主存储器中取出指令一条一条地执行,这一概念称作顺序执行程序。
  3. 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。

2. 数据的机内表示

二进制表示

  1. 机器数

    1. 由于计算机中符号和数字是一样的,都必须用二进制数串来表示,因此,正负号也必须用 0、1 来表示。
    2. 用最高位 0 表示正、1 表示负,这种正负号数字化的机内表示形式就称为 “机器数”,而相应的机器外部用正负号表示的数称为“真值”,将一个真值表示成二进制字串的机器数的过程就称为编码。
  2. 原码
    原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值,比如如果是 8 位二进制:
    [+1]原 = 0000 0001
    [-1]原 = 1000 0001
    第一位是符号位,因为第一位是符号位,所以 8 位二进制的取值范围就是:
    [1111 1111, 0111, 1111] 即 [-127, +127]
    原码是人脑最容易理解和计算表达方式。
  3. 反码
    反码的表示方法是:正数的反码就是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
    [+1] = 原码:[0000 0001] = 反码:[0000 0001]
    [-1] = 原码:[1000 0001] = 反码:[1111 1110]
    可见如果一个反码表示负数,人脑无法直观的看出它的数值,通常要将其转换成原码再计算。
  4. 补码
    补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后 +1。(即在反码的基础上 +1)
    [+1] = 原码:[0000 0001] = 补码:[0000 0001]
    [-1] = 原码:[1000 0001] = 补码:[1111 1111]
    对于负数,补码表示方式也是人脑无法直观看出其数值的,通常也需要转换成原码再计算其数值。
  5. 定点数与浮点数
    定点数是小数点固定的数。在计算机中没有专门表示小数点的位,小数点的位置是约定默认的。一般固定在机器数的最低位之后,或是固定在符号位之后。前者称为定点纯整数,后者称为定点纯小数。
    定点数表示法简单直观,但是数值表示的范围太小,运算时容易产生溢出。

    浮点数是小数点的位置可以变动的数。为增大数值表示范围,防止溢出,采用浮点数表示法。浮点表示法类似于十进制中的科学计数法。

    在计算机中,通常把浮点数分成阶码和尾数两部分来表示,其中阶码一般用补码定点整数表示,尾数一般用补码或原码定点小数表示。为保证不损失有效数字,对尾数进行格式化处理,也就是平时所说的科学计数法,即保证尾数的最高位为 1,实际数值通过阶码进行调整。
    阶符表示指数的符号位、阶码表示幂次、数符表示尾数的符号位、尾数表示格式化后的小数值。
    N = 尾数 x 基数阶码(指数)

位(Bit)、字节(Byte)、字(Word)

位(Bit):是电子计算机中最小的数据单位,每一位的状态只能是 0 或 1.

字节(Byte):8 个二进制构成 1 个字节(Byte),它是存储空间的基本计量单位。1 个字节(Byte)可以存储一个英文字母或半个汉字,换而言之:1 个汉字占据 2 个字节(Byte)的存储空间。

字(Word):由若干个字节构成,字的位数叫做字长,不同档次的机器有不同的字长。例如:一台 8 位机,它的 1 个字就等于 1 个字节。如果是一台 16 位机,那么它的 1 个字就由 2 个字节构成,字长为 16 位。字是计算机进行数据处理和运算的单位。

字节序

字节序(字节顺序)是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。

小端字节序(Little Endian):指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;
大端字节序(Big Endian):指高字节数据存放在低地址处,低字节数据存放在高地址处。

基于 X86 平台的 PC 机是小端字节序的,而有的嵌入式平台则是大端字节序的。所有网络协议也都是采用大端字节序的方式来传输数据的,所以有时我们也会把大端字节序称之为:网络字节序。

比如数字 0x12345678 在两种不同字节序 CPU 中的存储顺序如下所示:

大端字节序(Big Endian)
低地址                                            高地址
---------------------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     12     |      34    |     56      |     78    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

小端字节序(Little Endian)
低地址                                            高地址
---------------------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     78     |      56    |     34      |     12    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 

联合体 union 的存放顺序是所有成员都从低地址开始存放,利用该特性,就能判断 CPU 对内存采用 Little-Endian 还是 Big-Endian 模式读写。
示例代码:

union test {
    short value;
    char str[sizeof(short)];
}example

void main()
{
    example.value = 0x0102;
    if (sizeof(short) == 2) {
        if (example.str[0] == 1 && example.str[1] == 2) {
            printf("大端字节序");
        } else if (example.str[0] == 2 && example.str[1] == 1) {
            printf("小端字节序");
        } else {
            printf("结果未知");
        }
    }
}

字节对齐

现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

为什么要进行字节对齐?
  • 最根本的原因是效率问题,字节对齐能提高存取数据的速度。
  • 某些平台只能在特定的地址处访问特定类型的数据

比如有的平台每次都是从偶地址处读取数据,对于一个 int 型的变量,若从偶地址单元处存放,则只需一个读取周期即可读取该变量,但是若从奇地址单元处存放,则需要 2 个读取周期读取该变量。

字节对齐的原则
  • 数据成员对齐规则:结构(struct)或联合(union)的数据成员,第一个数据成员放在 offset 为 0 的地方,以后每个数据成员存储的起初位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组、结构体等)的整数倍开始,比如 int 在 32 位机为 4 字节,则要从 4 的整数倍地址开始存储。
  • 结构体作为成员:如果一个结构体里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a 里存有 struct bb 里有 charintdouble 等元素,那么 b 应该从 8 的整数倍开始存储。)
  • 结构体的总大小,也就是 sizeof 的结果,必须使其内部最大成员的整数倍,不足的要补齐。

Part2. 操作系统基础

1. 操作系统提供的服务

操作系统五大功能:

  • 作业管理
  • 文件管理
  • 存储管理
  • 输入输出设备管理
  • 进程及处理机管理

2. 中断与系统调用

中断

中断:计算机执行程序的过程中,由于出现了某些特殊事情,使得 CPU 暂停对程序的执行,转而去执行处理这一事件的程序,等这些特殊事情处理完之后再回去执行之前的程序。
中断分三类:

  1. 由计算机硬件异常或故障引起的中断,称为内部异常中断;
  2. 由程序中执行了引起中断的指令而造成的中断,称为软中断(这也是和我们将要说明的系统调用相关的中断)
  3. 由外部设备请求引起的中断,称为外部中断。

简单说,对中断的理解就是对一些特殊事情的处理。

与中断紧密相连的一个概念就是中断处理程序,当中断发生的时候,系统需要去对中断进行处理,对这些中断的处理是由操作系统内核中的特定函数进行的,这些处理中断的特定的函数就是我们所说的中断处理程序。

另一个与中断紧密相连的概念是中断的优先级,中断的优先级说明的是当一个中断正在被处理的时候,处理器能接收的中断的级别。中断的优先级表明了中断需要被处理的紧急程度,每个中断都有一个对应的优先级,当处理器在处理某一中断的时候,只有比这个中断优先级高的中断可以被处理器接受并且被处理。优先级比这个当前正在被处理的中断优先级要低的中断将会被忽略。
中断优先级:

机器错误 > 时钟 > 磁盘 > 网络设备 > 终端 > 软件中断

当发现软件中断时,其他所有的中断都可能发生并被处理;但当发生磁盘中断时,就只有时钟中断和机器错误中断能被处理了。

系统调用

进程的执行在系统上的两个级别:用户级(用户态)和核心级(系统态)。

程序的执行一般是在用户态下执行的,但当程序需要使用操作系统提供的服务时,比如说打开某一设备、创建文件、读写文件等,就需要向操作系统发生调用服务的请求,这就是系统调用。

Linux 系统有专门的函数库来提供这些请求操作系统服务的入口,这个函数库中包含了操作系统所提供的对外服务的接口,当进程发出系统调用之后,它所处的运行状态就会由用户态变成核心态。但这个时候,进程本身其实并没有做什么事情,这个时候是由内核在做相应的操作,去完成进程所提出的这些请求。

系统调用和中断的关系在于:当进程发出系统调用申请的时候,会产生一个软件中断。产生这个软件中断以后,系统会去对这个软中断进行处理,这个时候进程就处于核心态了。

用户态和核心态区别:

  1. 用户态的进程能存取他们自己的指令和数据,但不能存取内核指令和数据(或其他进程的指令和数据),然而,核心态下的进程能够存取内核和用户地址。
  2. 某些机器指令是特权指令,在用户态下执行特权指令会引起错误。

在系统中内核并不是作为一个与用户进程平行的进程的集合,内核是为用户进程运行的。


更多干货文章

博客:www.qiuxuewei.com
微信公众号:@开发者成长之路

一个没有鸡汤只有干货的公众号
****************************************************

原文地址:https://www.cnblogs.com/xuewei/p/12127969.html

时间: 2024-10-19 05:49:37

体系结构与操作系统拾遗的相关文章

冯诺依曼体系结构、操作系统

冯诺依曼体系结构:(一个计算机必须有的四个部分:输入输出,存储器,处理器)输入设备->存储器->输出设备|(双向箭头)运算器控制器(用来控制输入,输出,存储器,运算器)处理器中包括运算器和控制器注意:1)这里的存储器指内存.2)CPU只能访问内存,不能访问外设.3)外设只能写入内存或者读取内存2.操作系统:搞"管理"的软件管理者的任务分为两种:硬件管理.软件管理按目标对象分为两种:对内管理.对外业务管理3.进程:对于操作系统来说,一个任务就是一个进程4.时间片:现在的操作系

在设计操作系统时,可以考虑的结构组织有哪几种?

操作系统的组织结构应包括模块化结构.接口和运行时的组织结构. 模块化结构:描述组成系统的不同功能如何分组和交互: 接口:与系统内部结构密切相关,由操作系统提供给用户.用户程序或上层软件使用: 运行时的组织结构:定义了执行过程中存在的实体类型及调用方式. 在操作系统的设计中,有如下4种设计方法: 一体化结构 特点:操作系统的运行效率高,但这种结构难以理解.难以维护.验证其正确性也十分困难. 模块化结构 优点:系统能作为抽象数据类型或者对象方法来实现,这样有利于操作系统的理解和维护. 缺点:存在潜在

nginx操作系统

nginx 编辑 Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日.其将源代码以类BSD许可证的形式发布,因它的稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名.2011年6月1日,nginx 1.0.4发布. Nginx是一款轻量级的Web 服务器/反向代理服务器及

ELF文件

ELF文件格式是一个开发标准,各种UNIX系统的可执行文件都采用ELF格式,它有三种不同的类型: 可重定位的目标文件 可执行文件 共享库 现在分析一下上一篇文章中经过汇编之后生成的目标文件max.o和链接之后生成的可执行文件max的格式,从而理解汇编.链接和加载执行的过程. 一.目标文件 ELF文件格式提供了两种不同的视角,在汇编器和链接器看来,ELF文件是由Section Header Table描述的一系列Section的集合,而执行一个ELF文件时,在加载器看来它是由Program Hea

java语言的特性及应用

java语言定义: Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言. Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算机.移动电话和互联网,同时拥有全球最大的开发者专业社群. 组成: Java由四方面组成:●Java编程语言,即语法.●Java文件格式,即各种文件夹.文件的后缀.●Java虚拟机(JVM),即处理*.class文件的解释器.●Java应用程序接口(Java API). Java分为三个体系,分别为Java

高效程序员的狂暴之路

不觉间已经工作六年,回想第一天实习的场景历历在目.恍若昨日.六年已足以令许多人转管理.转产品.转测试.转行,也一定有人还在坚守着编码,只因热爱.遇到过形形色色的经理.架构师.运维.性能工程师等等,还是觉得写代码的才是最厉害的!在这里分享一些这些年来修习到的个人心得.也许并不适用于其他人,但对于我却都是最珍贵的"宝藏".也谨以此文纪念在代码堆里度过的青春~ 看到这些点点滴滴的收获,就会感到所有逝去的光阴和挥洒的汗水都是值得的. 1.启动:得心应手的工具 1.1 全能IDE 关于IDE,目

如何实现一个malloc

任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉.但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字.实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很容易理解. 这篇文章通过实现一个简单的malloc来描述malloc背后的机制.当然与现有C的标准库

malloc实现

任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放 掉.但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字.实际上,malloc只是 C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很容易理解. 这篇文章通过实现一个简单的malloc来描述malloc背后的机制.当然与现有C的标

网工备考前8天小结

距离软考还有8天,目前网工教材看了2遍,有个大概了解,但是存在好几个地方并且非常重要的知识点盲区: 1. 无线网络这块,翻看了前几年的题目,这块知识点考的还真不少,估计无线网络现在也是热点啊,什么无线AP,wifi啊!都是因为移动终端设备的普及,估计今年也会考这块知识,得好好补一补 2. 网络安全这块,特别是IPSEC,VPN这块,要很好看看,这块也是热点,特别是:棱镜门事件,乌云报漏洞,网络安全涉及到国家信息安全,国家都成立了安全委员会,这能不是热点吗? 3. IPv6,IPv4已经是昨日黄花