进程与线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了进程与线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4379字,纯文字阅读大概需要7分钟。
内容图文
![进程与线程](/upload/InfoBanner/zyjiaocheng/942/0bde911ea3ba4bfe80231360470db302.jpg)
——总结自《java编程思想》
进程
4种主要事件会导致进程的初始化:
- 系统初始化
- 正在运行的程序执行了创建进程的系统调用
- 用户请求创建了一个新的进程
- 一个批处理作业的初始化
进程终止的通常原因:
- 正常退出(自愿的)
- 出错退出(自愿的)
- 严重错误(非自愿的)
- 被其它进程杀死(非自愿的)
进程状态图:
为了实现进程模型,操作系统维护着进程表。每个进程占用一个进程表项。该表项包含了进程状态的重要信息,包括程序计数器、堆栈指针、内存分配状态、所打开的文件状态、账号和调度信息以及其它在进程由运行态转换到就绪态或阻塞态的信息,从而保证该线程能够再次启动。典型的进程表表项图:
单个(每一个)CPU如何维护多个顺序进程?
假设当一个磁盘中断发生时,用户进程1正在运行,则中断硬件将程序计数器、程序状态字、有时还有一个或多个寄存器压入堆栈,计算机随即跳转到中断向量所指示的地址。这些是硬件完成的所有操作。
中断:指CPU对I/O设备发来的中断信号的一种响应。CPU暂停正在执行的程序,保留CPU环境后,自动地去执行该I/O设备的中断处理程序。执行完后,再回到断点,继续执行原来的程序。I/O设备可以是字符设备,也可以是块设备、通信设备。由于中断时由外部设备引起的,故又称外中断。
中断发生后操作系统最底层的工作步骤: 1.硬件压入堆栈程序计数器等。 2.硬件从中断向量装入新的程序计数器。 3.汇编语言过程保存寄存器值。 4.汇编语言过程设置新的堆栈。 5.C中断服务例程运行(典型地读和缓冲输入) 6.调度程序决定下一个将运行的进程。 7.C过程返回至汇编代码。 8.汇编语言过程开始运行新的当前进程。
多道程序设计的道数:
线程
线程是最小的任务调度单位,是依赖于进程而存在的轻量级进程。
所有的线程都有完全一样的地址空间,意味着它们共享这同样的全局变量。
线程之间是没有保护的。
线程可以处于若干状态中的任何一个:运行、阻塞、就绪。
每个线程都有自己的堆栈。
根据 POSIX线程可以实现可移植的线程程序。
有三种主要的方式实现线程包:
-
在用户空间中实现。
内核对线程包不知,从内核角度考虑就是按正常的方式管理,即单线程进程。用户级线程包可以在不支持线程的操作系统上实现,并且允许每个进程都有自己的调度算法。在用户空间管理线程时,每个进程需要有专用的线程表用来跟踪该进程中的线程(类似于进程表)
-
在内核中实现线程。
所有能够阻塞线程的调用都以系统调用的形式实现。内核的线程表保存了每个线程的寄存器、状态和其它信息
-
混合实现。
内核只识别内核级线程,并对其进行调度。其中一些内核级线程会被多个用户级线程多路复用。每个内核级线程有一个可以轮流使用的用户级线程集合。
调度系统激活机制:解决内核级线程的速度慢的问题。工作的目标是模拟内核线的功能,但是为线程包提供通常在用户空间上才能实现的更好的性能和更大的灵活性。
弹出式线程:一个消息到达导致系统创建一个处理该消息的线程
进程间通信
Murphy法则:任何可能出错的地方终将出错。
两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件。
把对共享内存进行访问的程序片段称作临界区或临界区域。
互斥方案:
-
屏蔽中断
使每个进程在刚刚进入临界区后立即屏蔽所有中断,在离开前打开中断。(屏蔽中断后时钟中断也被屏蔽。CPU只有发生时钟中断或其它中断时才会进行进程切换)
-
锁变量
-
严格轮换法(自旋锁)
-
Peterson解法
-
TSL(test and set lock)指令
Peterson解法和TSL都是正确的,但是都有忙等待的缺点:当一个进程想进去临界区的时候先检查是否允许进入,若不允许则在原地等待直到允许为止。这种方法不仅浪费了CPU时间,而且可能引起预想不到的结果(优先级反转问题)。
生产者-消费者问题
信号量:使用一个整型变量来累计唤醒次数。供两个或多个进程使用的信号量,其初值为1,保证同时只有一个进程可以进入临界区,称作二元信号量。信号量可用于解决生产者-消费者问题,另一种用途可用于实现同步。
互斥量:没有信号量的计数能力,是信号量的一个简化版。互斥量是一个可以处于两态之一的变量:解锁和加锁。
快速用户区互斥量futex:实现了基本的锁,不在万不得已的情况下不会陷入内核。一个futex由一个内核服务和一个用户库组成。
条件变量:pthread提供了除互斥量之外的另一种同步机制:条件变量。即允许线程由于一些未达成的条件而阻塞。
管程
一个管程由过程、变量及数据结构等组成的一个集合,它们组成一个特殊的模块或软件包。进程可在任何需要的时候调用管程中的过程,但不能在管程之外声明的过程中直接访问管程的数据结构。
任一时刻管程只能有一个活跃进程,这一特性使管程能有效地完成互斥。
当一个管程过程发现它无法继续运行时,它会在某个条件变量上执行wait操作。该操作导致调用进程自身阻塞,并且将另一个以前等待在管程之外的进程调入管程。另一个进程可以唤醒正在睡眠的伙伴进程,这可以通过对其伙伴正在等待的一个条件变量执行signal完成。
调度
批处理系统中的调度
- 先来先去服务
- 最短作业优先
- 最短剩余时间优先
交互式系统中的调度
- 轮转调度
- 优先级调度
- 多级队列
- 最短进程优先
- 保证调度
- 彩票调度
- 公平分享调度
实时系统中的调度
实时系统通常分为硬实时和软实时。
实时系统的调度算法可以是静态或胴体的,前者在系统开始之前就做出调度决策;后者在运行过程中进行调度决策。
夕目山 发布了10 篇原创文章 · 获赞 1 · 访问量 157 私信 关注内容总结
以上是互联网集市为您收集整理的进程与线程全部内容,希望文章能够帮你解决进程与线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。