操作系统笔记(1)
来源:互联网 发布:网络文明调查问卷 编辑:程序博客网 时间:2024/06/09 22:19
1. 操作系统的功能
内存管理功能,处理机调度功能,设备管理功能,文件管理功能。
2. 核心模式
核心模式指的是操作系统管理程序运行的状态,具有比较高的特权级别。
用户模式指的是一般用户程序运行时的状态,具有比较低的特权级别。
模式转换的唯一途径是中断。
3. 系统调用的工作机制
用户在执行特权指令时,调用系统调用,陷入内核(在陷入内核时,会同时向OS内核传入一个系统调用号i)进入内核后,根据i查找系统调用表,找到调用号为i的系统调用的处理代码。 内核执行完系统调用处理代码后,从核心态返回用户态。
4. 进程和程序
(1)进程是程序在处理器上的一次执行过程是一个动态概念,程序是代码的有序集合,是静态的。
(2)进程由程序,数据和进程控制块组成,程序只是代码的有序集合。
(3)二者是多对多的关系。
5.并发和并行
并发:concurent 并发在微观上不是同时执行的,只是把时间划分成很多段,使多个进程交替的执行。因此在多个进程存在资源冲突时,并发本质上并没有提高执行效率。
并行:parallel 并行指的是不论微观和宏观,二者都是一起执行。
6.线程
线程是轻量级进程,是CPU调度的基本单位。它包含一个线程ID,一个程序计数器,一个寄存器组,一个堆栈。它与同一个进程的其他线程共享代码段,数据段。每个线程有自己的寄存器和堆栈。
7.CPU调度准则
先来先服务原则(FCFS)
短作业优先(SJF)/最短剩余时间优先
时间片轮转调度(RR)
多级队列调度算法
多级反馈队列调度算法
8.死锁产生的必要条件
(1)互斥(至少有一个资源是非共享的)
(2)持有并等待
(3)不可抢占
(4)循环等待条件
处理死锁 的方法:
(1)死锁预防/避免
(2)死锁恢复
(3)忽视死锁
9.分段,分页
(1)页面是信息的物理单位,分页是为了实现非连续的内存分配,以便解决内存碎片问题,分页是由于系统管理的需要。段是信息的逻辑单位,它含有一组意义相对完整的信息,分段的目的是为了更好的实现共享,满足用户需求。
(2)页面的大小固定且有系统确定,将逻辑地址划分为页号和页内地址是由机器硬件决定的。而段的长度不固定,它取决于用户编写的程序。通常由编译程序在对源程序编译时根据信息划分。
(3)分页 一维 分段 二维。
10.内存页面置换算法
(1)最佳页面置换算法 未来最长时间不被访问到。
(2)先进先出页面置换算法(FIFO)。
(3)最近最久未用置换算法(LRU)。
11.磁盘调度算法
(1)FCFS 根据进程访问磁盘的先后次序调度。
(2)SCAN 磁头不停地往复运动,由边缘至中心然后返回。
(3)CSCAN SCAN基础上规定磁头单想扫描。
12.进程和线程区别
(1)一个进程可以包含多个线程,它们共享进程的拥有的资源。
(2)进程是资源分配的基本单位,线程作为独立调度的基本单位。
(一个进程之间的线程共享代码,数据段,堆,打开的文件,每个线程有自己的寄存器栈,程序计数器。)
(3)通信的区别:进程之间通过IPC通信(共享内存,消息传递,队列,邮箱),线程之间直接读写进程的数据段。
(4)线程的上下文切换比进程快。
13.使用多进程和多线程区别
(1)多进程有自己的地址空间,多线程则共享地址空间。
(2)多线程更快,资源利用率更高。
(3)线程使用公共变量要考虑同步问题,因为它们在同一地址空间。
14.多线程同步机制
Linux下创建线程 pthread_create(id,NULL,thread_function,NULL)
(1) 临界区
(2) 互斥量(不仅可以用在同一应用程序不同线程之间实现资源的安全共享,也可以在不同应用程序的线程中实现对资源的安全共享。)
(3) 信号量(允许多个线程使用共享资源,但是限制了同一时刻访问此资源的最大线程数。)
(4) 事件用来通知有一些事件已经发生,从而启动后继任务。
互斥量和临界区的作用类似,但是互斥量是跨进程的。互斥量开销大。
15.进程间通信的方式:
(1) 共享内存
(2) 管道 用于进程通信的特殊文件,匿名管道用于本地系统中父进程和它启动的子进程之间通信。命名管道使客户端和服务器程序可以通过它通信。
(3) 信号量
(4) 共享文件
(5) 消息机制(windows操作系统的一种驱动机制,利用消息进行进程通信,是用消息激活某种操作的过程,数据发送,数据接收。)
16.程序活动记录
32位系统之中,系统的内存虚拟地址范围为4GB,其中低2GB为应用程序使用(RING3级别),而高2GB为系统内核使用(RING0级别)。
每一个程序都有属于自己的一个私有2GB虚存空间。
0x00000000 到 0x0000ffff 64KB为NULL地址区
0x0000ffff 到 0x7ffff0000 进程空间
0x7ffff0000 到 0x7ffffffff 64KB非法区域 (分割进程空间和内核空间)
0x7ffffffff到0xffffffff 内核空间
程序执行时,传递给CPU的地址是逻辑地址,它由两部分组成,一部分是段选择符,另一部分是有效地址(偏移量)。逻辑地址必须经过映射转换变成线性地址,线性地址再经过一次映射转为物理地址,才能真正访问物理内存。
(1)
逻辑地址转化为线性地址
逻辑地址以 段寄存器:偏移地址形式存在,从段描述符表里找到段基址,然后用基址加入段内偏移量,就得到相应的线性地址。
(2)
线性地址转化为物理地址
线性地址分为3部分:页目录索引,页表索引,字节偏移索引。
17.进程空间的程序布局
从内存地址由低到高:
全局变量区:存放程序中的全局变量。
静态常量数据区。
代码区: 用于存放程序中的可执行代码。
变量: 存放程序的局部变量。
堆: 用来动态分配程序内存。
空闲区: 程序未使用的内存部分。
栈: 程序自己的私有栈,增长方向从高到低。
18.堆栈区别
(1) 内存区别
堆:由程序员负责申请和释放。
栈:由系统自动分配和释放 。(存放函数的参数值,局部变量的值)
(2) 资源分配的具体体现上
堆:堆的分配是通过操作系统的一个记录空闲内存地址的链表来实现的,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该空闲结点从链表中删除。
栈:每个进程都拥有自己的一个固定连续的栈空间。在系统分配时,只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常栈溢出。
(3) 大小限制
堆:堆的大小受限于计算机系统中有效的虚拟内存,堆获得空间比较灵活,也比较大。(向低地址扩展)
栈:向高地址扩展,栈的大小是固定的,且是有限的。
(4) 效率
堆分配较慢,且容易产生碎片。
栈分配较快。
(5) 存放内容
堆:在堆的头部用一个字节存放堆的大小,剩余部分由程序员决定。
栈: 栈用来记录程序执行时函数调用过程中的活动记录(栈帧)。
tips:
函数调用时首先入栈的是参数(大多数C编译器中,参数由右往左入栈),
然后是返回地址,
然后是老的ebp寄存器中的,
最后是分配函数中的局部变量。(静态变量存储在静态存储区,所以不入栈)
19.函数调用规约
(1)当参数多余一个时,按照什么顺序把参数压入堆栈。
(2)函数调用后,由谁把堆栈恢复原态。
stdcall
参数从右往左入栈,由被调用函数自身修改堆栈。
cdecl C调用规约
参数从右往左入栈,调用者还原堆栈。
fastcall
函数的第一个和第二个参数通过ecx和edx传递,剩余参数从右到左入栈。被调用者修改堆栈.
- 操作系统笔记(1)
- 计算机操作系统笔记(1)--操作系统引论
- 操作系统复习笔记(1)
- 操作系统学习笔记(1)
- Chapter 1 操作系统概述 上(现代操作系统笔记)
- Chapter 1 操作系统概述 下(现代操作系统笔记)
- DOS操作系统学习笔记(1)
- uCOSII操作系统学习笔记(1)
- 操作系统学习笔记(1)
- 操作系统学习笔记[1]
- 操作系统学习笔记1
- 操作系统学习笔记1
- 现代操作系统笔记 1
- 操作系统 学习笔记1
- 操作系统笔记(一)
- 操作系统笔记(一)
- 操作系统笔记(一)
- 操作系统(笔记)
- JS直接访问数据 -SQLite
- Python解析json数据结构范例
- mysql replication 优化
- 关于asp.net服务器控件的格式化操作:Dropdownlist
- 如何远程连接服务器(转)
- 操作系统笔记(1)
- UITabBarController 隐藏标签栏
- Spring声明式事务管理、Spring整合Hibernate
- svn生成patch和打(导入)patch文件的方法
- 在Android的状态栏(statusbar)中增加menu,home和back快捷键的方法
- coro学习-击鼓传花
- FPGA 使用Active-HDL仿真时出现Cannot access SLP signal `/clk'. Use switch +access +r for this region.
- #pragma 编译器指令 转自百度
- 驱动工程师必备脚本