操作系统复习笔记(一)

一、什么是进程、线程
进程定义:1、一个正在执行的程序实体
                 2、一个正在计算机处理器上执行的实体
                 3、能分配给处理器并由其执行的实体
                 4、程序代码及相关的数据集
线程:一个进程中可以有多个线程,多个线程共享进程的资源,线程相互独立,有自己的执行态,上下文,可视为在进程内一个独立的程序计数器。


个人理解:进程是个团队,有团队资源,团队内部纪律(进程控制块),线程是团队成员,团队成员彼此独立,共享团队资源
进程资源:处理器时间、存储器、文件、I/O设备
 

二、并发性:互斥和同步

1、并发原理
伪并行: 单处理器多道程序设计的交替执行。(利用中断,调度到另一个程序)

1)方法:控制中断,控制资源的访问,
2)进程的交互
竞争、通过共享合作、通过通信合作
这里主要讨论竞争关系面临的控制问题:互斥、死锁、饥饿。

  • 互斥  :多个进程需要访问同一个不可共享的资源,该类资源称为临界资源,使用临界资源的程序称为临界区

3、互斥的要求:一次只准一个进入临界区,不会出现死锁和饥饿,驻留时间有限制··

2、几种互斥的硬件实现方法。

1)中断禁用
单个处理器上不能被中断
缺点:多处理器不能保证互斥,且执行速度慢

2)专用机器指令

3、信号量
1)信号量类别
2)原语操作:
semWait() 信号量-1
semSignal() 信号量+1
信号量初始化只能为非负值
3)机制: 
信号量若为正数,则其值等于执行完semWait后可执行进程的数目(例:s=1,执行完semwait后只可以执行一个进程,若s=0,则semwait后所有进程堵塞)
 执行完semSignal后,从堵塞队列中调度一个优先级最高的进入就绪队列
4)二元信号量操作:
相差的是,信号量的值只有0和1
5)互斥量:
与二元信号量区别:加锁(设为0)和解锁都只能是同一个程序(常是 

6)消费者问题

一个或多个生产者:产生数据放在缓冲区
消费者:从缓冲区提取数据(每次取一项) 

  • 生产者和消费者无限缓冲区函数:
消费者开始通过生产者的semSignal(delay) ,结束通过自己的判断

问题:1、生产者在生产过程中会竞争同一个位置
          2、生产过程中产品不能被消费
          3、缓冲区为空的情况,不能进行消费
错误的用二元信号量解决白无限缓冲审通过产生产者和消费者问题,原因在于:(代码见书155)
未解决问题三: 消费时最终锁定delay时需要delay已经为0,但是生产可以解锁delay,故在消费者解锁s后即开始生产,会导致delay=1,故第一次判断无效,循环后最终n==0时,delay锁定后不会堵塞。

解决:1和2:同时只能一个进行生产或者  执行前semWait(s),添加完数据后执行semSignal(s)

          消费者开始semWait(s),在生产过程中已经执行过semWait(s),故消费被堵塞
          3: 设置一个变量,使其等于n的值在消费者函数中,目的在于破除生产者再次生产时的对delay的解锁,

  • 生产者消费者有限缓冲区问题
使用信号量解决:新建一个信号量,设为e,其值为缓冲区大小; 生产,semWait(e); 消费,semSignal(e)
7)信号量的实现:
信号量作为原语操作通过软件互斥实现,也可以通过硬件或固件实现

三、管程
1、使用信号的管程
定义:由一个或多个过程、一个初始化序列和局部数据组成的软件模块
如何使用管程:进程通过调用管程中的一个过程进入。
                        一个进程在管程中执行,则其他使用管程的进程堵塞。
问题:1、如何实现同步
          使用条件变量
             cwait(c):进程在条件c上被堵塞
             csignal(c):恢复被堵塞的进程(若有多个,选择一个,若没有,无响应)

bounderbuffer模块: 控制缓冲区
cond 用来声明条件变量:

2、使用管程解决有限缓冲区的生产者、消费者问题。
1)声明管程 

monitor boundebuffer ;

声明数据集:
声明条件变量;这里为notfull 和 notempty
写过程函数 ;
append: if count ==0  cwait(notfull)
                    csignal(not empty)
take 相反

3、 使用通知和广播的管程

四、消息传递
进程进行交互必须满足两个基本条件:  同步或者通信

五、读者/写问题
问题:如何实现: 同时读、只能一个写、写时不能读

1、读者优先策略;
只能一个写:writer实现 

只要有一个在读,则不能写  即需要一个readcount记录读者数,

readcount ==1 则semwait(wsem)  (如果正在写,则不能继续,没有,则不能写)(完成写时不能读)
然后重新semSignal(x) 可以继续读 

读者数为1,则不能写
2、写者优先策略

有一个写,则不能有新的读 writecount 

猜你喜欢

转载自blog.csdn.net/maketubu233/article/details/80743389