一进程的定义:可并发执行的程序在数据集合上的运行过程;
进程具有的特点:
1.动态性: 动态性是进程的最基本特征,它是程序执行过程,它是有一定的生命期。它由创建而产生、由调度而执行,因得不到资源而暂停,并由撤消而死亡。而程序是静态的,它是存放在介质上一组有序指令的集合,无运动的含义。
2并发性: 并发性是进程的重要特征,同时也是OS的重要特征。并发性指多个进程实体同存于内存中,能在一段时间内同时运行。
二,进程的组成:
进程通常由三部分组成,一部分是程序,一部分是数据集合,一部分是进程控制块(PCB);各自功能如下:
程序:描述进程所要完成的功能;
数据集合:是进程的可修改部分,这部分只能为一个进程所专用;
进程控制块:是进程动态特性的集中反映; 对进程管理是通过对PCB管理来实现,所以进程控制块是进程存在的唯一实体。
三,进程的调度状态:
进程有三种调度状态:
三个基本状态之间可能转换和转换原因如下:
就绪态–>运行态:当处理机空闲时,进程调度程序必将处理机分配给一个处于就绪态的进程 ,该进程便由就绪态转换为运行态。
运行态–>阻塞态:处于运行态的进程在运行过程中需要等待某一事件发生后(例如因I/O请求等待I/O完成后),才能继续运行,则该进程放弃处理机,从运行态转换为阻塞态。
阻塞态–>就绪态:处于阻塞态的进程,若其等待的事件已经发生,于是进程由阻塞态转换为就绪态。
运行态–>就绪态:处于运行状态的进程在其运行过程中,因分给它的处理机时间片已用完,而不得不让出(被抢占)处理机,于是进程由运行态转换为就绪态。
而阻塞态–>运行态和就绪态–>阻塞态这二种状态转换不可能发生。
处于运行态进程:如系统有一个处理机,则在任何一时刻,最多只有一个进程处于运行态。
处于就绪态进程:一般处于就绪态的进程按照一定的算法(如先来的进程排在前面,或采用优先权高的进程排在前面)排成一个就绪队列RL。
处于阻塞态进程:处于阻塞态的进程排在阻塞队列中。由于等待事件原因不同,阻塞队列也按事件分成几个队列WLi。
四,进程控制:内核通过执行各种原语操作来实现其控制功能.以实现进程控制;
原语: 原语是一种特殊的广义指令,它的功能是由系统通过一段不可分割的指令操作来完成,它又称原子操作,原语在核心态下完成。进程控制操作(创建、撤消、阻塞……)大都为原语操作。
内核:内核中所包含的原语主要有进程控制原语,进程通信原语,资源管理原语进程激活面的原语等(而进程控制原语又可以细分为进程创建原语,进程撤销原语,进程挂起原语,进程激活原语,进程阻塞原语以及进程唤醒原语)
进程控制原语的划分:
进程创建原语: 一个进程可借助创建原语来创建一个新进程,该新进程是它的子进程,创建一个进程主要是为新进程创建一个PCB。创建原语首先从系统的PCB表中索取一个空白的PCB表目,并获得其内部标识,然后将调用进程提供的参数:如外部名、正文段、数据段的首址、大小、所需资源、优先级等填入这张空白PCB表目中。并设置新进程状态为活动/静止就绪态,并把该PCB插入到就绪队列RQ中,就可进入系统并发执行。
进程撤销原语: 对于树型层次结构的进程系统撤消原语采用的策略是由父进程发出,撤消它的一个子进程及该子进程所有的子孙进程,被撤消进程的所有资源(主存、I/O资源、PCB表目)全部释放出来归还系统,并将它们从所有的队列中移去。如撤消的进程正在运行,则要调用进程调度程序将处理器分给其它进程。
进程挂起原语: 调用挂起原语的进程只能挂起它自己或它的子孙,而不能挂起别的族系的进程。挂起原语的执行过程是:检查要挂起进程PCB的现行状态,若正处于活动就绪态,便将它改为静止就绪态;如是活动阻塞态则改为静止阻塞态。如是运行态,则将它改为静止就绪态,并调用进程调度程序重新分配处理机。为了方便用户或父进程考察该进程的运行情况,需把该进程的PCB复制到内存指定区域。
进程激活原语: 用户进程或父进程通过调用激活原语将被挂起的进程激活。激活原语执行过程是:检查被挂起进程PCB中的现行状态,若处于静止就绪态,则将它改为活动就绪态,若处于静止阻塞态,则将它改为活动阻塞态。
进程阻塞原语: 当前进程因请求某事件而不能执行时(例如请求I/O而等待I/O完成时),该进程将调用阻塞原语阻塞自己,暂时放弃处理机。进程阻塞是进程自身的主动行为。阻塞过程首先立即仃止原来程序的执行,把PCB中的现行状态由运行态改为活动阻塞态,并将PCB插入到等待某事件的阻塞队列中,最后调用进程调度程序进行处理机的重新分配。
进程唤醒原语: 当被阻塞的进程所期待的事件发生时(例如I/O完成时),则有关进程和过程(例如I/O设备处理程序或释放资源的进程等)调用wakeup原语,将阻塞的进程唤醒,将等待该事件的进程从阻塞队列移出,插入到就绪队列中,将该进程的PCB中现行状态,如是活动阻塞态改为活动就绪态,如是静止阻塞态改为静止就绪态。
五,进程同步通信的方式:
用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行:初始化,P操作和V操作,这三种操作都是原子操作。
P操作(递减操作)可以用于阻塞一个进程,V操作(增加操作)可以用于解除阻塞一个进程。
基本原理是两个或多个进程可以通过简单的信号进行合作,一个进程可以被迫在某一位置停止,直到它接收到一个特定的信号。该信号即为信号量s。
为通过信号量s传送信号,进程可执行原语semSignal(s);为通过信号量s接收信号,进程可执行原语semWait(s);如果相应的信号仍然没有发送,则进程被阻塞,直到发送完为止。
可把信号量视为一个具有整数值的变量,在它之上定义三个操作:
P,V操作过程:
信号量:用来解决进程同步和互斥问题的机制。(其值仅能由P,V操作来改变)
公用信号量:通常用于实现进程之间的互斥,初值为1,它所联系的一组并发进程均可对其实施P,V操作。
私有信号量:一般用于实现进程之间的同步,初值为0或为某个正整数,仅允许拥有它的进程对其实施P操作。
P,V操作:
P(s):1.S:=S-1
2.若S>=0,则调用P(s)得进程继续执行
3.若S<0,则调用P(s)的进程被阻塞,并把它插入到等待信号量S的阻塞等待队列中
V(s):1. S:=S+1
2.若S>0,则调用V(s)的进程继续执行
3.若S<=0,从等待信号量的阻塞队列中唤醒头一个进程,然后调用V(s)的进程继续运行。
.过程:
Procedure P(Var S: Semaphore);
begin S:= S-1;
if S<0 then W(s)
end;{P}
Procedure V(Var S:Semaphore);
begin S:= S+1;
if S<=0 then R(s)
end;{V}
其中,W(s)表示将调用该过程的进程置成等待信号量S的阻塞状态,并插入相应呢阻塞队列中。R(s)表示要唤醒等待信号量S阻塞队列中的头一个进程。
管程是由一个或多个过程、一个初始化序列和局部数据组成的软件模块,其主要特点如下:
局部数据变量只能被管程的过程访问,任何外部过程都不能访问。
一个进程通过调用管程的一个过程进入管程。
在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被阻塞,以等待管程可用。
管程通过使用条件变量提供对同步的支持,这些条件变量包含在管程中,并且只有在管程中才能被访问。有两个函数可以操作条件变量:
cwait(c):调用进程的执行在条件c上阻塞,管程现在可被另一个进程使用。
csignal(c):恢复执行在cwait之后因为某些条件而阻塞的进程。如果有多个这样的进程,选择其中一个;如果没有这样的进程,什么以不做。
消息传递的实际功能以一对原语的形式提供:
send(destination,message)
receive(source,message)
这是进程间进程消息传递所需要的最小操作集。
一个进程以消息的形式给另一个指定的目标进程发送消息;
进程通过执行receive原语接收消息,receive原语中指明发送消息的源进程和消息。
所有进程同步机制所要遵循的四条准则:
空闲让进
当无进程进入临界区时,相应的临界资源处于空闲状态,因而允许一个请求进入临界区的进程立即进入自己的临界区。
忙则等待
当已有进程进入自己的临界区时,即相应的临界资源正被访问,因而其它试图进入临界区的进程必须等待,以保证进程互斥地访问临界资源。
有限等待
对要求访问临界资源的进程,应保证进程能在有限时间进入临界区,以免陷入“饥饿”状态。
让权等待
当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入忙等。
文章浏览阅读8.5k次。本文只为整理思路,供自己日后参考。现在就从从一个执行文件a.out的运行开始,自上而下地分析linux是如何运行一个执行文件的。1、首先,需要了解一下a.out这个目标文件。a.out在linux下是ELF(Executable Linkable Format)文件格式,该目标文件由一个文件头、代码段、数据段(已初始化)、从定位信息区、符号表及符号名字字符串构成,如下左图所示,经过链接后生成执行文件如下右图所示,需要说明的是1).bss段在目标文件和执行文件中并不占用文件的空间,但是它在加载时占用地址空._linux 50hz运行一次可执行文件
文章浏览阅读2.3w次,点赞4次,收藏9次。如下:测试java中静态常量和静态变量区别的样例,表明两者加载时的区别。StaticClass类中定义了静态常量FIANL_VALUE和静态变量VALUE,静态代码块的打印语句表示类被加载:[java]view plaincopypublicclassStaticClass {static{System.out.println("StaticClass l..._java静态常量和常量的区别
文章浏览阅读4.5k次,点赞2次,收藏3次。今天有个业务逻辑流程为:1.访客预约确认先更新预约状态为“预约确认”2.调用http接口发短信、更新预约状态为“预约成功”等一系列操作这里面有个问题,如果第2步调接口异常或返回失败。则第1步需要回滚。开始我的代码如下: public void updateStatusConfirm(int id) throws Exception { appointmentMapper.updateStatu..._throws exception 事务
文章浏览阅读197次。自己稍微修改了一下狂神的东西
文章浏览阅读1.9w次,点赞9次,收藏13次。在vscode中打开错误提示首先打开vscode,找到左下角的小齿轮点击选择setting在搜索框中输入error Squiggles回车键找到extensions下面c/c++中的error Squiggles,如使用其他语言找到自己对应的语言就行;并分别点击user,workspace,folder将他们的error Squiggles选项变为enabled(建议直接输入erro..._vscode自动错误提示
文章浏览阅读3.7k次。Keil_v5\ARM\RV31_手推车单片机头文件在kell的那个目录下
文章浏览阅读2.5w次,点赞12次,收藏68次。python在Windows系统下可以调用win32 api来实现一些系统级的功能,比如控制鼠标和键盘来实现游戏辅助。但是python并没有自带这些库文件,需要自己动手安装pywin32这个库,安装方法:pip install pywin32今天就以Flash小游戏彩色砖块为实验对象,用python写一个自动点击的“游戏外挂”。彩色砖块这个小游戏在很多年前出现在QQ空间3366小游戏。..._win32api.mouse_event
文章浏览阅读1.8w次,点赞17次,收藏55次。今天在解决一个小问题时,遇到解隐函数方程,中间涉及一个解的传递问题,才好好研究了一下 syms这个语句的一些语法规则,最终用vpa这个函数解决了符号表达式到double数值的转化。syms是符号函数,符号变量的优点是,使用符号变量运算得到的只是一个解析解,例如,在符号变量运算过程中pi就用pi表示,而不是具体的近似数值3.14或3.14159。MATLAB的符号计算是建立在MAPLE软件基础上的..._matlab syms转化为数值
文章浏览阅读452次。set_index():函数原型:DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)参数解释:keys:列标签或列标签/数组列表,需要设置为索引的列drop:默认为True,删除用作新索引的列append:默认为False,是否将列附加到现有索引inplace..._cannot insert f12, already exists
文章浏览阅读713次。JanusGraph 旨在提供不止一台机器的图数据的存储和计算能力。实时的图数据遍历和分析查询是JaunsGraph的基本特性。本节将讲解JanusGraph的特性和所支持的底层持久性解决方案。JanusGraph 基本特性支持海量的图数据。 JanusGraph所支持的图的大小取决于集群中机器的数量。支持大并发下图的事务和操作处理。 JanusGraph的事务处理能力与集群中的机器数..._janusgraph 性能
文章浏览阅读1k次。<div class="mainChart" ref="mainChart"></div> initChart0() { let myChart = this.$echarts.init(this.$refs.mainChart) myChart.setOption({ tooltip: { trigger: 'axis', axisPointer: { // 坐标轴.._echart 盒须模型 平均值单独画出点展示
文章浏览阅读1.7k次。在很多app中就有UITableViewCell左滑出现菜单如系统删除按钮,但是系统的只能有一个,有很多需求需要个性化不仅可以放文字还可以放按钮修改背景色创建多个菜单项,那么系统提供的肯定不适合,所以我们需要自己手工打造。 直接上代码如下: WHC_MenuCell.h 头文件如下://// WHC_MenuCell.m// WHC_MenuCell//// Created by_uitableviewcell 侧滑自定义控件