操作系统原理--进程线程
概述
顺序程序:顺序性,封闭性,可再现性(只与初始条件有关)
并发程序:描述:cobegin,coend
特点:并发性,程序与计算不一一对应,程序之间相互制约(资源占用,公共变量...),不封闭,不可再现(输出依赖于哪个程序先执行完)
进程:程序的一次运行过程 。动态,独立运行,会竞争系统资源,程序和进程存在m对n的关系。
区别于程序的静态概念,cpu按照既定的程序去执行,形成一个进程
进程的状态:运行状态、等待状态(等前置事件完成)、就绪状态(等CPU控制权)
状态切换:

Notice:运行态---->就绪态:可能当前进程 时间片到了,需要让出CPU
就绪态不会到等待态,因为没有执行,不需要等待前置事件
等待态也不会到运行态
进程的组成:程序与数据 & 进程控制块(一种数据结构,描述进程的信息如与系统资源的关系、不同时期所处状态)
进程控制块:
组成:进程标识符
进程当前状态
组织方式:就绪队列结构
进程控制:
职责:负责进程状态的改变
控制原语(原子性):创建...
状态变化:
| 控制原语 | 语法 | 功能 | Linux语句 |
|---|---|---|---|
| 创建 | create (name,priority) | 创建一个具有指定标识符的进程,建立进程的 PCB结构 | fork() |
| 撤销 | exit() | 撤消当前运行的进程。将该进程的PCB结构归还到PCB资源池,所占用 的资源归还给父进程,从总链队列中摘除它 | exit() |
| 等待 | susp(chan) | 中止调用进程的执行,并加入到等待chan的等待队列中; 最后使控制转向进程调度 | wait() waitpid() |
| 唤醒 | wakeup(chan) | 当进程等待的事件发生时,唤醒等待该事件的进程 | |
| 切换 | 切换进程,注意区分于函数调用,(子进程不会返回父进程继续执行跳转处之后的代码) | execlp() |
Notice:创建进程时,父进程的变量会被子进程拷贝1个相同的,两者之间不共享
切换步骤:
1.获得cpu控制权
2.根据需求判断是否需要进程切换(处理机状态切换,状态变为就绪态或等待 态
3.做切换准备:保存上下文、恢复上下文
exec(): 更换进程执行代码
例题:

打印输出cad。注意,这个不是函数调用,execlp执行完不会回到main

输出8行,执行到pid1=fork() 创建1个子进程,两个进程继续向下,又各自fork()一个进程,共4个进程,每个进程打印两行输出
进程之间的相互制约关系(重点)
临界资源保证串行执行!!!!!!
交互关系
无交互
间接交互
直接交互
临界资源:一次仅允许一个进程使用的资源
临界区:进程中对公共变量进行审查和修改的代码片段
互斥:竞争关系
定义:当进程正在访问某一存储区域,不允许其他进程读出或修改该存储区的内容
同步:合作关系,严格执行顺序
定义:并发进程在关键点上需要相互等待和互通消息
关系举例:就诊中看病和化验
Q:如何保证进程互斥地进入临界区?
A:等待规则:忙则等待,空闲则入,有限等待
以下的例子都不满足:


while(flag == 1)跳转


这时候,多上一道保险,当切换进程且其他进程“想”进入时:

仍然有缺陷。进程多时非常复杂。
引入锁:(借助操作系统的核态)
定义:变量w,代表某种资源的状态
操作:检测w,为1继续检测,为0,设置为1,进入临界区执行(上锁),执行完置0(解锁)
信号灯:
由1个整型变量和两个原子操作组成
整型变量s:记录可用资源数量,非负整数
p操作:申请资源,计数器减1;若计数器为负,进程阻塞
v操作:释放资源,计数器加1;若有进程阻塞,唤醒其中1个
同步信号灯:
操作系统用于进程同步和互斥的一种机制,由Dijkstra提出。它通过计数器控制多个进程对共享资源的访问,避免竞态条件和死锁,针对同步信号灯的pv操作可以不成对
互斥信号灯:
用于多线程或多进程环境中实现互斥访问共享资源的同步机制。确保同一时间只有一个线程或进程能够访问临界区,从而避免竞态条件和数据不一致问题。pv操作需要成对
信号灯合并条件:并行
应用:生产者-消费者问题
分析:
分析同步关系:互斥信号灯 mutex。同步变量 n 互斥信号灯初值永远是1,因为最多只能由一个进程使用,且开始可以被使用
规范操作:操作前先检查同步变量,再检查互斥信号灯;操作前p操作,操作后V操作成对
进程通信
概述:
进程通信:进程之间传递信息及同步的机制 ,(IPC)
操作:发送(send),接收(receive)
同步方式:发送方 接收方
阻塞 阻塞 强同步
阻塞 非阻塞
非阻塞 阻塞
通信方式:
间接通信:信箱 归属进程或操作系统
直接通信:发送接收信息时必须指明消息接发进程
共享内存:同一片物理内存映射到多个进程的地址空间的通信机制
创建 shmget
绑定 shm
删除 shmctl
信号量:
创建 semget
控制 semctl
操作 semop P操作 和 V操作可在自己的程序中系统调用semop
信号:进程间通信或通知进程某事件发生的机制。可用于软中断和异步处理
产生来源:
输入ctrl + C
内核触发:硬件异常
系统调用 kill()
处理方式:忽略、捕获、执行默认动作
特点:异步性、不可靠性、无优先级
管道:进程间基于文件的间接通信机制
特点:半双工、对两端的进程来说是文件
分类:无名管道、命名管道

消息队列:类型、时间到达顺序

方法:
发送: msgsnd
接收:msgrcv
删除:msgctl
线程
传统的进程模型: 进程是资源占用、调度/执行的基本单位
不足:进程操作开销大,并发度不高
线程:
定义:进程中的一条执行路径
特点:单个进程创建多个线程,每个线程共享分配给该进程的内存,每个线程有自己的私用堆栈和处理执行环境
优点:开销小于创建进程,线程间通信方便,线程切换开销小,速度快,进程内可创建多个线程,提高并行效率
缺点:1个线程崩溃会影响整个进程崩溃(因为错误线程共享进程的内存空间,出现错误是进程级的)
多核&多线程:
加速比:设f为程序中能够并行的部分的运行时间在整个程序的执行时间的占比
加速比 = 1 / ((1-f)+ f/N) * 100% (N为处理器的个数)
线程的状态:创建、就绪、等待、运行、终止
实现:
用户级线程:线程管理的工作由进程自己完成,内核不知道线程的存在,一个线程阻塞导致整个进程阻塞
内核级线程:线程管理由内核来完成,线程控制时会产生处理机状态切换

