操作系统-进程基础

进程的提出是为了并发

进程 = 执行中的程序 + PCB

操作系统通过PCB感知进程的存在

进程是程序执行的载体,提供了程序执行所需的各种资源。一个程序可对应多个进程,一个进程可对应多个程序

通过对进程生命周期的定义和控制(创建、运行、阻塞、唤醒、终止)来实现多进程并发

PCB(process control block)主要包括:①进程标识符PID、用户标识符UID②进程当前状态(就绪、运行、阻塞)③进程的优先级④进程代码运行入口地址⑤程序的外存地址⑥进入内存的时间⑦处理机占用时间⑧资源占用情况(打开的文件,占用的IO设备等)⑨运行现场(各寄存器的值)⑩进程间同步与互斥所需的信号量结构,指向实现进程通信的信箱或消息队列的指针等

进程间的切换与调度

1.用户级线程与内核级线程的切换

进程切换 = 资源切换(指除CPU外的资源如页表的切换) + 指令流切换

线程切换 = 指令流切换

硬件实现的方法来减少模式切换(用户内核)时间:采用两组寄存器,一组用户用,一组内核用。这样在上下文切换时只需改变指针,让其指向相应的寄存器组。也可利用此方法减少进程切换的时间:设置多个寄存器组

用户级线程切换的函数由用户自己编写,TCB、栈都在用户区。用户级线程切换的核心就是将寄存器ESP中的值保存在当前线程的TCB中,然后调度到下一个线程,切换TCB,从下一个线程的TCB中取出保存的esp值赋给ESP寄存器,然后完成PC内容的切换。当然,在此过程中还要保存和恢复一些通用寄存器(执行现场),是放在线程各自的栈里保存。

内核级线程可以提高并发性,有效支持多核处理器。内核级线程的重要特点是:TCB在内核中,完成TCB切换的程序也在内核中,所以内核级线程切换的第一步就是中断陷入内核。

图中给出了在执行指令int/iret时栈要发生的变化,int指令执行时,会找到当前进程的内核栈,然后将用户态执行的一些重要信息,如当前程序执行位置CS:EIP、当前用户栈栈顶位置SS:ESP以及标志寄存器EFLAGS压到内核栈中。实际上,所有外部中断,比如时钟中断、键盘中断、磁盘读写完成中断等,都会引起上述动作。而iret指令正好是int指令的逆过程

  • 第一阶段:int中断陷入内核,核心工作是把SS:ESP、CS:EIP、EFLAGS压入内核栈(硬件自动完成)。然后在中断处理程序中将执行现场(通用寄存器)保存到内核栈中
  • 第二阶段:调用schedule,引起TCB切换(current指针指向原TCB,next指针指向调度出来的TCB)
  • 第三阶段:完成内核栈的切换。现在执行在内核态,此时ESP的值就是指向当前线程的内核栈。所以内核栈的切换为:current->esp = esp;esp = next->esp
  • 第四阶段:恢复现场。此时内核栈已经切换,需要完成通用寄存器的出栈(恢复现场)
  • 第五阶段:中断返回,切换到用户栈。即执行iret指令。由硬件完成SS:ESP、CS:EIP、EFLAGS的出栈

2.进程调度

当进程对资源的请求大于资源本身数量时,就需要调度。(按一定规则和顺序把资源分配给进程)

高级调度(作业调度):内存与辅存之间的调度。每个作业只调入一次,调出一次

中级调度(内存调度):就是内存管理中的Swap功能,为了提高内存利用率

低级调度(进程调度):按某种调度算法从就绪队列中选取一个进程,让cpu运行它

调度策略需考虑的评价指标

  • CPU利用率:CPU工作时间 / (CPU工作时间 + CPU空闲时间)
  • 吞吐量:单位时间内系统完成任务的总数
  • 响应时间:从用户发起一个交互操作到系统响应这个操作的时间
  • 任务的周转时间:从任务提交到完成所经历的时间

交互式任务关心响应时间,不关心周转时间;非交互式任务关心周转时间,不关心响应时间,CPU调度算法的核心是综合考虑各任务的周转时间、响应时间,系统吞吐量等以满足不同类型用户对系统性能的需求

进程间的通信与同步

读写同一个数据库、同一个文件、同一块内存都可以实现进程间的通信。实现通信并不难,难的是要保证进程间的同步

锁就是解决同步问题的一种方式:原子变量、关中断、信号量、自旋锁都可以称为锁

1.同步与互斥

同步:进程间执行过程中先后次序的问题

互斥:进程独占有限资源的问题

2.信号量

信号量是1965年由荷兰学者Dijkstra提出的,P、V的名称来源于荷兰语,其中P取自荷语proberen,其含义是test,要对信号量进行减1的操作,根据减去1以后的信号量数值来决定进程是否睡眠等待。V取自荷兰语verhogen,含义是increase,要对信号量加1,根据加1以后的信号量数值决定是否要唤醒睡眠在该信号量上的进程

  • 信号量就是用信号上关联的一个整数来决定进程的阻塞和唤醒,即一个整型变量
  • 可以让进程阻塞睡眠在这个信号量上
  • 信号量由数据对象和对数据对象的P、V操作组成,数据对象包括信号量数值和阻塞进程队列,P、V操作就是对这个信号量-1和+1,并且根据加减后的数值决定进程的阻塞和唤醒

3.临界区

信号量的作用是根据信号量的数值表达出来的语义来决定进程的停与走,通过信号量来让多个进程相互沟通,实现同步。因此,信号量数值非常重要,必须保证其语义信息的正确性,才能保证进程同步的正确性

如何保证?

核心:对信号量的修改必须是原子操作

一个进程在对信号量进行修改的过程中,不允许另一个进程访问该信号量(互斥)

因此,提出了临界区的概念来保证信号量语义的正确性

临界资源:在一段时间内仅允许一个进程访问的资源(可见,信号量就是一种临界资源)

临界区:进程中访问临界资源的那段代码

进程一旦进入临界区代码的执行,操作系统的状态就发生了改变,现在就不能在进程之间随意切换了

有了临界区的概念后,信号量保护的实质就是让进程中修改信号量的代码变成临界区代码

临界区的实现

临界区的实现就是要实现互斥进入——某个进程进入后,其他进程不得再进入(坑位只有一个)

不可能去用一个mutex=1的互斥信号量去实现临界区,因为临界区概念的提出就是为了实现对信号量的互斥访问。如何打破这个鸡生蛋、蛋生鸡的问题?关键是把对mutex信号量的操作原子化,通过硬件机制直接来保证mutex的原子性。然后再用这个mutex信号量来实现临界区,再用临界区去保证其他任意定义的信号量操作的原子性,这个鸡生蛋、蛋生鸡的循环就被打破了

另外,如果从软件上实现,有:turn变量法、flag数组变量法、Peterson算法、面包店算法

通俗的讲:就是要在坑位大门口设个标志,表示此坑有人,其他进程看到后,就会在门口等待

在大门口贴上“此坑有人”的标志,就是进入区代码要做的事,执行完临界区代码后,在大门口清除这个标志,就是退出区代码要做的事

硬件实现方法有:关中断法(多处理机系统不适用)、硬件原子指令法(共享lock变量,执行TestAndSet指令时,CPU会封锁内存总线,禁止其他CPU在指令结束前访问内存、实现了多CPU下的临界区保护)

死锁

死锁发生的四个必要条件

  • 互斥:我用了你不能用
  • 不可剥夺:我没用完,你不能抢我的
  • 请求与保持:我不但不给你我占有的资源,还要申请你占有的资源
  • 循环等待:你等我把我的资源给你,我等你把你的资源给我

死锁的解决

死锁预防

死锁预防基本思想:破坏了死锁产生的四个条件,系统就不会出现死锁了

破坏互斥条件?——>不可行,访问临界资源需保护这种互斥性

破坏不可剥夺条件?——>不可行,会造成前阶段工作实效,增加系统开销,降低系统吞吐量

破坏请求与保持条件?——>可行,一次性申请完进程所需的所有资源,它在运行过程中就不会再申请资源了

破坏循环等待条件?——>可行,对系统资源编号,让进程必须按序申请资源

死锁避免

死锁预防对系统运行的限制太大,会引起资源利用率下降,系统性能下降。

死锁避免基本思想:不作任何预防,但要检测危险。每次资源申请的时候去判断一下是否有出现死锁的危险,如果有就拒绝此次申请

一个判断是否存在死锁危险的算法——银行家算法

死锁检测与恢复

银行家算法的时间复杂度为O(mn²),m是资源向量长度,n是进程数量。这个开销是很大的,因为每个进程在每一次资源请求时都必须运行一次银行家算法。

并且还有个缺点是,银行家算法具有安全序列是不够成死锁的充分条件,而非必要条件,也就是说本来不会导致死锁的资源请求很可能不被允许,这势必造成资源的浪费,进程执行的拖延

而死锁检测与恢复的基本思想是:破除限制,让资源随意使用。只是需要在出现死锁时,能够检测到并且能恢复正常

改造一下银行家算法就可以应用于死锁检测,这个算法是定时调用或者是检测到系统可能出现死锁(如果资源长时间未用,进程长时间不被调度等)时才用。死锁出现的概率是很低的,因此算法的调用频率大大降低,系统开销大大降低

检测是很容易的,难的是死锁恢复

剥夺死锁进程占有的资源,让死锁进程回退曾经某个状态都可以让死锁恢复。但这些策略实现起来十分困难,牵扯到很多问题。

死锁忽略

死锁发生的概率是很小,系统不对死锁作任何复杂的处理,直接忽略(或直接杀死死锁进程,重启PC机等),这样也可行,代价最小

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值