笔记
1.进程
进程就是描述程序在运行时的动态特征
前趋图:是一个有向无环图,用于描述进程之间执行的前后关系。
图中的每个结点可用于描述一个程序段或进程,乃至一条语句。结点间的有向边则用于表示俩个结点之间存在的偏序或前驱关系。
前驱图必须不存在循环
程序的顺序运行
顺序运行的特征:顺序性、封闭性、可在再现性。
程序的并发执行
程序并发执行的目的:
1.提高计算机的处理能力
2.提高资源利用率
1.分为俩种形式
2.多道程序环境下的多道程序的并发执行,在某道程序的几个程序段中,包含可同时执行或可颠倒顺序执行的代码。
程序并发执行的定义:程序的并发执行是指一组在逻辑上互相独立的程序或者程序段在执行时间上客观上互相重叠,即一个程序或程序段的执行尚未结束,另一个程序段的执行已经开始执行方式。
并发:在一段时间内的同时并行。并行:在同一物理时刻的同时
并发就是某一时刻只有一个在运行,并行就是某一时刻俩个同时运行
程序并发执行的特征
间断性(相互制约性)、失去封闭性、不可再现性。
程序的并发执行,失去了封闭性,其计算结果已经和并发执行速度有关,从而使程序试去了可在再现性。就是程序经过多次执行后,虽然他们的之星时的环境和初始条件相同,但是得到的结果缺不同。
进程的定义:进程是程序的一次执行,一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位,进程是一个程序及其数据在处理机上顺序执行时发生的活动。
进程的特征:动态性、独立性、并发性、异步性、结构化
进程与程序的区别:
1.进程是动态的,程序是静态的。
2.进程是暂时的,程序是永久的。
3.进程与程序的组成不同,进程的组成包括程序、数据和进程控制块。
4.进程与程序的对应关系:通过多次执行,一个程序对应多个进程;通过调用关系,一个进程可包括多个程序。
5.进程具有并行特征,而程序没有。
6.进程是竞争计算机资源的基本单位。
进程的组成:
进程=程序+数据+进程控制块PCB
OS是根据PCB来对并发执行的进程进行控制和管理的
进程一共有3种基本状态:运行等待和就绪
状态之间可以相互转化,运行状态也是执行状态,阻塞状态也是等待状态。
进程的三种基本状态
1.就绪状态:已分配到除CPU以外的所有必要的资源,等着CPU去执行它。多个排成一队称为就绪队列。
2.执行状态
3.阻塞状态
原语:由若干条指令构成的“原子操作”过程,作为一个整体而不可分割–要么全都完成,要么全都不做。许多系统调用就是原语。
原语也有很多种
1.创建进程用的=创建进程原语
2.结束或撤销程序用的原语:进程撤销原语-Destory
3.进行阻塞原语-Block 原因:当进程的某事件尚未出现时,该进程调用阻塞原语把自己阻塞起来,
4.进程唤醒原语-Wakeup 原因:进程等待的事件发生,等待队列种的进程唤醒。
5.进程挂起原语-Suspend
6.进程激活原语-Active
线程
线程的目的:简化进程间的通信,以小的开销来提高进程内的并发程度。
进程:资源分配单位(存储器、文件)和CPU调度(分派)单位-未引入线程时。又称任务
线程:作为CPU调度单位,而引入线程后进程只作为其他资源分配单位。
线程的优点:减小并发执行的时间和空见开销(线程的创建、退出和调度),因此允许在系统中建立更多的线程来提高并发程度。
线程的属性:轻型实体、独立调度和分派的基本单位、可并发执行、共享进程资源。
进程和线程的关系
1.线程是进程的一个组成部分。每个进程在创建时通常只有一个线程,需要时这个线程可以创建其他线程
2.进程的多线程都在进程的地址空间活动。-某进程内的线程在其他进程不可见
3.资源是分给今进程的,而不是分给线程的,线程在执行中需要资源时,系统从进程的资源配额中扣除并分配给它。
4.处理机调度的基本单位是线程,线程之间竞争处理机,真正在处理机上运行的是线程。
5.线程在执行过程中,需要同步。
进程同步
1.一组并发进程执行时存在俩种相互制约关系:
进程互斥-资源共享关系
临界区:把每个进程中访问临界资源的那段代码称为临界区。
临界区的使用规则:
1.空闲则入:其他进程均不处于临界区
2.忙则等待:已有进程处于其临界区
3.有限等待:等待进入临界区的进程不能“死等”
4.让权等待:不能进入临界区的进程,应释放CPU(如转换到阻塞状态)
银行家算法
#include<bits/stdc++.h>
const int N = 5,M = 3;
//5个进程 3个资源
using namespace std;
int n=5,m=3;
int MAX[N][M]={//最大需求矩阵MAX
{7,5,3},
{3,2,2},
{9,0,2},
{2,2,2},
{4,3,3}
};
int ALLOCATION[N][M]={//分配矩阵ALLOCATION
{0,1,0},
{2,0,0},
{3,0,2},
{2,1,1},
{0,0,2},
};
int NEED[N][M],AVAILABLE[M]={3,3,2};
void init()//初始化NEED矩阵
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
NEED[i][j] = MAX[i][j]-ALLOCATION[i][j];
}
}
bool check(int work[],int i)//判断现有资源是否可以分配给线程PI
{
for(int j=0;j<m;j++){
if(work[j]<NEED[i][j]) return false;
}
return true;
}
int path[N];//安全序列
void is_OK(){//寻找安全序列
int work[M];//可分配资源WORK
memcpy(work,AVAILABLE,sizeof AVAILABLE);
bool st[N];//判断进程是否被执行
memset(st,false,sizeof st);
for(int i=0;i<n;i++){
int t = -1;
for(int j=0;j<n;j++){
if(!st[j]&&check(work,j)){
t = j;
break;
}
}
if(t==-1){
cout<<"系统不安全!"<<endl;
return ;
}
st[t] = true;
path[i]=t;
for(int j=0;j<m;j++){
work[j]+=ALLOCATION[t][j];
}
}
cout<<"安全序列为:";
for(int i=0;i<n;i++) cout<<path[i]<<' ';
cout<<endl;
return ;
}
void solves(){
for(int i=0;i<n;i++){
int t = path[i];
cout<<"进程 "<<t<<"执行!"<<endl;
for(int j=0;j<m;j++){
AVAILABLE[j] -=NEED[t][j];
ALLOCATION[t][j]+=NEED[t][j];
NEED[t][j]=0;
}
cout<<"进程 "<<t<<"执行完毕!"<<endl;
for(int j=0;j<m;j++)
AVAILABLE[j]+=ALLOCATION[t][j];
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
init();
is_OK();
solves();
return 0;
}
生产者-消费者问题
#include<bits/stdc++.h>
const int maxn = 1e5+10;
using std::cin;
using std::cout;
using std::ios;
using std::endl;
int num[maxn],in=0,out=0,n;
bool check(){
int get_num = rand()%2;
cout<<get_num<<endl;
if(get_num==1) return true;
else return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
while(true){
num[(in++)%n] = 1;
if(check()){
num[(out++)%n] = 0;
}
for(int i=0;i<n;i++) cout<<num[i]<<' ';
cout<<endl;
system("pause");
}
return 0;
}
已尽力,听天由命!
考的都是你会的 你不会的不考
已经考完了感觉胜券在握嘿嘿嘿