如何跟客户销售做网站,wordpress音乐插件,岳阳建设网站公司,中文html5网站模板进程与线程
1. 进程
进程是资源分配的基本单位
进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态#xff0c;所谓的创建进程和撤销进程#xff0c;都是指对 PCB 的操作。
下图显示了 4 个程序创建了 4 个进程#xff0c;这 4 个进程可以并发地执行…进程与线程
1. 进程
进程是资源分配的基本单位
进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态所谓的创建进程和撤销进程都是指对 PCB 的操作。
下图显示了 4 个程序创建了 4 个进程这 4 个进程可以并发地执行。
2. 线程
线程是独立调度的基本单位。
一个进程中可以有多个线程它们共享进程资源。
QQ 和浏览器是两个进程浏览器进程里面有很多线程例如 HTTP 请求线程、事件响应线程、渲染线程等等线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时浏览器还可以响应用户的其它事件。
3. 区别 拥有资源 进程是资源分配的基本单位但是线程不拥有资源线程可以访问隶属进程的资源。 调度 线程是独立调度的基本单位在同一进程中线程的切换不会引起进程切换从一个进程中的线程切换到另一个进程中的线程时会引起进程切换。 系统开销 由于创建或撤销进程时系统都要为之分配或回收资源如内存空间、I/O 设备等所付出的开销远大于创建或撤销线程时的开销。类似地在进行进程切换时涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置而线程切换时只需保存和设置少量寄存器内容开销很小。 通信方面 线程间可以通过直接读写同一进程中的数据进行通信但是进程通信需要借助 IPC。
进程状态的切换 就绪状态ready等待被调度运行状态running阻塞状态waiting等待资源
应该注意以下内容
只有就绪态和运行态可以相互转换其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间转为运行状态而运行状态的进程在分配给它的 CPU 时间片用完之后就会转为就绪状态等待下一次调度。阻塞状态是缺少需要的资源从而由运行状态转换而来但是该资源不包括 CPU 时间缺少 CPU 时间会从运行态转换为就绪态。
进程调度算法
不同环境的调度算法目标不同因此需要针对不同环境来讨论调度算法。
1. 批处理系统
批处理系统没有太多的用户操作在该系统中调度算法目标是保证吞吐量和周转时间从提交到终止的时间。 先来先服务 first-come first-serverdFCFS 非抢占式的调度算法按照请求的顺序进行调度。 有利于长作业但不利于短作业因为短作业必须一直等待前面的长作业执行完毕才能执行而长作业又需要执行很长时间造成了短作业等待时间过长。 短作业优先 shortest job firstSJF 非抢占式的调度算法按估计运行时间最短的顺序进行调度。 长作业有可能会饿死处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来那么长作业永远得不到调度。 最短剩余时间优先 shortest remaining time nextSRTN 最短作业优先的抢占式版本按剩余运行时间的顺序进行调度。 当一个新的作业到达时其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少则挂起当前进程运行新的进程。否则新的进程等待
2. 交互式系统
交互式系统有大量的用户交互操作在该系统中调度算法的目标是快速地进行响应 时间片轮转 将所有就绪进程按 FCFS 的原则排成一个队列每次调度时把 CPU 时间分配给队首进程该进程可以执行一个时间片。当时间片用完时由计时器发出时钟中断调度程序便停止该进程的执行并将它送往就绪队列的末尾同时继续把 CPU 时间分配给队首的进程。 时间片轮转算法的效率和时间片的大小有很大关系 因为进程切换都要保存进程的信息并且载入新进程的信息如果时间片太小会导致进程切换得太频繁在进程切换上就会花过多时间。 而如果时间片过长那么实时性就不能得到保证。 优先级调度 为每个进程分配一个优先级按优先级进行调度。 为了防止低优先级的进程永远等不到调度可以随着时间的推移增加等待进程的优先级 多级反馈队列 一个进程需要执行 100 个时间片如果采用时间片轮转调度算法那么需要交换 100 次。 多级队列是为这种需要连续执行多个时间片的进程考虑它设置了多个队列每个队列时间片大小都不同例如 1,2,4,8,…。进程在第一个队列没执行完就会被移到下一个队列。这种方式下之前的进程只需要交换 7 次。 每个队列优先权也不同最上面的优先权最高。因此只有上一个队列没有进程在排队才能调度当前队列上的进程。 可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。
3. 实时系统
实时系统要求一个请求在一个确定时间内得到响应。
分为硬实时和软实时前者必须满足绝对的截止时间后者可以容忍一定的超时。
进程同步
1. 临界区
对临界资源进行访问的那段代码称为临界区。
为了互斥访问临界资源每个进程在进入临界区之前需要先进行检查。
// entry section
// critical section;
// exit section2. 同步与互斥
同步多个进程因为合作产生的直接制约关系使得进程有一定的先后执行关系。互斥多个进程在同一时刻只有一个进程能进入临界区。
3. 信号量
信号量Semaphore是一个整型变量可以对其执行 down 和 up 操作也就是常见的 P 和 V 操作。
down : 如果信号量大于 0 执行 -1 操作如果信号量等于 0进程睡眠等待信号量大于 0 up 对信号量执行 1 操作唤醒睡眠的进程让其完成 down 操作。 down 和 up 操作需要被设计成原语不可分割通常的做法是在执行这些操作的时候屏蔽中断。
如果信号量的取值只能为 0 或者 1那么就成为了 互斥量Mutex 0 表示临界区已经加锁1 表示临界区解锁。
4. 管程
使用信号量机制实现的生产者消费者问题需要客户端代码做很多控制而管程把控制的代码独立出来不仅不容易出错也使得客户端代码调用更容易
管程有一个重要特性在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程否则其它进程永远不能使用管程。
管程引入了 条件变量 以及相关的操作wait() 和 signal() 来实现同步操作。对条件变量执行 wait() 操作会导致调用进程阻塞把管程让出来给另一个进程持有。signal() 操作用于唤醒被阻塞的进程。
进程通信
进程同步与进程通信很容易混淆它们的区别在于
进程同步控制多个进程按一定顺序执行进程通信进程间传输信息。
进程通信是一种手段而进程同步是一种目的。也可以说为了能够达到进程同步的目的需要让进程进行通信传输一些进程同步所需要的信息。
1. 管道
管道是通过调用 pipe 函数创建的fd[0] 用于读fd[1] 用于写。
#include unistd.h
int pipe(int fd[2]);它具有以下限制
只支持半双工通信单向交替传输只能在父子进程或者兄弟进程中使用。 2. 命名管道
去除了管道只能在父子进程中使用的限制
#include sys/stat.h
int mkfifo(const char *path, mode_t mode);
int mkfifoat(int fd, const char *path, mode_t mode);FIFO 常用于客户-服务器应用程序中FIFO 用作汇聚点在客户进程和服务器进程之间传递数据
3. 消息队列
相比于 FIFO消息队列具有以下优点
消息队列可以独立于读写进程存在从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难避免了 FIFO 的同步阻塞问题不需要进程自己提供同步方法读进程可以根据消息类型有选择地接收消息而不像 FIFO 那样只能默认地接收。
4. 信号量
它是一个计数器用于为多个进程提供对共享数据对象的访问
5. 共享存储
允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制所以这是最快的一种 IPC。
需要使用信号量用来同步对共享存储的访问。
多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。另外 XSI 共享内存不是使用文件而是使用内存的匿名段
6. 套接字
与其它通信机制不同的是它可用于不同机器间的进程通信