与前一篇《计算机组成原理》一样,本不想过多研究,学习的过程中却发现一些有意思的算法,经典问题的解决方案,对设计和编写大型项目有借鉴意义。本文将讲解进程的实体和五种状态,进程线程同步方法调度、管理、死锁、linux进程相关、命令行等问题。
为什么需要操作系统
多道程序设计
操作系统相关概念
互斥共享形式
、同时访问形式
为什没需要进程
进程作用
进程中包含以下内容
进程控制块PCB
- | 进程Process | 线程Thread |
---|---|---|
基本关系 | 线程不能独立存在,它由进程启动和管理的 一个进程包含多个线程 进程通过多线程提高效率 一个线程的崩溃会导致整个进程的崩溃 |
|
资源 | 是操作系统进行资源的基本单位 | 不拥有资源,但多个线程可以共享进程中的资源 |
调度 | 是操作系统独立调度的基本单位 | 是操作系统独立调度的最小单位 |
系统开销 | 开销大 | 开销小 |
通信 | 进程间通过IPC通信 | 读写同一进程数据的通信进行通信 |
其他 |
进程间资源相互隔离 当一个进程关闭之后操作系统会回收系统所占用的内存 |
为什么需要进程间的同步?先来了解一个背景--生产者-消费者问题
- 生产者消费者问题
- 有一群生产者进程在生产产品,并将这些产品提供给消费者进程进行消费,生产者进程和消费者进程可以并发执行,在两者之间设置了一个具有n可缓冲区的缓冲池,生产者进程需要将所生产的产品放到一个缓冲区中,消费者进程可以从缓冲区取走产品消费。
- 除此之外,没有进程间同步,还可能带来另一个更严重问题--死锁 在了解死锁前先来看一个问题 哲学家进餐问题 临界资源
- 一些虽作为共享资源却又无法同时被多个线程共同访问的共享资源。当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释放该共享资源才可以重新竞争使用该资源。
共享存储
Unix域套接字
消息队列
信号量
当多个线程并发使用进程资源时,也会出现生产者消费者问题和哲学家问题,故进程内多线程也需要同步。
线程同步方法
总结
同步方法 | 描述 |
---|---|
互斥锁 | 最简单的一种线程同步方法,会阻塞线程 |
自旋锁 | 避免切换的一种线程同步方法,属于忙等待,不适合单核CPU |
读写锁 | 一种特殊的自旋锁,为 “读多写少” 的资源设计的线程同步方法,可以显著提高性能 |
条件变量 | 睡眠唤醒相对复杂的一种线程同步方法,有更灵活的使用场景 |
补充资料: 线程与进程同步方法 C++示例代码
crond
sshd
httpd
mysqld
shpython3 running_process.py &
# 此时终端返回进程id 例: [1] 61888
# 终止
kill -9 [进程id]
# 或者 kill -9 %1 # 关闭该终端窗口创建的最近一个后台进程
# 虽然是后台进程如果有输出还会在终端打印
# 丢丢弃输出
python3 running_process.py 2>&1 > dev/null &
top
命令查看所有的进程pstree
打印进程间关系状态符号 | 状态说明 |
---|---|
R | (TASK_RUNNING),进程正处于运行状态 |
S | (TASK_INTERRUPTIBLE),进程正处于睡眠状态 |
D | (TASK_UNINTERRUPTIBLE),进程正在处于IO等待的睡眠状态 |
T | (TASK_STOPPED),进程正处于暂停状态 |
Z | (TASK_DEAD or EXIT_ZOMBIE),进程正处于退出状态,或僵尸进程 |
ps -aux | grep [进程ID / 进程名称]
查看进程状态
ps
top
kill
给进程传递信号, -9 无条件退出shps # 列出当前终端shell所运行的进程
ps -aux # aux打印进程的详细信息
ps -u root # 指定用户所运行的进程
ps aux | grep [进程ID/进程名称] # 查询进程
ps -ef --forest # 查看进程树 (会打印父子进程关系)
ps -aux --sort=-pcpu # 查看进程按CPU使用频率排序
ps -aux --sort=-pmem # 查看进程按内存使用排序
进程调度是指计算机通过决策决定哪个就绪进程可以获得CPU使用权
进程调度也被称为作业管理
进程调度有哪些机制?
进程调度时,如果老进程还没执行完怎么办?
抢占式调度 | 非抢占式调度 | |
---|---|---|
系统开销 | 频繁切换,开销大 | 切换次数少,开销小 |
公平性 | 相对公平 | 不公平 |
应用 | 通用系统 | 专用系统 |
进程的调度算法
描述 | 优点 | 缺点 | |
---|---|---|---|
先来先服务调度算法 | 高效 | 长作业进程阻塞 | |
短进程优先调度算法 | 调度程序优先选择就绪队列中估计运行时间最短的进程 | 高效 | 不利于长作业进程的执行 |
高优先权优先调度算法 | 进程附带优先权,调度程序优先选择权重高的进程 | 使得紧迫的任务可以优先处理 | - |
时间片轮转调度算法 | 按先来先服务的原则排列就绪进程 每次从队列头部取出待执行进程,分配一个时间片执行 | 相对公平 | 不能保证及时响应用户 |
所谓死锁是值多个进程在运行过程中因争抢资源而造成的一种僵局,当线程处于这种僵持的状态时,无外力的作用,他们将无法再向前推进。
系统中的资源可以分为两类
调度顺序不当 如何理解?
本质上破坏死锁的四个必要条件之一
以银行借贷系统分配策略为基础的算法
本文作者:郭敬文
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!