操作系统的基本知识

进程与线程

进程是系统进行资源分配和调度的基本单位;
线程是进行运行调度的最小单位;
区别与联系:一个进程可以有一个或多个线程;线程包含在进程之中,是进程中实际运行工作的单位;线程共享进程资源;一个进程可以并发多个线程,每个线程执行不同的任务。

协程

执行在用户态的轻量级线程,协程的调度完全由用户控制,协程拥有自己的寄存器和上下文和栈。协程切换时把寄存器和栈保存到其他地方, 在切回来的时候恢复保存的栈和上下文,直接操作栈,基本没有内核切换的开销,可以不加锁访问全局变量,因为只有一个线程。协程是异步的。

进程的五状态

创建状态:进程拥有PCB,其他资源尚未就绪
就绪状态:其他资源都准备好了,就差cpu资源
执行状态:进程获得cpu,进行执行
阻塞状态:进程因为某种原因放弃CPU执行
终止状态:进程运行完成,由系统清理和归还PCB
在这里插入图片描述

进程的PCB

进程控制块(PCB):用于描述和控制进程运行的通用数据结构,记录进程当前状态和控制进程运行的全部信息。

死锁的四个必要条件

互斥条件:进程对资源具有排他性
请求与保持条件:进程在拥有资源的基础上,去申请其他资源,请求被阻塞,但是进程不释放拥有的资源
循环等待条件:当发生资源得不到满足时,一致循环等待,也就是死锁的情况
不可抢占条件:进程的资源只能由自己释放 不能剥削

死锁的破坏

破坏请求与保持条件:系统规定进程运行之前一次性申请完所有资源
破坏不可抢占条件:当一个进程请求新的资源得不到满足时,必须释放占有的资源。
破坏循环等待:对资源进行线性排序,只能由序号小的申请到序号大的,释放的顺序反序进行

进程间的通信:

  • 管道: 是一种半双工的通信方式,数据只能单向流动,而且只有具有亲缘关系的进程间使用。
  • 命名管道:也是半双工的,允许无亲源关系的进程间进行通信。管道只支持无格式字节流和缓冲区有限
  • 消息队列:消息队列是由消息链表,存放在内核中并由消息队列标志符标志
  • 共享内存:映射一段能被所有进程访问的内存,由一个进程创建由多个进程可以访问
  • 信号:用于通知或者接受某个事件已经发生了;
  • 信号量:是一个计数器,可以控制多个进程对共享资源的访问。
  • 套接字:可以用在多台机器之间进行通信

进程同步

1)信号量机制
一个信号量只能置一次初值,以后只能对之进行p操作或v操作。 由此也可以看到,信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。
(2)自旋锁(条件临界区)
自旋锁是为了保护共享资源提出的一种锁机制。 调用者申请的资源如果被占用,即自旋锁被已经被别的执行单元保持,则调用者一直循环在那里看是否该自旋锁的保持着已经释放了锁,自旋锁是一种比较低级的保护数据结构和代码片段的原始方式,可能会引起以下两个问题; 死锁 和过多地占用CPU资源
(3)管程
信号量机制功能强大,但使用时对信号量的操作分散,而且难以控制,读写和维护都很困难。因此后来又提出了一种集中式同步进程——管程。其基本思想是将共享变量和对它们的操作集中在一个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。
(4)会合
进程直接进行相互作用
(5)分布式系统
由于在分布式操作系统中没有公共内存,因此参数全为值参,而且不可为指针。

线程通信

1、锁机制:包括互斥锁、条件变量、读写锁

(1)互斥锁提供了以排他方式防止数据结构被并发修改的方法。

(2)读写锁允许多个线程同时读共享数据,而对写操作是互斥的。

(3)条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

2、信号量机制(Semaphore):包括无名线程信号量和命名线程信号量

3. 信号机制(Signal):类似进程间的信号处理

线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

线程同步

在这里插入图片描述

进程的调度

首先保存当前进程的上下文
按照算法选取进程
把处理器分配给进程,将选中的进程控制块和处理机现场的有关信息装入处理器相应的寄存器

进程调度算法

先进先服务
短作业优先
最短剩余时间优先
高优先权优先
高响应比优先:长作业等时间长之后,优先级会哦上升
基于时间片轮转

活锁

死锁是大家都拿不到全部资源,都在等对方的资源;
活锁是大家都有资源不执行,互相谦让,都主动将资源释放给别的线程使用

虚拟内存

操作系统将内存抽象为虚拟的地址空间,每个程序都有自己的地址的空间,这个地址空间被分为多个块,每个块就是一个页,这些页被映射到物理内存(页框),同时把页码和对应的页框填入一个页表的表项,内存管理单元(MMU)管理着虚拟内存地址到物理地址的转换。

请页

当处理器访问一个虚存的页面的时候,首先到页表区查询该页是否已经映射到物理页框中,如果在直接根据页号到页表中查到物理内存的页框号,再结合偏移量就可以得出物理地址了;如果不在则会触发一个缺页中断,判断是否为有效地址,如果为有效地址,就从虚拟内存中该地址指向的页面读入到一个空闲的页框,并更新页表;如果是无效的地址,则表明进程在访问一个不存在的虚拟地址,终止访问

交换

当没有空闲页框时,启动交换机制,调用相应的内核操作函数,在物理页框中寻找一个当前不在使用或者近期不再使用到的页面所占据的页框,将此页框移出,以转载新的页面;如果移除的该页未被修改,则直接删除它,否则需要写回磁盘。

置换算法:
最佳置换算法,先进先出置换算法,近期最久未用过算法等
利用快表:来存储页表,提高物理地址和虚拟地址之间的映射。

内核态与用户态的区别

内核态与用户态是操作系统的两种运行级别,运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态(比如操作硬件)。

这两种状态的主要差别是
处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的
处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的。

用户态切换到内核态

系统调用
异常
中断

IO

bio: 同步阻塞
nio: 同步非阻塞
aio: 异步非阻塞

什么是同步?什么是异步?

同步与异步描述的是被调用者的。 A调用B。 如果是同步,B在接到A的调用后,会立即执行要做的事。A的本次调用可以得到结果。

如果是异步,B在接到A的调用后,不保证会立即执行要做的事,但是保证会去做,B在做好了之后会通知A。A的本次调用得不到结果,但是B执行完之后会通知A。

什么是阻塞?什么是非阻塞?

阻塞与非阻塞描述的是调用者的。
A调用B。
如果是阻塞,A在发出调用后,要一直等待,等着B返回结果。
如果是非阻塞,A在发出调用后,不需要等待,可以去做自己的事情。

IO多路复用

是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。

select

select 函数监视的文件描述符,select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024.对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低。

poll

它没有最大连接数的限制,原因是它是基于链表来存储的,

epoll

使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数

支持一个进程所能打开的最大连接数
在这里插入图片描述
FD剧增后带来的IO效率问题
在这里插入图片描述
消息传递方式
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值