- 操作系统是什么类型的呢,一般都是多任务的操作系统
- 装入前要先编译和链接
- 编译就是由编译程序将源代码编译成若干目标模块
- 编译又有预编译咯
主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下
1、删除所有的#define,展开所有的宏定义。
2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
4、删除所有的注释,“//”和“/**/”。
5、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。
6、添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。
- 之后就是是编译原理相关的词法分析,语法分析,语义分析,代码优化,目标代码生成
- 之后就是汇编咯,C或者C++才有汇编代码,汇编就是将语句变成一条一条的指令
- 编译又有预编译咯
- 链接就是将目标模块和它所需要的库函数链接起来形成完整的装入模块,链接有什么方式呢
- 静态链接就是在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完 整的装配模块,以后不再拆开
- 装入时动态链接就是将用户源程序编译后所得到的一组目标模块,在装入内存 时,采用边装入边链接的链接方式
- 运行时动态链接指对某些目标模块的链接,是在程序执行中需要该(目标)模 块时,才对它进行的链接
- 编译就是由编译程序将源代码编译成若干目标模块
- 然后要将装入模块装入内存,装入是什么,都有什么装入方式呢
- 绝对装入方式、可重定位 装入方式和动态运行时装入方式
- 绝对装入就是程序代码指定在内存什么位置就在什么位置,逻辑地址和物理地址相同,一旦地址修改,都要变,只适合单道程序系统
- 可重定位装入就是只需要给定逻辑地址,系统会自动将你的地址重定位,在这一次运行中,都是将逻辑地址与本次的基地址拼接
- 动态运行时装入就是可以在程序运行时改变程序在内存中的地址,并不立即把装入模块中的相对地址 转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行
- 装入就是给装入模块分配内存,那么分配内存又有哪些方式呢?
- 单一连续分配:适用于单用户,单任务的操作系统
- 固定分区分配:把内存进行分区,分区大小可以是均匀的,也可以是不均匀的,但是确定了都是不可以变了
- 动态分区分配:分区可以动态改变
- 既然大多都用动态分区分配,那么分配的算法有哪些呢?
- 首次自适应算法
- 循环首次自适应算法
- 最佳适应算法
- 最坏适应算法
- 快速适应算法
- 绝对装入方式、可重定位 装入方式和动态运行时装入方式
- 分配了内存之后,我们就可以开始程序的运行了,这里又有很多细节了
- 一个程序的运行空间分为哪些区域?
- 静态静态区:静态变量,全局变量,局部静态变量
- 动态数据区:堆(动态分配的,地址由低到高),栈(参数,环境变量,地址由高到低,较小)
- 代码区:代码区
- 运行之后,可能涉及到进程,线程调度
- 进程涉及多进程编程,可以利用多cpu
- 进程是独立拥有系统资源的基本单位
- 线程涉及内核级线程,用户级线程,和结合使用的系统
- 内核级线程的系统中独立调度的基本单位是线程,可以利用多cpu
- 用户级线程的系统中独立调度的基本单位是进程,无法利用多cpu
- Solaris系统实现了两者的结合,有个LWP用来将用户级线程与内核级线程绑定
- 进程涉及多进程编程,可以利用多cpu
- 当进程涉及到网络通信时
- 网络通信应用一般是IO频繁型,那么IO有哪些类型呢
- 阻塞型IO:发生阻塞的时候会等待
- 非阻塞型IO:发生阻塞的时候不等待,完成时发送信号
- 异步IO:
- IO复用:select,poll,epoll
- 网络通信应用一般是IO频繁型,那么IO有哪些类型呢
- 协程
- 在单线程里面运行,在python里面通过生成器,yield from 和send实现
- 多进程+协程能够极大提高系统效率
- 虚拟内存机制
- 逻辑地址转换为物理地址
- 通过页式存储,段式存储,会发生缺页中断,有二级页表,三级页表,四级页表
- 段式存储比较符合程序逻辑,是按照进程来划分的
- 逻辑地址转换为物理地址
- 一个程序的运行空间分为哪些区域?
- 分配了内存之后呢要怎么合并剩下的分区呢,又要怎么回收内存呢?
- 回收区与插入点的前一个空闲分区 F1相邻接,见图 4-8(a)。此时应将回收区与插入 点的前一分区合并,不必为回收分区分配新表项,而只需修改其前一分区 F1的大小。
- 回收分区与插入点的后一空闲分区 F2相邻接,见图 4-8(b)。此时也可将两分区合并, 形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和。
- 回收区同时与插入点的前、后两个分区邻接,见图 4-8(c)。此时将三个分区合并, 使用 F1的表项和 F1的首址,取消 F2的表项,大小为三者之和。
- 回收区既不与 F1邻接,又不与 F2邻接。这时应为回收区单独建立一新表项,填写 回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。