进程与线程
进程模型
计算机上所有可运行的软件,通常也包括操作系统,被组织成若干顺序进程,简称 进程。一个进程就是一个正在执行程序的实例。包括程序计数器、计数器和当前变量的值。
CPU在进程之间快速来回切换被称作是多道程序设计。
进程的创建
四种事件会导致进程的创建
1.系统初始化
2.正在运行的程序执行了创建进程的系统调用。
3.用户创建一个新进程。
4.一个批处理作业的初始化。
守护进程:停留在后台处理诸如电子邮件、WEB页面、新闻、打印之类活动的进程成为守护进程。
在UNIX和Windows中,进程创建之后,父进程和子进程有各自不同的地址空间
进程的终止
1.正常退出(自愿的)
2.出错退出(自愿的)
3.严重错误(非自愿)
4.被其它进程杀死(非自愿)
进程的结构层次
UNIX:树
Windows: 没有进程层次概念,所有的进程层次相同,唯一类似的是,创建子进程的时候,父进程得到一个特别的令牌(句柄),可以用来控制子进程,但它有权把句柄传给其它进程,这样就不存在进程层次,UNIX中则不能剥
夺子进程的继承权。
进程的状态
进程的实现:
操作系统维护这一张表格(一个结构数组),即进程表。一个进程占用一个进程表项(进程控制块),该表项中包含了进程状态的重要信息,程序计数器,堆栈指针,内存分配状态,所打开文件的状态,账号和调度信息等等。
中断向量:与每一I/O类关联的,包含中断服务程序的入口地址。
线程
为什么需要多线程
线程其实就是迷你进程,需要多线程的理由是一些进程中进行着许多活动,分解成线程的话会简单很多,
还有个原因是,线程比进程更轻量级,创建和撤销都比进程容易,创建一个线程较创建一个进程要快10到100倍,在有大量进程需要动态和快速修改时,这一特性很有用。
3.性能。存在大量计算和大量IO处理会加快。
4.多CPU系统中,真正的并行有了实现的可能。
由于线程拥有进程的某些性质,有时也被称为轻量级进程。
IEEE标准3.1c中定义了线程的标准,定义了线程包 pthread
在用户空间实现线程
在用户空间管理线程,每个进程需要有其专用的线程表,用来跟踪该进程中的线程。
在内核空间实现线程
此时不需要运行时系统,每个进程中也没有线程表。
弹出式线程
一个消息的到来导致系统创建一个处理该消息的线程,这种线程称为弹出式线程。
进程间通信
临界区
把共享内存进行访问的程序片段称作临界区域或临界区。
忙等待的互斥实现:1.屏蔽中断 2.锁变量 3.严格轮换法4.Pesterson解法 5.TSL指令
睡眠与唤醒
生产者-消费者问题(有界缓冲区问题)
信号量
使用一个整型变量来累计唤醒次数,供以后使用,通过两种操作,down和up,信号量减为0则睡眠。
互斥量
不需要信号量的计数能力,就可以用它的简化版本,称为互斥量,仅适用于管理共享资源或一小段代码,在实现洪湖空间线程包的时候非常有用。
它处于两态之一:解锁和加锁。只需一个二进制位来表示。
快速用户区互斥量futex:包含两个部分,内核服务和一个用户库。
pthread中的互斥量:使用一个可以被锁定和解锁的互斥量来保护每个临界区。
管程
一种高级同步原语。
特性:任一时刻管程中只能有一个活跃进程。
条件变量:wait signal
消息传递
使用两条原语:send 和 receive ,像信号量,是系统调用而不是语言。库例程:
send(destination,&message);
receive(source,&message);
(感觉像TCP中的ACK)
屏障
当一个京城到达屏障时,被屏障所拦截,知道所有进程都到达该屏障为止,屏障可用于一组进程同步。
调度
何时调度?
1.创建新进程时,父子进程选择运行谁
2.进程退出
3.进程阻塞
4.I/O中断
调度算法分类:
1.批处理
2.交互式
3.实时。
批处理系统中的调度:
1、先来先服务 2、最短作业优先 3、最短时间优先
交互式系统中的调度;
1、轮转调度(时间片、进程切换、上下文切换等)2、优先级调度3、多级队列 4、最短进程优先(最短响应时间)5、保证调度(向用户做出性能保证,然后实现这个保证)
6、彩票调度(在保证调度的基础上,随机抽出一个来运行,就买彩票一样)7、公平分享调度
实时系统中的调度
实时系统:硬实时:绝对的截止时间
软实时:可容忍的截止时间
策略和机制:将调度机制与调度策略分离。
经典IPC问题:哲学家就餐同步问题。