《信息安全系统设计与实现》第一周学习笔记
每个进程都有一个唯一的标识符,称为进程ID(PID)。操作系统使用进程管理来调度进程的执行,分配资源,并提供进程间的通信机制。进程可以处于不同的状态,如就绪、运行、阻塞等,根据调度算法,操作系统会在这些状态之间进行切换。
进程可以执行各种任务,例如运行应用程序、处理用户输入、进行文件操作、进行网络通信等。多进程编程可以提高系统的并发性和响应性,但也需要合理地管理系统资源,以避免过多的进程竞争和资源浪费。
总结来说,进程是计算机中正在运行的程序的实例,它具有独立的内存空间和执行环境,可以包含多个线程,通过进程间通信进行数据交换和协调,操作系统通过进程管理来调度和管理进程的执行。
最有收获的内容:
GCC是一种广泛使用的编译器,它将源代码转换为可执行程序。GCC的编译过程可以分为三个主要步骤:预处理、编译和链接。
预处理(Preprocessing): 在这个步骤中,GCC会对源代码进行预处理。预处理器会执行以下操作:
去除注释:将源代码中的注释(以"//"或"/* */"形式表示)删除,使其不包含在后续的编译过程中。
处理宏定义:将源代码中定义的宏替换为其对应的实际内容。例如,对于#define PI 3.14159,预处理器会将所有出现的PI替换为3.14159。
处理条件编译指令:根据条件编译指令(如#ifdef、#ifndef、#if等)的结果,选择性地包含或排除某些部分的代码。
处理头文件引用:将#include指令所引用的头文件插入到源代码中。预处理器会递归地处理所有引用的头文件,直到所有相关的代码都被包含进来。 预处理的结果是一个经过处理的源文件,其中已经消除了注释、替换了宏定义,并且 所有的头文件都已被包含。
编译(Compilation): 在这个步骤中,GCC将预处理后的源文件转换为汇编代码。编译器会执行以下操作:
词法分析:将源代码分解成多个记号(tokens),如关键字、标识符、运算符等。
语法分析:根据编程语言的语法规则检查记号组成的语法结构,并生成一棵抽象语法树(AST)。
语义分析:检查语法树是否符合语义规则,如变量使用是否正确、函数调用是否匹配等。
优化:对生成的中间表示进行优化,以提高可执行程序的效率。
生成汇编代码:将优化后的中间表示翻译成目标机器的汇编代码。
链接(Linking): 在这个步骤中,GCC将编译阶段生成的汇编代码和库链接到一起,生成最终的可执行程序。链接器会执行以下操作:
符号解析:将引用的函数和变量与其定义进行匹配。如果某个符号在当前文件中找不到定义,链接器会在其他目标文件或库中查找。
地址重定位:根据实际的内存地址,修改汇编代码中的地址引用,以便正确地访问函数和全局变量。
符号表生成:生成一个包含所有符号及其地址信息的符号表,以供其他程序使用。
最终,链接器将所有模块组合在一起,生成可执行文件(或共享库),该文件可以在相应的操作系统上运行。
这是我对gpt的苏格拉底提问。
2、程序的执行过程。
程序的执行过程可以分为编译阶段和运行阶段两个主要步骤。
编译阶段:
预处理:源代码会首先经过预处理器进行处理,包括宏替换、条件编译等操作。
编译:经过预处理后的代码会被编译器翻译成汇编语言或机器语言的形式,生成目标文件。编译过程中会进行词法分析、语法分析、语义分析、优化等操作。
汇编:目标文件会经过汇编器将其转换成机器语言指令的形式,生成可重定位目标文件(例如ELF格式)。
链接:如果程序依赖于其他目标文件或库文件,链接器会将所有相关的目标文件和库文件进行链接,生成可执行文件。链接过程包括地址分配、符号解析、重定位等操作。最终得到可以在特定平台上运行的可执行文件。
运行阶段:
加载:操作系统会将可执行文件加载到内存中,并分配必要的资源。
执行:CPU从程序的入口点开始执行指令,按照指令的顺序逐步执行。
运行时库:程序在运行过程中可能会使用到一些系统提供的库函数,这些函数由运行时库提供支持。
终止:程序执行完成后,操作系统会回收相关资源,并将控制权返回给用户。
需要注意的是,不同的编程语言和运行环境可能有所不同,但一般遵循上述的编译和执行过程。此外,有些编程语言还可以进行解释执行,即在运行阶段逐行解释执行源代码,而不需要先进行编译生成可执行文件。
总之,程序的执行过程涵盖了从源代码到可执行文件再到实际运行的多个步骤,每个步骤都有特定的任务和操作,最终实现了程序的执行。
苏格拉底提问:
实践过程:
虚拟机在大一时已经安装过,就不再安装。
安装emacs的过程:
检验emacs的版本:
emacs的创建文件的询问过程:
创建一个新的用户名:
ls的使用方法: