操作系统复习

本文详细介绍了操作系统的基础知识,包括进程与线程的区别、通信方式,虚拟地址空间的优势,以及操作系统中的并发、并行、调度算法等。还探讨了进程调度的非抢占式和抢占式策略,以及死锁的概念和产生条件。此外,提到了程序从开始运行到结束的完整过程以及用户态到内核态的切换方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程与线程的概念,区别,联系

基本概念:

进程是运行时程序的封装,
是系统进行资源调度和分配的基本单位,
实现了操作系统的并发。
线程是进程的子任务,
是CPU调度和分配的基本单位,
用于保证程序的实时性,
实现进程的内部并发;
线程是操作系统可识别的最小执行和调度单位。

区别:

1)线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
2)一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
3)进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;
4)调度和切换:线程上下文切换比进程上下文切换要快得多。

通信方式:
进程间通信主要包括

管道、
系统IPC(包括消息队列、信号量、信号、共享内存等)、
以及套接字socket。
管道
1)半双工的(单向),具有固定读写方向
2)只能用于亲缘关系的进程之间的通信
3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
消息队列
消息队列,是消息的链接表,存放在内核中。
一个消息队列由一个标识符(即队列ID)来标记。
具有写权限的进程可以按照一定的规则向消息队列中添加新信息;
对消息队列有读权限的进程则可以从消息队列中读取信息。
特点:
1)面向记录,具有特定格式及特定优先级
2)独立于通信进程,通信进程结束,消息队列中的信息并不删除
3) 实现消息的随机存取
信号量 semahpore
特点:
1·)用于进程间同步
2)基于的系统的PV操作
3)对信号量的PV操作不仅限于对信号量值加1减1,可以加减任意正整数
4)支持信号量组
信号
特点:复杂,用于通知接收某个事件已经发生。
共享内存:
使得多个进程可以访问同一块内存空间,
不同进程可以看见对方进程中对共享内存数据的更新。
特点:
1)共享内存是最快的一种IPC
2)因为多个进程需要同时操作,所以需要同步
3)信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问
套接字SOCKET:
用于不同主机间的进程通信

线程间的通信

临界区:通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
互斥量:采用互斥对象的线程才有访问公共资源的权限。
信号量:允许多个线程在同一时刻去访问同一个资源,一般需要限制同一时刻访问此资源的最大线程数目。
事件:通过通知的方式来保证多线程同步,还可以方便的实现多线程优先级比较操作。

虚拟地址空间

为了防止不同进程同一时刻在物理内存中运行对物理内存的争夺,采用虚拟内存。
虚拟内存技术使得不同进程在运行过程中,它看到的是自己独自占有了当前系统的内存。所有的进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。

虚拟内存的好处

1)扩大地址空间
2)内存保护:每个进程运行在各自的虚拟地址内存空间,互相不能干扰对方。虚存还对特定的内存地址进行保护,可以防止代码或数据被恶意篡改。
3)公平内存分配。
4)当进程通信时可以采用虚存共享的方式时实现。
5)节省内存。比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存
6)适合多道程序设计。
7)在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片
代价:
1)建立额外数据结构,浪费空间。
2)虚拟地址到物理地址的转换,增加指令执行时间
3)页面置换需要磁盘IO操作,浪费时间
4)如果一页中只有一部分数据,会浪费内存。

程序的内存结构

在这里插入图片描述
c语言中,内存分为四个部分:
1.堆,可以由程序员使用malloc函数进行申请以及使用free函数进行释放。
2.栈,主要存放程序中定义的局部变量,定义一个局部变量就由系统自动分配一定的栈给这个局部变量使用,若局部变量在定义时没有初始化,它的初值是一个不确定的数,因为栈是系统反复使用但是没有清理的,每次定义一个变量它使用的栈也必然是不干净的,所以若赋没有初值,它的初值就是一个不确定的数。
3.代码段,主要存放代码的一个区域。
4.数据段,是放置初始化的全局变量和以及static修饰的变量。
5.bss段,一般这个段在系统初始化时每次都会对这个段清0,所以没有初始化的全局变量就是放在此处,默认为0。

操作系统缺页中断

缺页中断:请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当访问的页面不在内存中时,会产生缺页中断,这时操作系统会根据页表中的外存地址在外存中找到所缺的一页调入内存中。
中断处理步骤:
1.保护CPU现场
2.分析中断原因
3.转入相应(缺页)中断处理程序进行处理
4.恢复CPU现场,继续执行。
缺页中断与一般中断的不同:
1.在指令执行期间产生和处理缺页中断信号
2.在一条指令执行期间,可能产生多次缺页中断
3.缺页中断返回的是,执行产生中断的一条指令,而一般的中断返回是执行下一条指令

页面置换算法

操作系统将内存按照页面进行管理,在需要的时候才把进程相应的部分调入内存。当产生缺页中断时,需要选择一个页面写入。如果要换出的页面在内存中被修改过,变成了“脏”页面,那就需要先写会到磁盘。页面置换算法,就是要选出最合适的一个页面,使得置换的效率最高。页面置换算法有很多,简单介绍几个,重点介绍比较重要的LRU及其实现算法。
1)最优页面置换算法
最理想的状态下,我们给页面做个标记,挑选一个最远才会被再次用到的页面调出。当然,这样的算法不可能实现,因为不确定一个页面在何时会被用到。
2)先进先出
这种算法的思想和队列是一样的,该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予淘汰。实现:把一个进程已调入内存的页面按先后次序链接成一个队列,并且设置一个指针总是指向最老的页面。缺点:对于有些经常被访问的页面如含有全局变量、常用函数、例程等的页面,不能保证这些不被淘汰。
3最近最少使用
根据页面调入内存后的使用情况做出决策。LRU置换算法是选择最近最久未使用的页面进行淘汰。

并发(concurrency)和并行(parallelism)

并发:指宏观上看起来两个程序同时运行,但是从微观上看两个程序的指令是交织着运行的,你的指令之间穿插着我的指令,我的指令之间穿插着你的,在单个周期内只运行了一个指令。这种并发并不能提高计算机的性能,只能提高效率。
并行:指严格物理意义上的同时运行,比如多核cpu,两个程序分别运行在两个核上,两者之间互不影响,单个周期内每个程序都运行了自己的指令,也就是运行了两条指令。这样说来并行的确提高了计算机的效率。所以现在的cpu都是往多核方面发展。

进程调度

调度种类

高级调度:作业调整,它决定把后备作业调入内存运行
中级调度:在虚拟存储器中引入,在内、外对换区进行对换
低级调度:进程调度,它决定把就绪队列的某进程获得CPU

非抢占式调度与抢占式调度
调度算法

FIFO(FCFS)
SJF 最短作业优先
SRJF SJF的课抢占版本
优先级调度算法 优先级高的优先
RR 轮转调度算法

死锁

如果一组进程中的每一个进程都在等待仅由该组进程才能引发的事件,那么该组进程就是死锁的。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。
产生的4个必要条件:
1)互斥条件
2)请求和保持条件
3)非抢占条件
4)循环等待条件

一个程序从开始运行到结束的完整过程

1)预处理
2)编译
3)汇编
4)链接

用户态切换到内核态的方式如下:

1)系统调用:程序的执行一般是在用户态下执行的,但当程序需要使用操作系统提供的服务时,比如说打开某一设备、创建文件、读写文件(这些均属于系统调用)等,就需要向操作系统发出调用服务的请求,这就是系统调用。
2)异常
3)外围设备的中断

.### 守护、僵尸、孤儿进程的概念
守护进程:运行在后台的一种特殊进程,独立于控制终端并周期性地执行某些任务。

僵尸进程:一个进程 fork 子进程,子进程退出,而父进程没有wait/waitpid子进程,那么子进程的进程描述符仍保存在系统中,这样的进程称为僵尸进程。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,这些子进程称为孤儿进程。(孤儿进程将由 init 进程收养并对它们完成状态收集工作)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值