操作系统学习笔记

操作系统

操作系统:资源分配,同时管理用户程序,防止计算机资源使用不当。

多道处理系统,分时系统:多个程序同时加载到内存中,然后cpu划分很小的时间片,每个程序轮流执行一下片段,如果这个时间片段内没执行完就等待下次获取到时间片再执行。这样给人的感觉就像一个程序是独享的cpu。

用户的程序可能报错,比如1/0这种。报错有可能造成操作系统崩溃,所以搞了个双重模式。

双重模式分为用户模式和内核模式。特权指令(可能引起系统崩溃的指令)只能运行在内核模式。

用户程序需要调用特权指令的时候就通过系统调用(system call) 从用户态切换到内核态,调用完再切回来。

所有的io操作都是特权指令。shell(壳)有的版本就可以调用系统api。

有时候系统死循环了,一直卡在那里,操作系统拿不到cpu的控制权,采用定时器的方式可以解决这个问题。

每隔一段时间,程序都中断一下,cpu控制权返回给操作系统。

定时器分为固定时间和可变时间定时器,利用时钟和计数器实现。

进程:执行中的程序,是程序的一个实例,是程序的一次执行。

程序:进程的代码部分。

进程的几种状态,应该也算一种设计模式。

进程控制模块pcb包含程序计数器等,可以在进程上下文切换或者并发的时候保存和恢复现场。

原子操作:不会被打断的操作,原子性依赖硬件的支持,x86cpu是通过执行期间对总线加锁的手段。

如果父进程结束,一些系统不允许子进程继续存在。

写时复制技术:写时复制技术(详解版) (biancheng.net)

允许父进程和子进程在初始化时共享页面,如果其中一个进程修改的共享页面,会产生副本。

进程间通信可以通过共享内存或者消息传递的方式。

共享内存:一块儿内存在多个进程间共享。一般用于数据量比较大的时候,实现手段:文件映射,管道,剪贴板。

比如生产者消费者模型,可以读写同一块儿内存。

消息传递:一个发一个收。

线程使用场景:用于进程代码并发执行的需求,进程内的一个代码片段可以被创建为线程。

创建线程和切换线程都比进程要快的多。

用户线程:由用户线程库进行管理的线程,内核看不到用户线程。创建和调度在用户空间中,不需要内核的干预。jvm里的线程都是用户线程。

内核线程:内核进行管理的线程,需要内核的纸质,由内核完成线程调度、创建和取消。

多线程模型:

多对一模型、一对一模型、多对多模型

多对一:不支持内核线程的操作系统,内核只有进程,多个线程不能并行运行在多个处理器上。没啥用

多对多:多个用户下城映射为相等或者更小数目的内核线程,并发和效率都兼顾到了,但是比较复杂。

linux是多对一,多个用户线程映射到一个内核线程,并发性不高

mac和win是一对一,开销大

java线程由java虚拟机和jvm管理,是用户线程,操作系统不可见。java自己定义了创建和操作线程的一整套api

CPU调度算法

长程调度:作业调度、高级调度

线程调度:cpu调度,低级调度

中成调度:内存和外存进行交换

调度方式:

非抢占式调度:

一旦把cpu分配给某进程后,系统不可用抢占已分配的cpu并分配给其他进程,只有进程自愿释放cpu,cpu才能分配给其他进程。优点是易实现,调度开销小,适合批处理系统。缺点是响应时间长,不适合交互式系统。

抢占式调度:

调度程序可以根据某种原则停止某个正在执行的进程,将已经分配给他的cpu重新分配给另一进程。

优点是可防止单一进程长时间独占cpu,缺点是系统开销比较大。

调度算法:

先来先服务fcfs类似fifo,适用于长程调度,后端批处理的短程调度。

短任务优先 sjf,通常适用于长程调度。

优先级调度,实现简单,灵活,存在饥饿问题,低优先级的进程可能永远也得不到执行。解决办法是:老化,随着进程等待时间的延长,提交优先级。

时间片轮转,为分时系统设计,但是增加了抢占,时间片一般是10~200毫秒。为每个进程分配不超过一个时间片的cpu,时间片用完后,该进程将被抢占并插入就绪队列末尾,循环执行。

多级队列调度MLQ:不同类型的进程需要用不同的调度策略,交互进程需要短的响应时间,批处理需要短的等待时间。

多级队列调度就是说有多个就绪队列,每个队列有自己的调度算法。有个问题:先调度哪个队列中的进程呢?

多级反馈队列调度算法MLFQ:是多级队列的延伸,这个进程能在不同队列间移动。

多处理器调度算法:适用于多核处理器的cpu调度。

亲和性:进程在某个给定的cpu上尽量长时间地运行而不白给迁移到其他处理器的倾向性。

软亲和性:进程通常不会在处理器之间频繁迁移。

硬亲和性:进程不会在处理器之间迁移。

单队列调度算法:单队列多核心,当cpu空闲的时候就取一个任务执行,优点是简单,而且负载均衡。缺点是不具有亲和性,还有加锁的问题。

多队列调度方法:有多个就绪队列 ,每个cpu独享一个。每个队列有自己的调度算法,并且调度相对独立。优点:亲和性好,不需要加锁。缺点:负载不均衡。

进程同步,竞争条件和临界区,容易出现的问题:

数据不一致性、有界缓冲问题、竞争条件、同步和互斥、临界资源、临界区、临街区使用准则

数据不一致性问题解决:同步(互斥)机制

竞争条件:多个进程并发访问同一共享数据的情况,共享数据的最终结果取决于最后操作的进程。

防止竞争条件的方法:并发的进程同步或者互斥。(同步和互斥有什么区别???)

同步:协调进程的执行次序。

互斥:排他性的运行某一段代码,任何时候只有一个进程能够运行这段代码,互斥访问独占资源。

临界资源:一次只允许一个进程使用的资源,又称为互斥资源,、独占资源或者共享变量。

共享资源:一次允许多个进程使用的资源。

临界区:设计临街资源的代码段。也就是多线程执行的代码段。

信号量用处:保证两个或者多个代码段不能被并发调用,在进入关键代码段之前,进程必须获取一个信号量,否则不能运行。执行完该带端端,必须释放信号量。信号量有值,为正说明空闲,为负说明在忙碌。

哲学家就餐问题,再刷一遍视频。

信号量类型:计数信号量,范围是没有限制的整型值。二值信号量,仅限于0或者1.

计数信号量属于同步信号量,主要是保证顺序。二值信号量是互斥。

生产者消费者问题

分为三种情况:

所有缓冲区空时,先写后读,所有缓冲区满时,先读后写,缓冲区有满也有空时,可读可写。

生产者消费者会互相唤醒,根据缓冲区的情况会有阻塞。

读写者问题

允许多个读者同时读,不允许读者写者同时读写,不允许多个写者同时写。

哲学家就餐问题,有5根筷子

防止死锁可以有以下方法:

方法1:最多允许四个哲学家同事坐在桌子周围。

方法2:仅当一个哲学家左右两边的筷子都可以用的时候才允许他拿筷子。

方法3:给所有哲学家编号,奇数号哲学家必须首先拿左边筷子,偶数号反之。

管程 第七章

事件

死锁

死锁检测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值