深入理解计算机系统(1)-----计算机系统漫游

本文是《深入理解计算机系统》的读书总结,探讨计算机系统的组成,包括硬件和系统软件。硬件涉及总线、I/O设备、主存和处理器;软件方面,介绍了操作系统如何管理硬件。接着,详细阐述了程序的执行过程,从信息的定义、编译阶段(预处理、编译、汇编、链接)到执行阶段,最后提到了存储层次结构的重要性,并简要介绍了Amdahl定律和并发并行的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思维导图:

 

引言:

    深入理解计算机系统系列是我看<<深入理解设计系统>>的读书总结.本章既为开篇的第一章-计算机系统漫游.其主要内容是从整体上介绍什么是计算机系统.例如:

  • 计算机系统由那些部分构成
  • 计算机系统是如何管理硬件的
  • 计算机系统是如何执行程序代码的

一.计算机系统的组成

    计算机系统是由硬件和系统软件组成的,他们共同工作来运行引用程序.

1.1 系统硬件

    计算机系统的硬件由以下几类组成:

  • 总线:总线是贯穿整个系统的一组电子管道,它携带信息字节并负责在各个部件间传递.总线通常被设计为传递定长的字节块,也就是我们常说的字
  • I/O设备:I/O(s输入/输出)设备是系统与外部世界联系的通道.例如键盘和鼠标是输入设备,显示器是输出设备.I/O设备会通过控制器或者适配器与总线相连.控制器和适配器的区别在于封装方式.网络通信也算是I/O设备的一种.
  • 主存:主存是一个临时存储设备,在处理器执行程序时,用来处理程序和程序处理的数据..
  • 处理器:中央处理单元(CPU),简称处理器.是解释或执行储存在主存中指令的引擎.处理器的核心是一个大小为一个字的存储设备(寄存器),称为程序计数器,它指向一条机器语言指令.

 1.2 系统软件

    计算机的系统软件是如何管理系统硬件的呢?这是由操作系统提供的服务.我们可以把操作系统看为应用程序和硬件之间插入的一层软件.

    操作系统的功能有以下两点:

  • 防止硬件被失控的应用程序滥用
  • 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备.

    系统通过基本的抽象概念实现了这两个功能..

    系统实现的抽象概念如下:

  • 进程:进程是操作系统对一个正在运行的程序的抽象.一个计算机系统上可以同时运行多个进程,每个进程都好像在单独的使用硬件.一个进程的指令是和另一个进程的执行交错运行的.操作系统实现的这种交错运行的机制称为上下文切换.
  • 线程:在现代操作系统中,一个进程实际上有多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据.
  • 虚拟内存:虚拟内存是一个抽象概念,他为每个进程提供了一种假象,即每个进程都在独占的使用主存.每个进程看到的内存都是一致的,称为虚拟地址空间.

  • 文件:文件就是字节序列,仅此而已.他是每个I/O设备的抽象表示.

二.程序执行

    一个程序是如何在计算机系统中执行的呢,又会经过怎样的执行步骤呢?

    我们以如下这个名为hello.c的程序代码为例.

#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0;
}

2.1 什么是信息

    首先,我们需要知道,到底什么是信息.信息其实就是位+上下文.以上程序代码其实就是由值为0和1组成的位(也称为比特)序列,他们8个位一组,称为字节.每个字节都可以表示某些文本字符.

    所有的信息都是有一串比特表示的,而区分他们的唯一方式就是读到这些数据对象时的上下文..

2.2 编译

    硬件是不认识C语言或其他高级语言的,硬件只会执行最基本的机器语言,所以,我们需要将上述程序代码翻译成机器语言代码才可供硬件执行,此时的文件称之为目标文件,也称为可执行目标文件.这就需要借助于几种中间程序,也就是我们的编译系统.

  • 预处理阶段:预处理器cpp会根据以#开头的命令,修改原始的C程序.比如像我们的hello.c中第一行的 # include<stdio.h>命令告诉预处理器读取系统头文件中stdio.h的内容,并把它直接插入程序文本中.结果就得到了以.i为扩展名的文件.
  • 编译阶段:编译期ccl将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序.
  • 汇编阶段:汇编器as会将hello.s翻译成机器语言指令,把这些指令打包成一种叫可重定位目标程序的格式并将结果保存在hello.o中.
  • 链接阶段:我们注意到,hello.c程序中调用了printf函数,这是每个C语言编译期都提供的标准C库中的一个函数.printf存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并的我们的hello.o中.链接器ld就负责处理这种合并.最后就会生成一个可执行目标文件hello.

2.3 执行

    我们来看看当hello.c被编译好以后是如何在计算机系统中执行的.

  • 1.我们在键盘上输入字符串"./hello.c"后,shell程序将字符串足以读入寄存器,在把它们存放到内存中.

  • 2.当我们敲下回车键后,shell程序知道我们已经结束的命令的输入.然后shell程序执行一系列的指令来加载可执行的hello文件,这些指定会将hello代码和数据从磁盘复制到主存中.

  • 3.一旦主存加载了hello文件的代码和数据,处理器就会执行其中的main函数的代码片段,然后将结果"hello,world"复制到寄存器文档,然后从寄存器文档复制到显示设备,最终显示在屏幕上.

 2.4 存储层次

    从以上hello文件被执行的过程中可以看到,系统花费了大量的时间把信息从一个地方移动到另一个地方.为了减少移动信息的时间开销,同时也考虑到成本的节约.就形成了我们当前的存储器层次结构.

 三.重要主题

    作为本章的结尾,还需要介绍两个贯穿整书的重要的概念.

3.1 Amdahl定律

    Amdahl定律用于衡量系统部分的加速效果对于系统整体的加速效果的影响.其中S表示加速比,用于衡量加速效果.a表示在旧系统中部分系统执行时间与系统整体执行时间的比例.k表示部分系统的加速效果.

3.2 并发和并行

  •     并发:并发是一个通用的概念,指一个同时具有多个活动的系统.
  •     并行:并行指用并发使一个系统运行的更快. 

    在了解了上述概念后,我们按照系统层次结构中由高到低的顺序重点强调三个层次:

  • 线程级并发:构建在进程这个抽象之上,我们能够设计出同时具有多个程序执行的系统,就导致了并发.使用线程,我们甚至能够在一个进程中执行多个控制流.
  • 指令级并行:在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行.
  • 单指令,多数据并行:在最低层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作.这种方式称为单指令,多数据,即SIMD并行.
### 回答1: CentOS 7上启动httpd服务失败可能有多种原因,以下是一些常见的解决方法: 1. 检查httpd配置文件是否正确:可以使用命令`httpd -t`检查httpd配置文件是否正确,如果有错误,需要修改配置文件。 2. 检查端口是否被占用:可以使用命令`netstat -tlnp`查看端口是否被占用,如果被占用需要释放端口或修改httpd配置文件中的端口号。 3. 检查httpd服务是否安装:可以使用命令`rpm -qa | grep httpd`查看httpd服务是否安装,如果没有安装需要先安装httpd服务。 4. 检查httpd服务是否启动:可以使用命令`systemctl status httpd`查看httpd服务是否启动,如果没有启动需要使用命令`systemctl start httpd`启动httpd服务。 5. 检查SELinux是否开启:如果SELinux开启,可能会导致httpd服务启动失败,需要使用命令`setenforce 0`关闭SELinux,或者修改SELinux策略。 以上是一些常见的解决方法,如果以上方法都无法解决问题,可以查看httpd服务日志文件,找到具体的错误信息,然后根据错误信息进行解决。 ### 回答2: CentOS 7上的httpd服务启动失败可能有多种原因。以下列出了一些常见问题和解决方法: 1. 端口被占用 当httpd试图占用已被其他程序占用的端口时会启动失败。此时可以通过使用`netstat -tunlp`命令检查端口占用情况,然后杀死占用该端口的进程及时释放端口。或者修改httpd的配置文件,将端口修改为未被占用的端口。 2. 配置文件错误 有时httpd服务的配置文件中可能出现错误,例如语法错误或路径错误等等。在启动httpd服务之前,可以使用`apachectl configtest`命令进行检查,如果输出“Syntax OK”,则表示配置文件没有错误。如果出现错误,则需要根据错误提示进行相应修改。 3. 依赖关系问题 如果httpd依赖的其他程序或库缺失,也会导致启动失败。可以通过使用`systemctl status httpd.service`命令来查看httpd服务状态,如果输出“Failed to start”或“Loaded: failed”,则需要检查依赖关系是否完整。 4. SELinux问题 当SELinux启用时,有时会导致httpd服务启动失败。在这种情况下,可以在SELinux上禁用httpd服务,或者修改httpd配置文件解决SELinux相关的问题。 5. 用户权限问题 httpd服务的启动可能需要特定的用户权限。如果使用的用户权限不够,则无法启动。可以尝试使用root用户启动httpd服务,或者根据需要修改相应的用户权限。 ### 回答3: CentOS 7中的Apache HTTP服务器(httpd)是一个常见的Web服务器,如果遇到httpd服务启动失败的情况,可能会影响服务器正常的工作和对外服务的稳定性。本文将提供一些可能会导致httpd服务启动失败的原因,并给出相应的解决方法。 1. 端口被占用 如果端口被其他进程占用,httpd服务就无法启动。可以通过 netstat -tulpn 命令查看端口占用情况,并杀死占用该端口的进程。如果端口被 httpd 服务自身占用,可以通过 systemctl restart httpd 命令重启 httpd 服务;如果是其他进程占用了端口,可以通过 kill 命令杀死该进程或更改 httpd.conf 文件配置,将 httpd 服务的端口改为其他空闲端口,重新启动。 2. 配置文件错误 httpd 服务的配置文件通常是 /etc/httpd/conf/httpd.conf,如果其中存在语法错误、权限问题或者其它配置错误,可能会导致 httpd 服务启动出错。可以通过将 httpd.conf 文件备份后删掉,重新执行 yum install httpd 命令安装 httpd 服务,然后手动修改 httpd.conf 文件,逐个检查每个配置项是否正确,确认无误后重启 httpd 服务。 3. SELinux 问题 SELinux 是 CentOS 7中提供的一种安全模块,它可以对系统文件和应用程序进行安全管控。如果 SELinux 配置不正确,可能会阻止 httpd 服务正常启动。可以通过修改 /etc/selinux/config 文件中 SELINUX=disabled 来暂时关闭 SELinux,然后重新启动 httpd 服务;或者一个更优的方式是,根据日志确定问题原因,使用命令 semanage 或者 setsebool 等工具将相关目录或者配置加入到 SELinux 许可列表中,重新启动 httpd 服务,以恢复服务正常工作。 4. 防火墙问题 如果你的 CentOs 7 服务器启用了防火墙,有可能会导致 httpd 服务启动失败。可以通过检查防火墙相关配置来确定问题原因,解决方案是修改防火墙规则,将端口 80 或者 443 等 httpd 服务需要的端口放行,重新启动 httpd 服务。 总之,当遇到 httpd 服务启动失败时,不要慌张,可以先通过日志或者执行命令查看错误信息,找到错误原因,然后根据错误原因一步一步解决问题。在解决问题过程中注意备份原始配置文件,以免造成不必要的损失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值