linux系统属于微机操作系统
解决人机矛盾,中央处理机高速度和I/O设备的低速度这一矛盾,目标是提高计算机的工作效率
多道批处理系统充分的提高了计算机资源的利用率和系统的吞吐量,但是缺少人机交互能力,用户把作业交给计算机系统后,就脱离了自己的作业,不能干预作业的运行,因此不能及时修正业务运行过程中出现的错误,只有当作业结束后才能脱机修正错误,使用很不方便,每当写好的程序都需要在真机上面调试,难免不存在问题,用户希望可以随意的干预,控制自己的作业的运行流程,由此开发了交互式分时操作系统.
主机以很短的时间片为单位,把CPU轮流分配给每个终端使用;直到所有作业被运行完。若某个作业在分配给它的时间片内未完成计算,则该作业暂停运行,把处理器让给其他作业使用,等待下一轮再继续使用。若终端数量不多,每个终端很快就能重新获得CPU,使得每个终端得到及时响应。
...
二者区别:
特点:
为了描述操作系统的并发性,引入了进程的概念
进程在内存中都有独立的地址结构,多个程序(进程和线程)可以同时处于就绪状态,等待运行,CPU会分配时间给程序,由于CPU分配时间很快很短,所以多个程序可以同时运行,但就单个CPU来说,这种并行属于伪并行,因为CPU运行程序,读取指令仍然按给定的顺序运行,就是说程序的组织结构仍然是顺序结构,这个问题可以按宏观和微观来说,从宏观说,程序是并发的,也就是并行的,因为程序都是运行态或就绪态,比如我们一边上网一边听歌,但从微观来说,CPU在同一个时间片里只运行一个程序,但这个时间片很小,小到CPU切换进程时我们根本感觉不到,我们的几个程序都在很好的运行,所以我们感觉他们是并行的。
网游的双开或者模拟器的多开
(Process Cotrol Block) 为了反应进程的动态性,需要一个数据结构来描述进程的当前状态,本身的特性等
之所以说PCB是进程存在的唯一标识,是因为PCB记录了进程的全部控制信息,庞大而复杂,根据操作系统的要求不同,进程的PCB所包含的内容也有所不同,按照概念可以分为四个组成部分
临界资源即共享资源,对于临界资源,多个进程必须互斥的对它进行访问,在进程中某些代码会访问到临界资源,这段代码就叫做临界区 (critical section),即进程中访问临界资源的一段代码,实现进程对临界资源的互斥访问就是让各进程互斥的进入自己的临界区,也就是说当某个进程在临界区中执行时,其他进程都不能访问自己临界区,这样就保证了某个时间内只有一个进程在临界区内使用临界资源,这样就实现了临界资源的互斥访问。
临界区的执行在时间上是互斥的,进程必须请求允许进入临界区,也就是说当某个进程想进入临界区时,比如进行某种操作来判断当前临界区是否有进程在执行,在具体实现时也是利用代码来判断的,整个进程的访问过程分为以下三个区:
临界区互斥问题的解决方案要满足如下三个要求:
进程的基本状态
转换的原因:进程并非出于固定的某个固定的状态,如下图
1,申请空白PCB(进程控制块);
2,为新进程分派资源;
3,初始化PCB;
4,将新进程插入就绪队列;
作用
实现方法
就是提供一对上锁和开锁原语,以及一个锁变量w或者一个锁位(1bit),当程序进入临界区之前,首先测试w的状态,w=1表示上锁,该资源已被占用,w=0表示开锁,该资源空闲.利用上锁原语和开锁原语可以实现并发进程的互斥问题,所有要进入临界区的进程必须执行上锁原语,如果顺利通过才让程序进入临界区,在完成对资源的访问后,在执行开锁原语,用以解释临界资源
记录型信号变量的数据结构
struct semaphore{
int value;
struct PCB * queue;//为进程链表指针,指向等待该类资源的PCB队列
}semaphore;
semaphore S;//S的值表示系统中可用该类临界资源的数量
wait原语操作流
signal原语操作流
wait所执行的判断就是(就是为了申请临界资源)
if S.value=S.value-1 if S.value >= 0 进程继续执行反之
signal所执行的判断是(就是为了释放临界资源)
if S.value=S.value+1 if S.value <= 0 进程阻塞反之
表示系统中可用的该类临界资源的数量,又称资源信号量
网络摘抄感觉有点问题
自己总结了下
signal(full):生产者wait(empty)申请未被占用的信号量资源,在signal(full)释放掉已被占用的信号量资源,没有signal(full),消费者将取不到产品而一直等待
signal(empty):消费者wait(full)申请已被占用的信号量资源,signal(empty)释放未被占用的信号量资源,没有signal(empty)生产者将在生产n件产品后因为wait(empty)拿不到未被占用的资源而被阻塞
两者互换的话,在生产者申请未被占用的资源时变成了申请已经被占用的资源,最开始,full=0,那么可以生产商品wait(full),接着又signal(full),full还是等于0,消费者取商品时,wait(empty)申请未被占用的资源时,却因为申请不到而等待,当生产者生产n件商品后,之前的商品信息就会被覆盖,重新写入缓冲区,生产者一直工作下去.
进程:进程是程序的一次执行,同时也是资源分配的基本单位
线程:比进程更小,能独立运行的基本单位,线程比进程能更好的提高程序的并行执行速度,充分的发挥多处理机的优越性,引入线程主要是为了提高系统的执行效率,减少处理机的空转时间,线程是进程中执行运算的最小单位,即执行处理机调度的基本单位
二者区别
Linux中基本没区分线程和进程,它们都使用相同的描述方法,使用相同的调度和管理策略
多线程机制指的是一个程序里面可以有多个路径同时执行,也就是有多个线程,并行的执行,可以在同一个时间点上,一起执行,每一个线程都是一个独立的,都有各自独立的执行空间。
好处
由于共享文件对于读进程来说不是临界资源,要让它和写进程互斥只需要添加下面的代码段,让它也具有写进程共同的临界资源
wait(wmutex)
signal(wmutex)
五人同时拿起左边或者右边的筷子就会锁死,不锁死解决如下
A.原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。以下将room 作为信号量,只允许4 个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入餐厅的哲学家进入room 的等待队列,根据FIFO 的原则,总会进入到餐厅就餐,因此不会出现饿死和死锁的现象。
semaphore chopstick[5]={1,1,1,1,1};
semaphore room=4;
void philosopher(int i)
{
while(true)
{
think();
wait(room); //请求进入房间进餐
wait(chopstick[i]); //请求左手边的筷子
wait(chopstick[(i+1)%5]); //请求右手边的筷子
eat();
signal(chopstick[(i+1)%5]); //释放右手边的筷子
signal(chopstick[i]); //释放左手边的筷子
signal(room); //退出房间释放信号量room
}
}
B.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。
方法1:利用AND 型信号量机制实现:根据课程讲述,在一个原语中,将一段代码同时需要的多个临界资源,要么全部分配给它,要么一个都不分配,因此不会出现死锁的情形。当某些资源不够时阻塞调用程;由于等待队列的存在,使得对资源的请求满足FIFO 的要求,因此不会出现饥饿的情形。
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int I)
{
while(true)
{
think();
Swait(chopstick[(I+1)]%5,chopstick[I]);
eat();
Ssignal(chopstick[(I+1)]%5,chopstick[I]);
}
}
方法2:利用信号量的保护机制实现。通过信号量mutex对eat()之前的取左侧和右侧筷子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。
semaphore mutex = 1 ;
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int I)
{
while(true)
{
think();
wait(mutex);
wait(chopstick[(I+1)]%5);
wait(chopstick[I]);
signal(mutex);
eat();
signal(chopstick[(I+1)]%5);
signal(chopstick[I]);
}
}
在本题中,可bai以设置两个信号量S1,S2, S1表示是否允许司机zhi启动汽车,S2表示是否允许售zhuan票员关车门
int s1=1;
int s2=0;
main()
{
cobegin;
driver();
busman();
}
//司机
driver()
{
while(1)
{
p(s1);
启动车辆;
正常运行;
到站停车;
v(s2);
}
}
//售票员
busman()
{
while(1)
{
关车门;
v(s1);
售票;
p(s2);
开车门;
上下乘客;
}
}
}
注意:PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。
linux上进程有5种状态:
ps工具标识进程的5种状态码
一般情bai况下,当占用处理机的进程因du为某种zhi请求得不到满足而不得不dao放弃CPU进入等待状态时,或zhuan者当时间片到,系shu统不得不将CPU分配给就绪队列中另一进程的时候,都要引起处理机调度。除此之外,进程正常结束、中断处理等也可能引起处理机的调度。因此,处理机调度是操作系统核心的重要组成部分,它的主要功能如下
1、高级调度
高级调度发生在作业对应的新进程创建中,它决定一个进程是否被创建,或者创建后知否能被置为就绪状态,以参与竞争处理机资源从而获得运行。作业是用户要求计算机系统完成的工作,新提交的作业被输入到外存,并保存到批处理后备作业队列中。高级调度根据一定的算法从后备的作业队列中选出若干作业,并分配给必要的资源,为它建立相应的用户作业进程和为其服务的系统进程,最后把它们的程序和数据调入内存,等待进程调度程序对其进行调度。
2、中级调度
中级调度是为了使内存中同时存放的进程数目不至于太多,有时需要把某些进程从内存中移到外存中,以减少多道程序的数目。特别是在采用虚拟存储技术的系统中或分时系统中。引入中级调度的主要目的是为了提高内存的利用率和系统吞吐量。它实际上就是存储器中的对换功能。
3、低级调度
低级调度的主要功能是根据一定的算法将CPU分派给就绪队列中的某个进程(或内核级线程)。执行低级调度功能的程序称作进程调度程序,由它实现CPU在进程间的切换。低级调度的运行频率很高。在一般的操作系统中必须要有低级调度(进程调度),而且其调度策略的优劣直接影响整个系统的功能。
三级指的是:
必不可少的是:进程调度
原因:
又称中程调度、交换调度。主要任务是按照给定的原则和策略,将处于外存对换区中的重又具备运行条件的进程调入内存,或将处于内存的暂时不能运行的进程交换到外存对换区。
又称进程调度、短程调度、微观调度。主要任务是按照某种策略和方法从就绪队列中选取一个进程,将处理机分配给它。是操作系统中最基本的一种调度,在一般操作系统中都必须配置进程调度。
低级调度是必不可少的。因为是操作系统中最基本的一种调度。
不会,到了执行阶段才会有机会被分到内存,在这之前还得经历后备状态,在输入管理系统将所有的作业信息输入到外存中对应的输入井中,才会到作业调度程序取出,进入执行状态
调度方式
调度算法的评价准则
什么是实时调度
实时调度是为了完成实时处理任务而分配计算机处理器的调度方法
区别
1,批处理操作系统
批处理(Batch Processing)操作系统的工作方式是:用户将作业交给系统操作员,系统操作员将许多用户的作业组成一批作业,之后输入到计算机中,在系统中形成一个自动转接的连续的作业流,然后自动操作系统,系统自动、依次执行每个作业。最后由操作员将作业结果交给用户。
批处理操作系统的特点是:多道和成批处理。
2.分时操作系统
分时(Time Sharing)操作系统的工作方式是:一台主机连接了若干个终端,每个终端有一个用户在使用。用户交互式地向系统提出命令请求,系统接受每个用户的命令,采用时间片轮转方式处理服务请求,并通过交互方式在终端上向用户显示结果。用户根据上步结果发出下道命。分时操作系统将CPU的时间划分成若干个片段,称为时间片。操作系统以时间片为单位,轮流为每个终端用户服务。每个用户轮流使用一个时间片而使每个用户并不感到有别的用户存在。分时系统具有多路性、交互性、“独占”性和及时性的特征。多路性指,伺时有多个用户使用一台计算机,宏观上看是多个人同时使用一个CPU,微观上是多个人在不同时刻轮流使用CPU。交互性是指,用户根据系统响应结果进一步提出新请求(用户直接干预每一步)。“独占”性是指,用户感觉不到计算机为其他人服务,就像整个系统为他所独占。及时性指,系统对用户提出的请求及时响应。它支持位于不同终端的多个用户同时使用一台计算机,彼此独立互不干扰,用户感到好像一台计算机全为他所用。
常见的通用操作系统是分时系统与批处理系统的结合。其原则是:分时优先,批处理在后。“前台”响应需频繁交互的作业,如终端的要求; “后台”处理时间性要求不强的作业。
3.实时操作系统
实时操作系统(RealTimeOperatingSystem,RTOS)是指使计算机能及时响应外部事件的请求在规定的严格时间内完成对该事件的处理,并控制所有实时设备和实时任务协调一致地工作的操作系统。实时操作系统要追求的目标是:对外部请求在严格时间范围内做出反应,有高可靠性和完整性。其主要特点是资源的分配和调度首先要考虑实时性然后才是效率。此外,实时操作系统应有较强的容错能力。
批处理系统常用调度算法:
①、先来先服务:FCFS
②、最短作业优先
③、最短剩余时间优先
④、响应比最高者优先
分时系统调度算法:
①、轮转调度
②、优先级调度
③、多级队列调度
④、彩票调度
实时系统调度算法:
①、单比率调度
②、限期调度
③、最少裕度法
带权周转时间是指作业的周转时间与系统为它提供服务的时间之比,反映作业(或进程)长短问题。带权周转时间越大,作业(或进程)越短;带权周转时间越小,作业(或进程)越长。
死锁是指多个进程循环等待其他进程占有的资源,因而无期限的僵持下去的局面.
产生的原因有: 各进程之间竞争有限的资源,进程推进顺序不当
必要条件:
预防死锁最容易实现,但是由于这种方法施加的限制条件太严格,可能会导致系统资源利用率和系统吞吐率降低。
避免死锁只需事先加以较弱的限制条件,便可获得较高的资源利用率和系统吞吐率,但在实现上有一定的难度,目前较完善的系统中常用此方法来避免发生死锁。
请求进程\资源 | 最大资源需求量 | 已分配资源数量(allocation) | ||||
A | B | C | A | B | C | |
P1 |
5 |
5 | 9 | 2 | 1 | 2 |
p2 | 5 | 3 | 6 | 4 | 0 | 2 |
p3 | 4 | 0 | 11 | 4 | 0 | 5 |
p4 | 4 | 2 | 5 | 2 | 0 | 4 |
p5 | 4 | 2 | 4 | 3 | 1 | 4 |
available=max-allocation=(17,5,20)-(15,2,17)=(2,3,3)
所以系统是安全的,安全序列为:4,3,1,2,5 不知道是不是对的欢迎指正
(2) 不能分配,因为此时的可用资源是(2,3,3)而P2进程的need资源是(1,3,4)不够所以不会给它分配资源,继续等待
目的: 是为了方便用户和提高内存的利用率
任务: 管理内存空间,进行虚拟地址到物理地址的转换,实现内存的逻辑扩充,完成内存的共享和保护
静态,动态和非连续
采用"紧凑"技术把碎片连接成一个大的空闲区能够满足作业对连续内存空间的要求,这样就可以解决按区分配中存在的碎片问题.但这是以花费CPU的时间为代价换来的,这种办法只有在分配区数目不太多.而且分配不太频繁的情况下采用,为此,很容易想到让程序不连续存放,例如,有一个作业要求运行,其程序的地址段
参考文章:
https://blog.csdn.net/qq_43606914/article/details/105836815
https://blog.csdn.net/syzdev/article/details/104898592/
https://www.cnblogs.com/pesuedream/p/10976756.html
https://wenwen.sogou.com/z/q121904809.htm
https://www.cnblogs.com/52Cyan/p/3663422.html
https://blog.csdn.net/weibo1230123/article/details/82187572
https://zhidao.baidu.com/question/717631877792753285.html
https://blog.csdn.net/xieminyao123/article/details/79116985 !important