精华内容
下载资源
问答
  • 【深入理解计算机系统】程序是如何运行

    万次阅读 多人点赞 2017-11-05 20:53:14
    程序是如何运行的现代计算机存储和处理的信息以二值信号表示,程序对于计算机而言就是一串二进制数据流,以流水线的方式进入CPU进行运算。主要在;CPU与内存之间进行数据传递。本文将从程序源码的结构与表现形式开始...

    程序是如何运行的

    现代计算机存储和处理的信息以二值信号表示,程序对于计算机而言就是一串二进制数据流,以流水线的方式进入CPU进行运算。而数据主要在CPU与内存之间进行传递。本文将从程序源码的结构与表现形式开始,源代码编译成可执行文件,再到执行文件的加载,最终到执行文件的运行整个过程进行梳理。

    ###1 程序的结构与表现形式
    大多数计算使用8位的块,即字节(byte),作为最小的可寻址的内存单元。程序对象,即程序数据、指令和控制信息的字节集合,编译器和系统运行时将存储空间划分成更可管理的单元来存储程序对象。

    计算机执行机器代码,用字节序列编码低级的操作,包括处理数据、管理内存、读写存储设备上的数据、以及利用网络通信。程序源码会经过编译器生成机器代码,编译器基于编程语言的规则、目标机器的指令集合和操作系统遵循的惯例,经过一系列的阶段生成机器代码。汇编代码是机器代码的文本表示,给出程序中的每一条指令。

    计算机系统使用了多种不同形式的抽象,利用抽象模型来隐藏实现的细节。对于机器级编程来说,两个重要的抽象:

    1. 指令集架构(Instruction Set Architecture, ISA) 定义机器级别格式和行为,处理器状态、指令的格式,以及每条指令对状态的影响。
    2. 虚拟内存地址,程序使用的内存地址是虚拟地址,提供内存模型看上去是一个非常大的字节数组。实际上由许多个硬件存储器和操作系统软件组合起来。

    以C语言为例,编写程序mstore.c

    long mult2(long, long);
    
    void multistore(long x, long y, long *dest) {
    	long t = mult2(x, y);
    	*dest = t;
    } 
    

    经过gcc编译器,产生一个汇编文件mstore.s

    multstore:
    	pushq %rbx
    	movq %rdx, %rbx
    	call mult2
    	movq %rax, (%rbx)
    	popq %rbx
    	ret
    

    上面代码中每行对应一条机器指令,比如, pushq指令应该将%rbx的内容压入程序栈中。

    再将mstore.c编译并汇编成目标代码文件mstore.o,该二进制文件中,有一段14个字节的序列,它的十六进制表示为:

    53 48 89 d3 e8 00 00 00 00 48 89 03 5b c3
    

    为了弄清这些14个字节表示的含义,可以通过objdump 反汇编 该mstore.o 文件
    这里写图片描述

    可以看到,这14个字节分成若干组,左边是一条指令,右边是等价的汇编语言。

    程序中包含过程、控制

    过程
    是软件中一种重要的抽象。它提供了一种封装代码的方式,用一组制定的参数和一个可选的返回值实现了某一功能。然后,可以在程序中不同的地方调用这个函数。设计良好的软件用过程作为抽象机制,隐藏某个行为的具体实现,同时又提供清晰简洁的接口定义,说明计算的是哪些值,过程会对程序状态产生什么样的影响。不同编程语言中,过程的形式多样;函数(funciton)、方法(method)、子例程(subroutine)、处理函数(handler)等等。

    要提供对过程的机器级支持,必须要处理许多不同的属性。为了讨论方便,假设过程P调用过程Q,Q执行后返回到P。这些动作包括以下一个或多个机制:

    1. 传递控制。在进入过程Q的时候,程序计数器必须被设置位Q的代码的起始地址,然后在返回时,要把程序计数器设置位P中调用Q后面那条指令的地址。
    2. 传递数据。P必须能够向Q提供一个或多个参数,Q必须能够向P返回一个值
    3. 分配和释放内存。在开始时,Q可能需要为局部变量分配空间,而在返回前,又必须释放这些存储空间。

    x86-64的过程实现包括一组特殊的指令和一些对机器资源(寄存器和程序内存)使用的约定规则。

    控制
    程序中的控制逻辑,例如条件语句if else, 循环for do-while等。机器级指令的执行,有两种方式实现条件控制,一种将控制条件进行传递,一种是将不同条件计算结构进行传递。后一种方式在现代计算机中能提高程序运行的效率,代码中的指令都是按照在程序中出现的次序,顺序执行的,使用jump指令可以改变一组机器代码指令的执行顺序,从而实现条件操作。

    为了实现条件控制,CPU中维护了一组单个位的条件码(condition code) 寄存器,它们描述了最近的算数或逻辑操作的属性。可以通过检测这些寄存器来执行条件分支指令,通常条件码有,CF:进位标志;ZF:零标志。SF: 符号标志;OF:溢出标志。

    运行时调用栈
    这里写图片描述
    大多数语言过程调用机制采用栈数据结构提供的后进先出的内存管理原则。过程P调用过程Q的过程,如果上图所示。

    ###2 程序代码的编译过程
    这里写图片描述

    预处理阶段,主要是修改原始程序,例如将#include<stdio.h> 命令告诉预处理读取系统stdio.h的文件,并将它直接插入到程序文本中。结果得到的另一个C程序,以.i作为扩展名;
    编译阶段,编译器ccl将文本hello.i翻译成文本hello.s,它包含一个汇编语言程序;
    汇编阶段,汇编器将.s文件编译成一个二进制的文件,把这些指令打包成一种叫做可重定位的目标程序的格式,并将结果保存在目标文件.o文件中。
    链接阶段,将各种代码和数据片段手机并组合并成可以执行的目标文件,简称可执行文件,可以被加载到内存中,由系统执行。

    本节主要讨论链接阶段。链接可以执行与编译时,即将源代码翻译成机器代码时;可以执行与加载时,即程序被加载器加载到内存时;可以执行与运行时,也就是由应用程序来执行。

    链接器是的分离编译(separate compilation)成为可能。我们不用将一个大型的应用程序组织成一个巨大的源文件,而时可以把它分解为更小、更好管理的模块。理解链接的工作原理可以帮助我们避免一些危险的编程错误、理解语言的作用域规则、理解一些重要概念(加载、运行程序、虚拟内存、分页、内存映射)、有助于理解共享库。

    为了构造可执行的文件,链接器必须完成两个主要任务:

    1. 符号解析(symbol resolution)。 目标文件定义和引用符号,每个符号对应于一个函数、一个全局变量或一个静态变量。符号解析的目的时将每个符号引用正好和一个符号定义关联起来;
    2. 重定位(relocaiotn)。编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号的引用,使得他们指向内存这个内存位置。链接器使用汇编器产生的重定位条目(relocation entry)的详细指令,不加甄别地执行这样的重定位。

    目标文件分为三种:

    1. 可重定位目标文件,包含二进制代码和数据,其形式在编译时可以与其他可重定位目标文件合并起来,创建一个可执行目标文件;
    2. 可执行目标文件,包含二进制代码和数据,其形式可以被直接复制到内存并执行;
    3. 共享目标文件,一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。

    ###3 执行文件

    可执行的目标文件,通过加载器,加载到内存,供CPU调用运行。

    进程是执行中程序的一个具体实例,程序总是运行在某个进程的上下文中。

    进程提供了给应用程序的关键抽象:

    1. 一个独立的逻辑控制流,程序计数器PC值序列叫做逻辑控制流,每个PC值对应可执行目标文件中的指令,或者是包含在运行是动态链接到程序的共享对象中的指令。
    2. 一个私有的地址空间,进程位每个程序提供一种假象,好像它独占地使用系统地址空间。例如,在一台64位地址的机器上,地址空间是2642^64264 个可能地址的集合。进程为每个程序提供它自己的私有地址空间。一般而言,其他进程是不能访问该进程的地址空间所关联的内存字节。
      每个私有地址空间有相同通用的结构,如下图所示
      这里写图片描述
      地址空间底部是保留给用户程序的,包括通常的代码、数据、堆和栈段。代码段总是从地址0x00400000开始。地址空间顶部保留给内核(操作系统常驻内存的部分)。地址空间的这部分包含内核在代表进程执行指令时使用的代码、数据和栈。

    为了使操作系统内核提供一个无懈可击的进程抽象,处理器必须提供一种机制,限制一个应用可以执行的指令以及它可以访问的地址空间范围。处理器通常是用某个控制寄存器的一个模式为来提供这种功能,该寄存器描述了进程当前享有的特权。

    进程运行有两种模式:

    1. 内核模式(超级用户模式)
    2. 用户模式

    当设置了模式位时,进程就运行在内核模式中(超级用户模式)。一个运行在内核模式的进程可以执行指令集中的任何指令,并且可以访问系统的任何内存位置。

    没有设置模式位时,进程运行在用户模式中。用户模式中的进程不允许执行特权指令(privileged instruction),比如停止处理器、改变模式位、或者发起一个I/O操作。也不允许用户模式中的进程直接引用地址空间中内核区内的代码和数据。任何这样的尝试都会导致致命的保护故障。反之,用户程序必须通过系统调用接口间接地访问内核代码和数据。

    操作系统内核使用一种称为上下文切换的较高层形式的异常控制流来实现多任务。内核为每个进程维持一个上下文明。上下文就是内核重新启动一个被抢占的进程所需状态。进程切换包含三个操作

    1. 保存当前进程的上下文
    2. 恢复某个先前被抢占的进程被保存的上下文
    3. 将控制传递给这个新恢复的进程

    这里写图片描述

    当进程A开始读取磁盘文件时,会通过执行系统调用read陷入到内核。内核中的陷进处理程序请求来自磁盘控制器的DMA传输,并且安排在磁盘控制器完成从磁盘到内存的数据传输后,磁盘终端处理器。

    每个执行的程序,即系统中的进程,进程总可以处于下面三种状态:

    1. 运行,进程要么在CPU上执行,要么在等待被执行且最终会被内核调度;
    2. 停止,进程的执行被挂起,且不会被调度,当收到SIGSTOP、SIGTSTP、SIGTTIN或者SIGTTOU信号时,进制就会停止,并且 保持停止知道它收到一个SIGCONT信号,在这个时刻,进程再一次开始运行。
    3. 终止,进程永远地停止了。进程会因为三种原因终止:1)收到进程终止的信号,2)从主程序返回;3)调用exit函数。

    加载并运行程序

    当使用execve函数在当前进程的上下文中加载并运行一个新程序。
    (fork是在父进程下,创建一个新的上下文运行子进程)

    #include <unistd.h>
    int execve(const char *filename, const char *argv[], const char *envp[]);
    

    当使用execve加载filename之后,启动代码设置栈,并将控制传递给新程序的主函数。
    用户栈的典型组织结构:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIstAqiI-1619105227349)(https://img-blog.csdn.net/20171105200816854?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2RwMTIzMTVfZ3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

    信号
    除了操作系统利用异常来支持进程上下文切换的异常控制流形式,另外一种更高层次的软件形式的异常,成为Linux信号,它运行进程和内核中断其他进程。

    一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件。每种信号类型都对应于某种系统事件。底层的硬件异常是由内核异常处理程序处理的,正常情况下,对于用户进程而言是不可见的。信号提供了一种机制,通知用户进程发生了这些异常。比如,当进程在前台运行时,你键入Ctrl+C,那么内核就会发送一个SIGINT信号强制终止它。当一个子进程终止或者停止时,内核会发送一个SIGCHLD信号给父进程。

    传送一个信号到目的进程是由两个不同步骤组成的

    1. 发送信号,内核通过更新目的进程上下文种的某个状态,发送一个信号给目的进程。发送信号可以由如下两种原因:1)内核检测到一个系统事件,比如除零错误。2)一个进程调用kill,显示要求内核发送一个信号给目的进程。一个进程可以发送信号给它自己
    2. 接受信号,当目的进程被内核强波以某种方式对信号的发送做出反应时,它就接收了信号。进程可以忽略这个信号,终止或者通过之心一个称为信号处理程序的用户曾函数捕获这个信号。

    一个发出而没有被接收的信号,叫做处理信号,在任何时刻,一种类型至多只会由一个待处理信号。重复发送在等待的信号,将会被内核抛弃。
    linux 提供两种阻塞机制,隐式和显式

    1. 隐式,即内核默认会阻塞当前处理程序接受到的待处理信号,正好与该待处理信号类型相同的信号已经被该处理程序所捕获。
    2. 显示阻塞机制,应用程序可以使用singprocmask函数和它的辅助函数,明确地阻塞和解除阻塞选定的信号。

    通过本文我们阐述了,程序在计算机种运行的一些基本概念、逻辑流、内存等。然后,系统种程序往往不是独立运行的,不仅仅是包含最小限度的输入和输出。在现实世界中,应用程序利用操作系统提供的服务来与I/O设备以及其他程序通信。

    下一篇,详细探讨Unix操作系统提供的基本I/O服务,以及如何用这些服务来构造应用程序,例如Web客户端和服务器。

    展开全文
  • 本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习。一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止。我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念、...

    本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习。一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止。我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念、专业术语和组成部分。

      好久没有更新博客了,从国庆节到现在一直在整理秋招的一些资料,简历模版,嵌入式软件面试知识点总结,秋招笔试题目整理,面经总结复盘等。一共整理了将近400页,16W字。顺便把百度网盘的资料也整理了下,到10.16才整理完(需要资料的在主页有我联系方式)。不得不说,整理资料是真的磨人性。

      接下来的计划是补充下操作系统和计算机组成原理相关的知识。从《深入理解计算机系统》这本书开始吧,系统学习下《深入理解计算机系统》这本书,还有9个Lab可以做下,以便加深理解。初步计划一周一章(不知道行不行),争取在放寒假前做完这些。

      我会把看书过程中一些重要的知识点,概念的理解以及做实验的详细过程都放在博客深入理解计算机系统专栏中。欢迎关注我的博客以便第一时间获取文章更新的内容。

      下面就是本书第一章的一个简单总结。

    源程序是如何存储的

    #include <stdio.h>
    int main()
    {
    	printf("hello,world\n");
    	return 0;
    }
    

      以上程序是我们通过文本编辑器创建的文本文件,保存为hello.c。源程序实际上就是一个由值0和1组成的位(又称为比特)序列,8个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。现代计算机都使用ASCII标准来表示文本字符。hello.c程序的ASCII文本字符如下所示。

    image-20201019170810469

      hello.c程序是以字节序列的方式储存在文件中的。

      hello.c的表示方法说明了一个基本思想:系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象的上下文

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/qq_16933601/article/details/109169750

    源程序到可执行文件的过程

      GCC编译器驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello。这个翻译过程可分为四个阶段:预编译,编译,汇编,链接。

    image-20201019171458969

    预编译

      在预编译的过程中,主要处理源代码中的预处理指令,引入头文件,去除注释,处理所有的条件编译指令(#ifdef,#ifndef,#else,#elif,#endif),宏的替换,添加行号,保留所有的编译器指令

    编译

      在预处理结束后,进行的是编译。编译过程所进行的是对预处理后的文件进行语法分析,词法分析,语义分析,符号汇总,然后生成汇编代码

    汇编

      汇编过程将汇编代码转成二进制文件,二进制文件就可以让机器来读取。每一条汇编语句都会产生一句机器语言。

    链接

      由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数等等。所有这些问题,都需要经链接程序的处理方能得以解决链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体

    shell是什么

      shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是一个内置的shell命令,那么 shell就会假设这是个可执行文件的名字,它将加载并运行这个文件。

    典型系统的硬件组成

    总线

      贯穿整个系统的是一组电子通道,称作总线。通常总线中传输的是固定长度的字节块,也就是字(word)。字中的字节数(字长)是一个基本的系统参数。不同系统字长不同。比如32位系统的字长为4个字节,64位系统的字长为8个字节。

    IO设备

      I/O(输入/输出)设备是系统与外部世界的联系通道。我们的示例系统包括四个I/O设备:作为用户输入的键盘和鼠标,作为用户输出的显示器,以及用于长期存储数据和程序的磁盘驱动器(简单地说就是磁盘)。

      每个IO设备都通过一个控制器或适配器与I/O总线相连。控制器和适配器之间的区别主要在于它们的封装方式。控制器是I/O设备本身或者系统的主印制电路板(通常称作主板)上的芯片组。而适配器则是一块插在主板插槽上的卡。无论如何,它们的功能都是在I/O总线和I/O设备之间传递信息

    主存

      主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。

    处理器

      中央处理单元(CPU),简称处理器,是执行存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。

    运行hello程序

      shell读取到我们从键盘输入的“./hello”后,计算机中的信息流向如下图红线所示:

      键盘->USB控制器->I/O总线->I/O桥->系统总线->寄存器

      寄存器->系统总线->I/O桥->内存总线->主存

      shell程序需要把用户输入的内容作为一个变量使用,而这个变量一定在内存中有个地址,所以它最终会到达内存。

    image-20201019191356753

      当我们在键盘上敲回车键时, shell程序就知道我们已经结東了命令的输入。然后shell执行一系列指令来加载可执行的hello文件,这些指令将hello目标文件中的代码和数据从磁盘复制到主存。数据包括最终会被输出的字符串“ hello,wor1d\n”。信息流向如下所示。

      磁盘->磁盘控制器->I/O总线->I/O桥->内存总线->主存

      这种访问数据的方式数据不会经过CPU,而是直接从磁盘到主存,这种方式称为DMA。DMA(直接存储器访问)有利于减轻CPU的负荷,使CPU可以在数据转移的同时做其它任务。

    image-20201019191522808

      加载完hello文件后,CPU将会开始从hello程序的主函数处执行指令。这些指令将“hello,world\n”字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。信息流向如下图所示。

      主存->寄存器->系统总线->I/O桥->I/O总线->图形适配器->显示器

    image-20201019191644207

    高速缓存

      通过运行hello程序,我们可以知道,指令和数据需要多次在寄存器、主存、磁盘之间来回复制,这些复制其实就是开销,减慢了程序工作的速度。这个时候我们就需要高速缓存存储器(cache memory)来解决这个问题。

    image-20201019195237101

      L1高速缓存的容量可以达到数万字节,访问速度几乎和访问寄存器文件一样快。

      L2高速缓存容量为数十万到数百万字节,通过一条特殊的总线连接到处理器。进程访问L2高速缓存的时间要比访问L1高速缓存的时间长5倍,但是这仍然比访问主存的时间快5~10倍。

      L1和L2高速缓存是用一种叫做 静态随机访问存储器(SRAM) 的硬件技术实现的。

      高速缓存局部性原理:程序具有访问局部区域中的数据和代码的趋势。因此,高速缓存存储器作为暂时的集结区域,存放处理器近期可能会需要的信息

    存储设备的层次结构

      从上至下,设备的访问速度越来越慢、容量越来越大,并且每字节的造价也越来越便宜。寄存器文件在层次结构中位于最顶部,也就是第0级或记为L0。

    image-20201019200335061

      存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。因此,寄存器文件就是L1的高速缓存,L1是L2的高速缓存,L2是L3的高速缓存,L3是主存的高速缓存,而主存又是磁盘的高速缓存。

    操作系统管理硬件

      操作系统是应用程序和硬件之间插入的一层软件。所有应用程序对硬件的操作尝试都必须通过操作系统。

      操作系统有两个基本功能:(1)防止硬件被失控的应用程序滥用;(2)向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。

      操作系统通过几个基本的抽象概念(进程、虛拟内存和文件)来实现这两个功能:文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示

    image-20201019201009252

    进程&线程

      进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。而并发运行,则是说一个进程的指令和另个进程的指令是交错执行的。

      上下文:操作系统保持和跟踪进程运行所需的所有状态信息(PC值,主存的内容等)。

      上下文切换:操作系统通过控制处理器在进程间切换以达到交错执行的目的。

      从一个进程到另一个进程的转换是由操作系统内核( kernel)管理的。内核是操作系统代码常驻主存的部分。内核不是一个独立的进程。相反,它是系统管理全部进程所用代码和数据结构的集合

    image-20201019203213287

    一个进程由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。多线程比多进程更容易共享数据,而且线程间切换所有的开销要远小于进程切换。

    虚拟内存

      虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。

    image-20201019203450101

      上图将虚拟地址空间分为了若干个部分,并用箭头表示该部分的扩展方向。最下端地址为0,向上地址逐渐增长。每个部分作用如下:

       程序代码和数据: 存放可执行程序代码和代码中的全局变量。

      堆: 用于动态申请的内存变量,比如malloc函数申请的动态内存空间,可以向上扩展。

      共享库: 用于存放C语言库函数的代码和数据。本例中即printf的代码和数据。

      栈: 位于虚拟地址空间的顶部,用于函数调用、存放局部变量等。当我们调用一个函数时,栈会向下扩展,返回时,向上收缩。

      内核虚拟内存: 地址空间顶部的区域是为内核保留的。不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。相反,它们必须调用内核来执行这些操作。对于一个64位的操作系统来说,用户空间为0-3G,内核空间为3G-4G。(用户空间和内核空间有何区别,见秋招资料整理中的嵌入式软件工程师笔试面试知识点总结)

    并发&并行

      并行:指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。

    img

      并发:指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行

    img

    多核处理器&多线程

      多核处理器:多核处理器是将多个CPU(称为“核”)集成到一个集成电路芯片上。如下图所示,微处理器芯片有4个CPU核,每个核都有自己的L1和L2高速缓存,其中的L1高速缓存分为两个部分——一个保存最近取到的指令,另一个存放数据。这些核共享更高层次的高速缓存,以及到主存的接口。

    image-20201019212750093

      超线程:超线程,有时称为同时多线程( simultaneous multi-threading),是一项允许一个CPU执行多个控制流的技术。举个例子,Intel Core i7处理器可以让每个核执行两个线程,所以一个4核的系统实际上可以并行地执行8个线程。

      养成习惯,先赞后看!如果觉得写的不错,欢迎一键三连,谢谢!

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/qq_16933601/article/details/109169750

    展开全文
  • 可能很多读者有疑惑,什么是计算机系统?它和操作系统有何不同?我们为什么要深入理解计算机系统,会敲代码是否就足够了? 概括的讲计算机系统是由硬件和系统软件共同组成的,它们通过共同的协作来运行应用程序。而...

    一 章节概述


      什么是计算机系统?它和操作系统有何不同?我们为什么要深入理解计算机系统?概括的讲计算机系统是由硬件和系统软件共同组成的,它们通过共同的协作来运行应用程序。而我们在日常编写程序时使用的文件、内存、进程等概念都是为了程序编写的方便,由实际的计算机系统高度抽象而来。这一章中我们使用 c 语言编写简单的 hello 程序,试图通过跟踪 hello 程序的生命周期来窥探计算机系统的全貌。

    #include <stdio.h>
    
    int main()
    {
    	printf("hello, world\n");
    	return 0;
    }
    






    二 计算机系统漫游


    1. 何为信息


      现在人们常见的计算机大多继承了冯诺依曼结构的灵活性,即指令和数据不加区别的存储在存储器中。实际上在存储器中所有文件都是由 0 或 1 这样的位组成的序列,八个位被组成一个字节。同理在 hello 程序的生命周期之初,其源程序也就是 hello.c 是程序员通过编辑器创建的文本文件,文件由二进制位组成的一个个字节组成,每个字节则通过一张字符表表示成对应的字符。
      大部分计算机都使用 ASCII 表来表示字符,这种方法实际上就是用单个字节大小对应的数值来表示单个字符的。下图中给出 hello.c 程序的 ASCII 码表示。

      hello.c 的表示方法表明了一个思想:系统中所有的信息———磁盘文件、内存中的程序、网络传输的数据都是一串比特表示的。一个同样的字节序列可能表示整数,也可能表示浮点数、字符串或指令。像这样区分不同数据对象类别的唯一方法就是根据读这些数据对象时的上下文,就像程序中的类型声明一样。




    2. 源程序是如何变成可执行文件的


      hello.c 程序是如何从一个由 c 语言编写的文本文件,变成一个真正的可以运行的程序的呢? c 语言是一门由汇编语言抽象而来的高级语言,而汇编语言则同样是由十六进制组成的低级机器语言抽象而来。在计算机发展历史中,程序语言逐渐有晦涩难懂抽象成接近自然语言,经历了 机器语言->汇编语言->高级语言(如C语言),机器语言在计算机中可以直接执行。
      那么将 hello.c 源程序变成一个可以直接运行的程序需要经历与上述恰恰相反的过程,分为四个阶段:预处理、编译、汇编、链接,将 c 语言逐步翻译成汇编语言,再翻译成机器语言。而这四个阶段就构成了一个编译系统。
    下图中展示了 hello.c 的编译过程:

    • 预处理:根据 .c 文本中以 # 开头的命令修改原始 hello.c ,并生成 hello.i 文件。

    • 编译:将 hello.i 翻译成汇编语言代码 hello.s 。

    • 汇编:将汇编语言代码 hello.s 翻译成机器语言指令,打包成一个可重定位目标程序 hello.o 。

    • 链接:将多个 .o 文件链接成可执行文件 hello ,例如 hello.c 中使用了库函数 printf ,而 printf 存在一个名为 printf.o 的目标文件中,链接就是将这些如 hello.o 、printf.o 以 .o 结尾的目标文件合并成可执行文件 hello 。

    上述文件中 hello.c hello.i hello.s 均为文本文件,hello.o hello 为二进制文件。




    3. 处理器如何读并解释内存中的指令


      上文中我们已经获得了可执行文件 hello 。接下来如果要运行它就会通过在 shell 中输入

    linux> ./hello
    hello, world
    

      把它加载到内存中运行,shell 是操作系统中的命令行解释器,它将我们输入的文件名和回车解释为执行 hello 程序。于是 hello 程序将会被加载到内存中去执行,并在执行过程中输出程序中的 “hello, world” ,那么在计算机内程序的执行经历了哪些过程是值得探究的。我们在文章开头提到,计算机系统是由计算机的软硬件共同组成,在这里我们就需要先了解计算机系统的硬件组成。


    3.1 计算机系统的硬件组成

    计算机硬件由总线I/O设备主存处理器四个主要部分组成。

    • 总线:像图中画的一样是贯穿整个系统的电子管道,用于数据和指令在计算机不同组件之间传输和控制。通常总线被设计成传送定长的字符块,即字。在32位机中一个字4个字节(4 * 8 = 32位),在64位机中一个字8个字节 (8 * 8 = 64位)。

    • I/O设备:I/O(input/output)设备,是系统与外部世界的联系通道,鼠标、键
      盘、显示器、一起磁盘都是I/O设备。(我们的 hello 最开始就存放在磁盘上)

    • 主存:主存就是我们常说的运行内存,由一组动态随机存储器(DRAM)组成。在主存中程序运行时变量的数据大小是根据类型变换的。比如在运行 linux 的 x86-64 机器上,short 类型2个字节、int 和 float 类型四个字节,而 long 和 double 则需8个字节。

    • 处理器:中央处理的单元(CPU),是解释或执行存储在主存中指令的引擎。处理器主要由程序计数器PC算术/逻辑单元ALU还有寄存器组成。程序计数器PC也是一个大小一个字的寄存器,在任何时候PC指向主存中的某条机器语言指令。算术/逻辑单元ALU则来实现算术和逻辑的运算。

    处理器的运行过程:

    • 加载:从主存中加载数据到寄存器
    • 存储:从寄存器中复制数据到主存
    • 操作:把两个寄存器的内容复制到ALU做算术运算,将结果存放在一个寄存器中。
    • 跳转:从指令中抽取一个字复制到PC中以覆盖原来内容。


    3.2 hello程序在计算机运行经历的过程


    • 首先我们在shell上通过键盘输入"hello"时,shell将"hello"字符串从I/O设备键盘经由I/O总线逐一读到寄存器中,再把它放到内存。
    • 然后当我们在键盘上敲下回车的时候,shell程序便知道我们已经结束命令的输入。于是shell通过一系列命令将hello目标文件从磁盘中复制到主存。
    • 一旦目标文件被加载到主存,CPU便开始执行hello程序中main函数中的机器语言指令。这些指令将"hello, world\n"字符串从主存中复制到寄存器,在从寄存器复制到I/O显示器,最终显示到屏幕上。




    4. 计算机中存储器的层次结构


      上文中我们已经介绍了 hello 文件在计算机中的执行过程,不难发现一个问题,即系统花了大量的时间把信息从一个地方挪到另一个地方。根据机械原理,容量越大的存储设备往往速度越慢,而主存和磁盘的读写速度则远小于CPU的处理速度。这样就造成了速度的不匹配,使运行 hello 程序时,在传输数据的过程中浪费了很多时间。
      针对这种差异,于是设计者开发了更小更快的存储设备,成为高速缓存存储器(cache memory),并将其放在处理器中直接与寄存器连接,将处理器常用的数据存放在其中,避免了频繁的从主存或磁盘中传输数据。如现在计算机处理器常有L1和L2高速缓存,处理能力更强大的处理器甚至有三级告诉缓存:L1、L2和L3。
      在计算机中,存储器的速度由快到慢,容量由小到大形成了计算机的存储器层次结构:

      存储器层次结构的主要思想是高一层存储器作为低一层存储器的告诉缓存,因此寄存器是L1的缓存,L1是L2的缓存,L2是L3的缓存,L3是主存的缓存,主存是磁盘的缓存,在某些分布式系统中本地磁盘又是其他系统上磁盘的缓存。善于运用这些缓存可以将计算机的速度提升一个量级。




    5. 操作系统对计算机系统使用的抽象


      让我们回到 hello 程序的例子,当shell加载运行hello程序,以及输出显示"hello world",shell和hello程序都没有直接访问主存、磁盘、显示器或键盘。取而代之它们依赖的是操作系统提供的服务,即向应用程序提供的系统调用。

    操作系统有两个基本功能:

    • (1)防止硬件被应用程序滥用。
    • (2)向应用程序提供简单一致的控制复杂又不相同的低级硬件设备的方法。

    而操作系统是通过几个基本抽象概念(进程/线程、虚拟内存、文件)来实现功能的,如图:


    5.1 操作系统提供的抽象:进程


      像 hello 这样的程序在现代计算机上运行容易造成一种假象,就好像系统上只有这一个程序在运行,程序看上去在独占处理器、主存、和I/O设备。处理器看上去·就像在一条接一条的执行程序中的指令,即 该程序的代码和数据是系统内存中唯一的对象。 这些假象是由进程概念实现的,进程概念是计算机科学中最成功和最重要的概念之一。
      实际上一个计算机上执行了多个进程,但是为了看上去是一个CPU在并发的执行多个进程,操作系统的设计者们通过上下文切换这一概念来实现。操作系统会保存正在运行的进程们的状态信息,并且由操作系统的内核管理从多个进程之间来回切换。内核不是一个进程,内核是操作系统代码常驻主存的部分,是系统管理全部进程所用代码和数据结构的集合。


    5.2 操作系统提供的抽象:线程


      在现代计算机上实际上一个进程可以由多个成为线程的执行单元组成,每个线程都运行在进程的上下文中,共享同样的代码和全局数据。因为线程之间比进程之间更容易共享数据,也因为线程一般来说比进程更高效。当有多处理器可用的时候多线程也是一种可以使得程序运行更快的方法。


    5.3 操作系统提供的抽象:虚拟内存


      虚拟内存同样是一个抽象概念,它为每个进程提供了一个假象,即每个进程在独占的使用主存。每个进程看到的内存都是一样的,称为虚拟地址空间。在Linux中,虚拟地址空间的模型如下:

    图中的地址是由下往上增大的,其中

    • 程序代码和数据:代码和数据区从一开始运行时就被指定了大小。对所有进程来说最下面的是从可执行文件中初始化的只读代码和数据,紧接着是全局变量相对应的数据。
    • :代码和数据区后面紧随的是运行时的堆空间,与程序代码和数据区不同,当调用像malloc和free这样的代码时,堆可以在运行时动态的扩展和收缩。
    • 共享库:共享库在地址空间的中间部分,用来存放像C语言的标准库和数学库这样的共享库的代码和数据。
    • :位于用户虚拟地址空间顶部的是用户栈,,编译器用它进行函数的调用。特别的当我们调用一个函数时,栈就会增长;当一个函数返回时,栈就会收缩。
    • 内核虚拟内存:地址空间顶部的区域是为内核保留的。不允许应用程序直接读写这个区域的内容或者调用内核代码定义的函数。


    5.3 操作系统提供的抽象:文件


      文件就是字节序,仅此而已。每个I/O设备:磁盘、键盘、显示器、甚至网络等等,都可以看成文件。文件的概念是简单而精致并且非常强大的,它为应用程序提供了一个统一的视图来看待系统中各种各样的I/O设备。




    6. 网络


      计算机系统漫游至此我们一直把它视为一个孤立的硬件和软件的集合体。实际上现代计算机经常通过网络和其他设备连接到一起。从一个单一的系统来看,网络可以视为一个I/O设备。如图,当系统复制一串字节到网络适配器时,数据流经过网络到达另一台机器,相似的,系统也可以读取从其他机器发来的数据。

      在现代计算机中客户端和服务器之间的交互是很常见的,就像一些连接服务器用的远程客户端,例telnet。我们可以将它连接到服务器并且运行服务器上的 hello 程序。




    7. 重要补充


    7.1 Amdahl定理


      当我们对系统的某个部分加速时,如何度量系统的性能提升呢。S=Told/TnewS=T_{old}/T_{new}是最好的办法,ToldT_{old}为原始系统运行的时间,TnewT_{new}为修改后系统运行的时间。在Amdahl定理中我们假设原始系统的某一部分执行时间与原始系统整体的执行时间之比为α\alpha,而该部分性能提升比例为kk,那么提升后系统的执行时间为
    Tnew=(1α)Told+(αTold)/k=Told[(1α)+α/k] T_{new}=(1-\alpha)T_{old}+(\alpha T_{old})/k=T_{old}[(1-\alpha)+\alpha/k]
    由此可以计算出加速比S=Told/TnewS=T_{old}/T_{new}
    S=1(1α)+α/k S=\frac{1}{(1-\alpha)+\alpha/k}
    我们可以看出,即使kk \to \infty,加速比仍为S=11αS= \frac{1}{1-\alpha},也就是说想要显著加速整个系统,必须提升全系统中相当大部分的速度。


    7.2 并发和并行


      在计算机的发展中始终有两个需求,做更多和运行更快。当处理器能同时做很多事情时这两个因素都会得到改善。术语并发是一个通用的概念,指具有多个活动的系统;而术语并行指的是用并发来使一个系统运行的更快。并行可以用在计算机系统的多个抽象层次,以下按照计算机系统层次的由高到底重点强调三个层次。

    • 线程级并发
      构建在进程这个抽象之上,我们能够设计出同时有多个程序执行的系统,这就导致了并发。在单处理系统时代,这种多线程并发只是模拟出来的,通过计算机在它执行的进程间快速切换来实现的。直到多核超线程技术的出现,使得了程序可以利用硬件实现真正的线程级并发性。多核处理器时代,处理器将多个CPU集成到一个集成电路上;还出现了超线程技术,超线程有时被成为同时多线程,是一个允许CPU执行多个控制流的技术,例如Intel Core i7处理器可以让每个核执行两个线程。传统处理器线程的切换大约需要20 000个时钟周期,而超线程技术通过对CPU某些硬件的备份,例如PC和寄存器,是CPU能够在单个时钟周期的基础上决定执行那个线程。

    • 指令级并行
      在低一些的层次上,现在处理器可以通过同时执行多条指令的属性称为指令级并行。通过流水线技术,将执行每条指令所需的步骤(取值、译码、执行等)根据它们使用的硬件资源不同将多个指令不发生冲突的步骤放到一起并行执行,使得处理器达到接近一个时钟周期执行一条指令的执行速度。如果处理器可以达到比一个周期一条指令更快的执行速率,就称之为超标量处理器。现代大多数处理器都支持超标量操作。

    • 单指令、多数据并行
      在最低的层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行的操作,这种方式被称为单指令、多数据,即SIMD并行。例如,较新几代的Intel和AMD处理器具有并行的对8对单精度浮点数做加法的指令,可以提高影像、声音和视频数据应用的执行速度。


    7.3 计算机系统中抽象的重要性


      抽象的使用是计算机科学中最为重要的概念之一。类如程序语言中面向对象的抽象方法。我们在上文中介绍了计算机系统中使用的几个抽象,如图。在处理器,指令集架构提供了对实际处理器硬件的抽象,使用这个抽象,机器代码好像运行在一个一次执行一条指令的处理器上。在学习操作系统时我们还介绍了三个抽象:文件是对I/O设备的抽象;虚拟内存是对程序存储器的抽象,即对I/O设备和主存的抽象;进程是对一个正在执行的程序的抽象。在此我们在增加一个新的抽象:虚拟机,它提供了对整个计算机的抽象,包括操作系统、处理器、和程序。

    展开全文
  • 计算机系统是由硬件和系统软件组成,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的0和1二进制位,它们依据不同的上下文有不同的解释方式。程序被其他程序编译成不同的形式,开始时是源代码文本,...

    1、计算机系统是什么?

    我们直观的可以看到的计算机系统就是一台电脑,包括主机、显示器、键盘鼠标,然后显示器上会显示不同界面,用鼠标点击,键盘输入界面就会相应操作。

    2、深入一点,他们是如何工作的?

    计算机系统是由硬件和系统软件组成,它们共同工作来运行应用程序。

    3、再深入一点,硬件是什么?系统软件是什么?应用程序是什么?

    硬件是组成计算机系统的基础,大家耳熟能详的就是CPU、内存、硬盘、主板等。

    系统软件是运行在硬件之上的一层控制软件,就是我们经常听到的Windows XP、WIN7、Linux,它们的目的就是管理好各个硬件,屏蔽硬件的差异性,提供一个统一的应用软件工作的平台。

    应用程序是运行在系统软件之上的一层软件,他们受到系统软件的管理,同时也享受系统软件提供的各种资源和功能接口,就是我们经常用的QQ、迅雷等等。

    4、进入正题,计算机工作时的原理,它一直在做着什么样的处理工作?

    计算机工作时一直在处理的是数据,计算机内部能处理的数据只有两种形式,0和1,这是组成计算机硬件的半导体的电气特性。如何让0和1能过表示现实世界的各种信息?那么就需要对他们进行组合和编码。

    CPU的指令是由一组组的0和1编码构成。

    我们在显示器上看到的各种字符和文字也是由0和1的组合编码而成,最终通过一定的方式在显示器上模拟出字符和文字的形状显示出来。

    同样的0和1组成的位数据在不同的地方表示的意义不同,如何区别这样的数据?

    计算机系统中所有的信息、数据——包括磁盘文件、内存中的程序、用户的数据以及网络上传送的数据,都是由一串比特表示,也就是0和1的位。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,同样的字节序列可能表示一个整数、字符串或者机器指令。

    5、程序在不同阶段的表示——由人类易懂的高级语言到机器易懂的低级指令

    高级语言(比如C语言)编写的程序源码能够被人读懂,但是计算机却不懂,为了能让计算机能够知道如何运行程序,就需要把每条C语言程序语句都转化为一系列的低级机器语言指令,然后这些指令按照一种可执行目标程序的格式打包并以文件的形式存储在硬盘上。

    6、执行程序——存放在存储器中的机器能够懂的低级指令被读取、解释、执行

    硬盘上的程序被执行时会首先由操作系统按照一定规则和格式读取并加载到内存中,然后调度并交由CPU执行,运行一个程序的过程非常复杂,它需要系统中不同功能的硬件、软件一起协调工作。

    无论如何整个过程中的数据信息流遵循输入——》输入出的原则,被各个器件处理然后流转。

    7、漫游结束

    计算机系统是由硬件和系统软件组成,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的0和1二进制位,它们依据不同的上下文有不同的解释方式。程序被其他程序编译成不同的形式,开始时是源代码文本,然后被编译器和连接器翻译成二进制可执行文件。

    处理器读取并解释存放在主存里的二进制指令。因为计算机花费了大量的时间在存储器、I/O设备和CPU寄存器之间拷贝数据,所以系统中的存储设备就被按层次排列,CPU寄存器在顶部,接着是多层的硬件高速缓存存储器,DRAM主存储器,DRAM主存储器和磁盘存储器。在层次模型中位于更高层的存储设备比低层的存储设备要快,但是单位存储价格也更高。

    操作系统内核是应用程序和硬件之间的媒介。它提供三个基本的抽象概念,文件是对I/O设备的抽象概念,虚拟存储器是对主存和硬盘的抽象概念,进程是处理器、主存和I/O设备的抽象概念。

    最后网络提供计算机系统之间通信的手段,从某个系统的角度来看,网络就是一种I/O设备。



    展开全文
  • 2.跨平台:java语言编写的代码可以在不同的操作系统运行,即windows、android 、ios、linux等等,也是软件、计算机硬件和软件的桥梁、可以调用硬件资源。 3.纯面向对象:这个就是今天要记录的重点,编程语言...
  • 计算机系统组成

    千次阅读 2008-11-07 21:58:00
    计算机系统组成 一个完整的计算机系统是由硬件系统和软件系统两部分组成的。硬件系统是组成计算机系统的各种物理设备的总称,是计算机系统的物质基础。硬件是计算机的躯体,而软件是灵魂。没有安装软件的计算机称为...
  • 深入理解计算机系统-笔记

    千次阅读 多人点赞 2017-12-14 13:00:43
    计算机系统漫游 程序  程序的生命周期从一个源程序(源文件)开始,即程序员利用编辑器创建并保存的文本文件,如文件名为hello.c的c语言程序。源程序是由0和1组成的位序列,8个位被组织成一组,称为字节。每个...
  • 计算机系统结构样例试卷一、选择题(每小题2分,共20分)1、关于计算机系统结构、计算机组成和计算机实现间的关系说法正确的是( )。A.计算机组成是计算机系统结构的逻辑实现B.一种计算机系统结构只可以有一种...
  • 深入理解计算机系统9个重点笔记

    千次阅读 多人点赞 2014-12-03 21:23:20
    引言深入理解计算机系统,对我来说是部大块头。说实话,我没有从头到尾完完整整的全部看完,而是选择性的看了一些我自认为重要的或感兴趣的章节,也从中获益良多,看清楚了计算机系统的一些本质东西或原理性的内容,...
  • 第一章 计算机系统概论

    千次阅读 2020-05-10 15:56:28
    文章目录计算机的发展与应用计算机发展概况电子管计算机晶体管计算机集成电路计算机超大规模集成电路计算机摩尔定律多核处理器嵌入式计算机计算机系统的组成计算机硬件系统存储器运算器控制器输入设备输出设备系统...
  • 计算机系统常见面试题总结

    千次阅读 2017-03-16 11:23:35
    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程...
  • 深入理解计算机系统(1)

    千次阅读 2018-09-03 22:50:25
    我们一般说的都是相对复杂的计算机系统比如手机、电脑等,这些需要操作系统支持,而程序也需要由操作系统进行调度,程序中的函数的执行也可能需要调用操作系统的函数来实现。操作系统及其以上是搞软件的人所关注的。...
  • 什么是面向对象编程

    万次阅读 多人点赞 2020-01-12 18:57:20
    本文关键字:面向对象、面向过程、面向过程编程语言、面向对象编程语言。说到编程,对于初学者来讲,可能第一想到的就是敲键盘,写代码,做游戏,甚至于会联想到软件破解、网络攻防。另一方面,在学了一些编程的相关...
  • 带你读懂《深入理解计算机系统》开篇

    千次阅读 多人点赞 2019-12-27 16:13:18
    我的计划是2020年用一整年的时间带你读一本书。 有人说一年才读一本书是不是...很多人整天“速读,跳读,扫读”,以为自己多么有效率,其实不然,精度一本好书,远远超过十本速读书,这个在计算机专业书籍更是如此。
  • 计算机病毒运行机制

    千次阅读 2002-02-16 23:30:00
    自从计算机的出现和推广,计算机病毒就像其附属品一样接踵而来。自早期的苹果机和IBM8086家用机以来,计算机的发展速度日新月异。计算机病毒也随之不断的发展,攻击手段也是层出不穷。从早期耳熟能详的黑色星期五到...
  • 计算机常用运行命令

    千次阅读 2007-03-10 22:51:00
    计划在指定时间和日期在计算机运行命令和程序。at 命令只能在“计划”服务运行时使用。如果在没有参数的情况下使用,则 at 列出已计划的命令。 语法 at [//ComputerName] [{[ID] [/delete]|/delete [/yes]}] at [...
  • 1.批处理操作系统:用户脱机使用计算机 成批处理 多道程序运行 - 联机批处理 - 脱机批处理 2.分时操作系统:会话控制 特性:交互性 多用户同时性 独立性 3.实时操作系统:即时响应 高可靠性 - 实时过程控制 - 实时...
  • [精通Objective-C]运行系统

    千次阅读 2016-07-06 17:37:14
    [精通Objective-C]运行系统参考书籍:《精通Objective-C》【美】 Keith Lee目录精通Objective-C运行系统 目录 运行系统概述 对象消息 选择器 方法签名 使用对象消息 动态类型 动态绑定 动态方法决议 动态加载 ...
  • 任何计算机都必须在加载相应的操作系统之后,才能构成一个可以运转的、完整的计算机系统。操作系统的功能是否强大,决定了计算机系统的综合能力;操作系统的性能高低,决定了整个计算机系统的性能;操作系统本身的...
  • 计算机操作系统与生态系统

    千次阅读 2011-10-11 11:04:07
    规律,世界的运转遵循着一定的规则。比如地球围绕着太阳转,月球...我们在计算机给予了节拍的概念,也就是说在计算机运行的时候也在以某个频率运行着操作系统,如在早期的Linux内核中,是以100Hz为节拍的。而随后的内
  • 计算机文化基础—计算机硬件系统

    千次阅读 2017-03-16 17:12:00
    嵌入式计算机系统 计算机应用 2.1 信息工具——计算机 人类所使用的计算工具从简单到复杂、从低级到高级的发展过程中,相继出现了如算盘、计算尺、手摇机械计算机、电动机械计算机等。 1946年2月,世界上第一...
  • [CSAPP笔记][第一章计算机系统漫游]

    千次阅读 2016-05-03 21:04:15
    计算机系统漫游我们通过追踪hello程序的生命周期来开始对系统的学习—–从它被程序员创建,到系统上运行,输出简单的消息,然后终止。我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组成部分...
  • 计算机操作系统

    千次阅读 2018-06-17 06:28:42
    计算机操作系统  作者:任尚益    ...
  • 计算机操作系统核心知识点总结&面试笔试要点

    万次阅读 多人点赞 2019-08-14 22:00:41
    操作系统之基础篇 一、 操作系统概述  1. 操作系统的演进   无操作系统:人工操作,用户独占...  关于多道程序设计:是指在计算机内存中同时存放多个程序,多道程序在计算机的管理程序之下相互穿插运行。  2....
  • 计算机操作系统知识梳理

    千次阅读 多人点赞 2018-04-02 00:28:08
    1、进程和线程以及它们的区别(1)进程是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现操作系统的并发。(2)线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的...
  • 《深入理解计算机系统》读书笔记

    千次阅读 2009-03-05 21:50:00
    《深入理解计算机系统》读书笔记注:《深入理解计算机系统》是我们《系统级编程》课程的参考书。这里主要记载的是在看《深入理解计算机系统》这本书的过程中,遇到的一些以前没有注意到的知识。但是,这本书的稿子是...
  • 读后感  这本书是美国“卡内基-梅隆大学(CMU)”的教科书,逻辑严谨。虽然是教科书,还是有些晦涩难懂啊,不太形象。... 该书确实系统的介绍了计算机,很完善。它能给你以下几个重要级别的模型和过程
  • 计算机网络之电子邮件系统

    万次阅读 2017-11-08 22:27:09
    用户代理(User Agent)就是用户与电子邮件系统的接口,在大多数情况下它就是运行在用户PC机中的一个程序。一般具有撰写、显示、处理、通信等功能。 因特网上有许多邮件服务器可供用户选择,邮件服务器24小时不间断...
  •  ●既然虚拟内存是在磁盘上的,为什么它又运行这么好,并没有感觉卡顿?这要感谢程序的局部性!  ●虚拟存储器的调度是一个操作系统必须做好的事情!不然程序就会慢的跟蜗牛一样。   ●垃圾收集器就是一个动态...
  • 计算机作为一个整体,由软件和硬件两大部分组成, (1)计算机硬件系统。 计算机的硬件系统结构有哈佛结构和冯·诺伊曼结构两种。哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 370,566
精华内容 148,226
关键字:

对象是计算机系统运行的什么