前言
在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!”
博客主页:KC老衲爱尼姑的博客主页
博主的github,平常所写代码皆在于此
刷题求职神器
共勉:talk is cheap, show me the code
作者是爪哇岛的新手,水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
刷题求职神器
在下给诸位推荐一款巨好用的刷题求职神器,如果还有小伙伴没有注册该网站,可以点击下方链接直接注册,注册完后就可以立即刷题了。
传送门:牛客网
先来思考一个问题,什么是程序?程序等于数据+指令,举个例子,qq具有删除好友的功能,当你高兴时好友就是躺在列表中的数据(本质上是数据,只不过为了用户体验,整了图形化),当你不高兴了你就可以把他删除(指令)了。在早期时计算机只是处理单道程序,即CPU为它服务,内存被它一个人占了,IO设备也是为了服务,总之在一个程序在内存中运行时,计算机的一切都是它的,而程序被加载到了内存中其实它有2个去处,一个是位于低地址处的程序段(保存指令序列),一个是位于高地址处的数据段(存放程序中的数据)。随着多道程序设计的引入,内存中同时可以放入多道程序,各个程序的代码,运算数据存放的位置不同。并且程序又是并发的执行,那么操作系统是怎么找到各程序存放的位置?除此之外系统中的IO设备以及其它的资源都有可能分配给不同的程序而每一个运行的程序分配了什么样的资源这些信息也是需要被记录下来,这样才能方便操作系统的管理,因此引入了进程,进程实体的概念。操作系统会给每一个即将执行的程序配置一个数据结构(链表),称为进程控制块(PCB),用来描述进程的各种信息(进程代码存放的位置,资源分配情况)
程序段,数据段,PCB三部分组成了进程实体(进程映像)。一般情况,进程实体就是进程。简单而言进程就是一个正在运行的程序,当双击qq的可执行文件(exe),操作系统就会把该程序加载到内存中,然后再分配各种各样的资源,这个exe程序就跑来了,所以进程就是一个正在跑的程序或者是一个任务。
可以打开电脑上的任务管理器.就能查看我们电脑的进程
注意
进程(进程实体)由程序段,数据段,PCB三部分组成,如下图所示。
进程标识符PID:当进程创建时,操作系统会为该进程分配一个唯一的,不重复,用于不同区别进程。
用户标识符UID:标识进程的用户
各种寄存器的值:当进程需要切换时需要把当前的进程运行情况记录下来保存在PCB中,此操作相当于魔兽世界玩到一半不玩了,为了下次能继续玩就得存档,进程也是如此,可能程序执行到一半,数据处理到一半,为了下次能接上所以需要保存。
内存指针:指明该进程的指令存放位置,数据存放位置以及维护运行转态。
文件描述表:文件描述表可以看做是一个结构体数组,数组内容则是存放进程打开文件后以及操作文件(存放在硬盘上的数据)的信息。数组的下标则是文件描述符。
下面一些属性时有关进程调度的
进程调度
首先要明确进程调度的最小单位是线程,而进程是包含下线程的,接下来为了更加方便的说明进程的调度,就假设此处的进程有且只有一个线程,这样就可以将线程的调度试做进程的调度。操作系统作为计算机的管理者,在线程的调度上堪称时间管理大师以及海王。假设目前有三个线程A,B,C分别看做是最帅的男人,最有前的男人,最会舔的男人。而操作系统则是有才华,有颜值的小姐姐。因为小姐姐是海王,想和这三个男孩子谈恋爱,但是她又不能让男孩子认为她是渣女,所以就提前规划好与这些男孩子的约会时间,并用小本本记录下来以及记录她和三个男孩子之间的一些事,避免日后翻车。因为小姐姐特别喜欢有钱的,其次是帅的,然后是会舔的。所以她对三者有着明确的优先级,因此将周一至周三的时间和有钱的男孩子逛街,周四和周六和最帅的男孩子玩,周天呢就和会舔的男孩子聊天。这就是进程的调度。
进程的优先级:像上述列子,就是操作系统将进程排好等级,优先级高的先执行 ,优先级低的后执行。
进程的上下文:进程可能执行到一半就暂停实行了,因此需要保存当前的状态,以便后续进程再次被调度时,能够接着执行。
进程的记账信息:统计进程的执行时间,进程的执行指令的条数等,是进程都尽可能的都被调度,也就是雨露均沾。
在一个操作系统中,通常有上百乃至上千个PCB。因此需要对进行有效的管理。进程的组织有两种组织方式,一种是链接方式,一种是索引方式。
按照进程状态将PCB分为多个队列。操作系统持有指向各个队列的指针。如下图所示。
1根据进程状态不同,建立索引表。2操作系统持有执行各个索引表的指针。如下图所示。
进程是程序的一次运行。在这个运行的过程中,有的进程正在被CPU处理,有的进程需要等待CPU服务,由此可见,进程的状态是会有各种各样的变化。为了对个个进程进行管理,操作系统将进程合理的划分为几种状态。
进程间的转换如图所示
注意
简单理解,进程控制就是要实现进程状态转换
图解进程的组织
说明
首先创建进程,有了进程后需要修改PCB的内容和相应的队列就可以从创建态–>就绪态,进程处于就绪态时就可以被调度和切换,当就绪态–>运行态也需要修改PCB内容以及调整到相应的队列,运行态的进程如若正常完成或者异常结束,都需要回收资源以及撤销PCB。而运行态–>就绪态或者运行态—>阻塞态需要保存运行环境和需要修改PCB的内容,同时调整到对应的队列。阻塞态–>就绪态同样也是修改PCB内容和相应队列。上述的进程状态的切换都涉及PCB的修改以及出队入队的操作,假如一旦这些操作出了问题,就会导致进程的崩溃。为了准确的实现进程的切换,原语就产生了。
原语采用关中断指令和开中断指令实现
在执行原语代码之前会先执行关中断指令然后执行原语代码,指向原语代码过程中如果收到了外部中断信号会被直接忽略,当执行完开中断指令后外部信号才会被接收进而运行中断程序。
创建原语
步骤如下
引起进程创建的事件
撤销原语
步骤如下
引起进程终止的事件
步骤如下
引起进程阻塞的事件
步骤如下
引起进程唤醒的事件
无论何种原语,都是做一下三件事
字面意思就是进程之间的信息交换
因为各个进程所有的内存地址空间是相互独立的,一个进程是不能直接访问另一个进程的地址空间。但是进程之间的信息交换又是必须是实现的,为了保证进程间的安全通信,操作系统提供了一些解决方法。
两个进程对共享空间的访问必须是互斥的。当进程1在往共享空间里面写数据时,进程2是不被允许访问该空间。
共享空间
1.基于数据结构的共享
比如共享空间里面只能存放一个长度为10的数组。这种方式速度慢,是一种低级通信方式。
2.基于存储区的共享
在内存中划分出一块专门共享的存储区,里面的数据形式,存放的位置都由进程控制。相对于基于数据结构的共享,此种方式速度快,是一种高级通信。
管道是指用于连接读写进程的一个共享文件。本质是在内存开辟一个大小固定的缓冲区。
注意
进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的发送消息/接收消息两个原语进行数据交换
格式化消息包含2部分,一部分为消息头,一部分为消息体。其中消息头包含发送进程ID,接收进程ID,消息类型等信息
进行1若给向进程2传递信息,首先会创建格式化信息,然后通过发送原语告知进程2,进程2使用接收原语,将进程1产生的格式化消息插入进程2的消息缓冲队列中的队列.然后进程2依次接收消息对列中的消息。
消息要发送中间实体(信箱)中,因此这种方式也被称为信箱通信方式。举个栗子,进程1通过发送原语将消息传递到信箱中,然后进程2使用接收原语从信箱中拿到属于自己的消息。
最后的话
各位看官如果觉得文章写得不错,点赞评论关注走一波!谢谢啦!。如果你想变强那么点我点我 牛客网。