操作系统学习笔记随笔

原创 2016年08月29日 15:39:38

进程的三个基本状态就绪、执行、阻塞

 

同步机制遵循的规则:

1)      空闲让进;如果没人用,我现在要用,应该让我用

2)      忙则等待;如果有人在用,我应该等待

3)      有限等待;我不能一直等待

4)      让权等待。我等待的时候,应该释放 CPU


进程和线程

1.      程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行过程,属于动态概念。

2.      为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上:

A.     进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。

B.      进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行

例如:我现在和面试官面试,看成一个进程,因为很想进入这个公司,我要用耳朵听面试官讲话、手上要记笔记、脑子还要思考问题,回答问题等。如果只提供进程机制的话,这些事就不能同时进行,同一个时间只能做一件事情,这是其一;此外,如果面试官让我介绍进程和线程,我由于紧张卡壳了,阻塞住了,此时,面试官也不能中断我,问其他问题,这就是另一种情况。

3.      线程的优点

提高进程的并发度,线程还有个好处,就是可以有效地利用多处理器和多核计算机。现在的处理器有个趋势就是朝着多核方向发展,在没有线程之前,多核并不能让一个进程的执行速度提高,原因还是上面所有的两点限制。但如果讲一个进程分解为若干个线程,则可以让不同的线程运行在不同的核上,从而提高了进程的执行速度。

例如我们经常使用微软的 Word 进行文字排版,实际上就打开了多个线程。这些线程一个负责显示,一个接受键盘的输入,一个进行存盘等等。这些线程一起运行,让我们感觉到我们输入和屏幕显示同时发生,而不是输入一些字符,过一段时间才能看到显示出来。在我们不经意间,还进行了自动存盘操作。这就是线程给我们带来的方便之处。

4.      进程与线程的区别

A.       进程是系统进行资源分配和调度的一个独立单位。(系统进行资源分配的时候是以进程为单位的)

B.       线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

C.       一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

进程和线程的主要差别在于它们是不同的操作系统资源管理方式进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

 

进程的虚拟内存大小并不受物理内存大小的限制,例32位处理器虚拟内存空间可能是 4G,但物理内存实际是小于 4G 的,部分地址空间分配给了 ROM、外设等。

1). 虚存的大小  ≤ 内存容量和外存容量之和。

2). 虚存的大小 ≤ 计算机的地址位数能容纳的最大容量。

 

用户进程间通信主要哪几种方式?

(1)管道(Pipe:管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。

(2)命名管道(named pipe:命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名,文件的内容在内存中。命名管道通过命令mkfifo或系统调用mkfifo来创建。

(3)信号(Signal信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux 除了支持 Unix 早期信号语义函数 sigal 外,还支持语义符合 Posix.1 标准的信号函数sigaction(实际上,该函数是基于 BSD 的,BSD为了实现可靠信号机制,又能够统一对外接口,用 sigaction 函数重新实现了 signal 函数)。

(4)消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺

(5)共享内存使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

(6)信号量(semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。也称记录锁定。

(7)套接字(Socket:更为一般的进程间通信机制,可用于不同机器之间的进程间通信

 

进程调度

非抢占方式先来先服务

抢占方式A. 优先权原则B. 短作业(进程)优先原则C.时间片原则

 

多级反馈队列调度算法:


1)     每个新进程都从第一个队列进去;

2)     每个队列都是FCFS(先来先服务)原则;

3)     队列从上到下优先级逐个降低;

4)     每个队列进程也按照时间片执行,优先级越低的队列,进程执行的时间片越长;

5)     只有前面的队列空闲的时候才会调度后面的队列。

 

死锁

产生死锁的原因A.竞争资源B.进程间推进顺序非法

产生死锁的必要条件A.互斥条件B.请求和保持条件C.不剥夺条件D.环路等待条件

预防死锁A.摒弃请求和保持条件B.摒弃不剥夺条件C.摒弃环路等待条件

                     只要破坏死锁产生的四个条件中的一个,死锁就不会出现。(互斥条件无法破坏

避免死锁银行家算法。Dijkstra提出来的。该算法需要计算申请者对资源的最大需求,如果系统现存的各类资源可以满足申请者的请求,就满足申请者的请求。这样申请者就能很快的完成计算,然后释放它占用的资源,从而保证系统中所有进程都能完成,从而避免死锁的发生。

 

内存管理

1.      连续分配

1)     单一连续分配(适用于单用户单任务的操作系统)

2)     固定分区分配(最简单的一种可运行多道程序的存储管理方式)

将内存用户空间划分为若干固定大小的区域,每个分区只装入一道作业。划分分区方法两种:分区大小相等、分区大小不等。

3)     动态分区分配

常用的数据结构有两种:

A.    空闲分区表:记录每个空闲分区(分区号、分区始址、分区大小)

B.     空闲分区链:将所有空闲分区连接成一个双向链

分区分配算法:

A.    首次适应算法(FF):分配时,从链首开始查找,直至找到一个大小能满足要求的空闲分区为止,然后按照作业的大小从该分区划出一块内存空间分配给请求者,余下的空闲区仍留在空闲链中。

B.     循环首次适应算法由FF演变而来,但是不是每次都从链首开始,而是从上次找到的空闲分区的下一个空闲分区开 始。

C.     最佳适应算法:将所有的空闲分区按照容量大小的排序的顺序形成一个空闲分区链,每次从链首开始查找直至找到一个满足大小的。

D.    最坏适应算法:不用排序,每次找一个最大空闲,按照作业的大小分割出来。

E.     快速适应算法(分类搜索法):将空闲分区按照容量大小分类,对每一类具有相同大小的所有空闲分区,单独设立一个空闲分区链表。分配时,找到适合的大小后,不会分割。

回收内存时:相邻的合并,不相邻的链接。

4)     伙伴系统:无论是已分配或是空闲分区,其大小均为2的k次幂。

5)     动态重定位分区分配:与动态分区算法基本一样,只是加入了紧凑的功能,即在找不到足够大的空闲分区满足用户作业大小时,进行紧凑,紧凑后,很多程序变了位置,所以加入了地址变换机构。

2.      基本分页存储管理方式

把内存空间分成若干大小的页,进程的逻辑地址空间也是分成若干个页。每个进程对应一个页表,存放在其 PCB 中。每个页表项存储的是页号和块号,记录了相应页在内存中对应的物理块号。

3.      基本分段存储管理方式

作业的地址被划分为若干段(例如,主程序段 MAIN,子程序段 X,数据段 D 及栈段 S 等),各段的长度可能不等。每个进程有一个段表,每个段表项存储的是段长和基址(记录该段在内存中起始地址)。

4.      段页式存储管理方式

先将用户程序分段、再把每个段分成若干页,并为每个段赋予一个段名。

地址的结构:段号 段内页号 页内地址

 

快表:用来存放当前访问最频繁的少数活动页面的页号

 

页面置换算法

1  最佳置换算法(一种理论上的方法,具有最好性能):总是选择淘汰那些以后最长时间不用的。

2  先进先出(FIFO)页面置换算法

3  最近最久未使用(LRU)置换算法

4  Clock置换算法

LRU 算法需要较多硬件支持,Clock 算法是一种 LRU 近似算法。

Clock 算法为每页设置一位访问位,当某个页面被访问,其访问位置 1。当要选择页面淘汰时,检查访问位,若为 0 则置换,若为1,则将其置为 0,暂不置换,安装 FIFO 算法检查下一位,如果到最后还没找到,回到第一个继续。

改进的clock算法

        相比 clock 算法,除了考虑页面的使用情况,还考虑置换代价。由访问位 A修改位 M 组成:

a.      (A=0,M=0):该页最近未被访问且未被修改,最佳淘汰页;

b.      (A=0;M=1):该页最近未被访问,但已被修改,不是很好的淘汰页;

c.      (A=1,M=0):该页最近被访问,但未被修改,可能再次被访问;

d.      (A=1,M=1):该页最近被访问且被修改,可能再次被访问。

 

高速缓冲存储器(Cache:位于 CPU 和内存之间的临时存储器,容量比内存小但交换速度快。在 Cache 中的数据是内存中的一小部分,但是这一小部分是短时间内 CPU 即将访问的。

版权声明:本文为博主原创文章,转载请注明出处!

相关文章推荐

数据结构【树】 学习笔记随笔

二叉树, B-树, B+树, B*树

【Android开发学习笔记】【高级】【随笔】插件化——Activity生命周期

前言   如同第一章我们说的,宿主程序通过 dexclassloader 将插件的类加载进来,然后通过反射去调用它的方法,这样Activity就被当成了一个普通的类来执行了,因此系统不再接管它的...

Spark源码学习笔记(随笔)-groupByKey()是宽依赖吗

最近从源码角度温习之前学的Spark的基础,在RDD的Dependency这一节中,关于一些Transition操作是Narrow Dependency还是Shuffle Dependency。对于m...

【Android开发学习笔记】【高级】【随笔】插件化——资源加载

前言   上一节我们针对插件最基本的原理进行了一个简单的demo实现,但是由于插件的Context对象被宿主所接管,因此无法加载插件程序的资源。那么如何解决这个问题捏?   有人提出这样的方案...

汇编语言学习笔记(随笔记) 端口

端口就是一些芯片的存储器,这些芯片有各种接口卡(网卡,显卡)、主板上的芯片接口(CPU可以通过这些芯片对我们连接的外部设备进行访问)、用来存储相关的系统信息的一些芯片,如CMOS,或者是一些进行输入输...
  • qungxue
  • qungxue
  • 2011年04月28日 11:14
  • 1274

jqGrid 学习笔记--数据异步加载方法 随笔1

var commonQuery = '../importantInfoReport/pageQueryImportantInfoReport.action?type=0'; jQuery("#li...
  • jpr1990
  • jpr1990
  • 2011年12月16日 15:28
  • 2406

[Java]学习笔记,随笔【六】

包的命名: 公司网站.项目名称.功能模块.子功能模块………… 类的命名:首字母大写 字段,方法以及对象首字母小写,中间单词首字母大写, 例 int myCardNo = 0; 常量命名用大写,...

2015年8月5日 随笔日记(该文为原创学习笔记有错误请多指教,谢谢)

2015年8月5日 多云间晴 有雨 第一次写东西,原创,请大家多多支持和指正,谢谢 今天想写的三件事,第一、学习了 tomcat配置,包括虚了目录配置、虚拟主机配置(域名配置)、默认站点配置、默认主...
  • madlad
  • madlad
  • 2015年08月05日 22:42
  • 192

C/C++ 学习笔记:全局变量随笔

全局变量的优缺点: 1)      全局变量过多会占用更多的内存(因为其生命期长) 2)      提高了耦合性,牵一发而动全身,时间久了,代码长了,就不知道全局变量被哪些函数改过。 3)      ...

[Java]学习笔记,随笔【八】

构造方法:方法名和类名必须相同,没有返回类型,即使返回void也不可以。 例:public class Teacher{ private String name; public ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:操作系统学习笔记随笔
举报原因:
原因补充:

(最多只允许输入30个字)