设为首页 加入收藏

TOP

基于toyix的进程和轻权进程的学习(一)
2017-01-02 08:15:12 】 浏览:203
Tags:基于 toyix 进程 学习

我们在平时的计算机课上学习过进程,知道程序的执行的背后其实就是进程在进行一些操作。大家都知道打开windows的任务管理器可以看到正在运行的进程,当程序卡死时,可以在任务管理器里强制关闭相关程序的进程,这样就可以关闭卡死的程序,所以我们知道进程就是程序执行所产生的,但是我们对进程没有很清楚的认识。什么是进程?进程在程序的执行过程中到底起了什么样的作用?我们在toyix平台上来对进程进行研究学习。


Toyix是王爽老师为了进行操作系统基础理论教学而开发的一个系统。它的特点是既能提供良好的编程体验,又不太复杂。Toyix小巧简单,安装包只有几百kb,解压即可使用;兼容Dos的大多数命令,使用的是tc的编译器。系统部分与UNIX、标准c库函数兼容,具有很好兼容性的编程接口。


进程是程序在计算机上的一次执行活动,当运行一个程序,就启动了一个进程。程序运行活动可以用一个进程模型来描述。就是说进程是我们对程序执行过程的描述,举个例子,程序就像是一台音响,进程就是播放音乐这个动作过程。程序是储存在存储空间中的二进制文件,就像音响一样,是看得见、摸得着的,而进程是一个动作、一个过程,是我们只能想象、只能感受和想象的。我们在任务管理器里停止了进程,只是停止了程序的执行,程序本身并没有被删除,这是因为程序是静态的,进程是动态的,停止进程并不会删除它所使用的数据,就像停止播放音乐并不会损坏音响一样。


我们在电脑上所能看到的所有文件都是存储在电脑中的,就比如下面这个程序:



执行过程如下:


在命令行输入do1运行程序,发现这里需要输入一个字符才能继续执行,toyix的进程监视器显示ready的进程是1.



按回车程序继续执行,输出一行字符a,这时进程监视器里的running显示的是1.



最后输出完毕,程序执行完毕,进程监视器里的running显示的是0.



在这个程序的执行过程中,我们可以看到在屏幕上输出a时,进程监视器的running显示的是1,它表示这个程序正在执行中,因为程序里有延时函数delay,所以我们可以很清楚地看到输出a的过程,这就是进程处于执行态。我们可以看到,这个过程是动态的,而且它的状态和结果与程序的代码没有关系,不管它是readyrunning,不管程序执行成功还是失败,程序的代码还是在那里,不会有任何改变,因为它是静态的。即进程的状态和结果与程序本身无关。


再输入do11执行两次程序:



这时ready显示12两个进程号,它表示现在有两个进程等待执行。


按回车让程序继续执行,发现输出了160a,在输出a的过程中有时running1ready2,有时running2ready1,这表示这两个进程在交替执行。如果没有延时函数,也就是如果程序执行的很快,我们会感觉到这两个程序是同时执行的,这就是为什么我们用计算机可以一边听歌一边用文档打字,在计算机上可以同时使用不同的程序,因为程序是通过进程来执行的,而进程的执行有并发性。


为什么进程的执行有并发性?因为进程可以交替执行。为什么进程可以交替执行?因为进程有不同的状态,它可以在不同的状态之间转换达到暂停的效果。那么进程有哪几种状态呢?上图中的进程监视器有runningreadyblocked三个字段,它们表示进程的三种执行状态:执行态、就绪态、阻塞态,这三种状态之间的转换关系可以用下图表示:



我们在上一个程序执行的过程中发现,我们在执行程序后程序的内容还没有开始执行,这时进程监视器显示进程处于ready就绪态,在我们输入一个字符后进程就进入了运行态,运行完毕后退出,也就是说进程在程序开始是就绪态,之后进入运行态,运行完毕后从运行态退出,即进程的起点是就绪态,终点是运行态,我们来看看这三种状态的具体含义:


1、就绪态:进程分配到除CPU以外的所有资源,只要能获得cpu就能执行。


2、执行态:进程获得cpu正在执行。


3、阻塞态:进程因等待某事件而暂停执行。


所以,我们调用一个程序,就创建了一个进程,这时进程分配了所要的内存空间等资源,但是这时还有没执行,因为没有cpu来计算进程的数据得到结果。如果进程分配到了cpu资源就开始执行,进入运行态,如果这时进程执行过程中要等待某事件才能继续执行,比如要用户进行输入,就会进入阻塞态,即处于暂停的状态,直到事件发生,但是这时cpu还在执行其它进程的计算任务,所以这个进程进入到就绪态,直到分配到cpu的资源再进入执行态继续执行。也就是说,就绪态和阻塞态都是缺少一些东西,就绪态是缺少cpu资源,阻塞态是缺少某件事情的发生,只有运行态是具备一切条件,可以顺利执行程序的,所以在正常情况下运行态是进程的出口。


那么为什么进程要从就绪态开始进入,而不是阻塞态进入呢?因为我们在执行程序后,创建进程并分配好所需的一切资源,这时候是不可能缺少外部的事件的,只有当程序开始执行后,才会需要某些事件的发生。也就是说,就绪态需要的是内部资源,即cpu资源,而阻塞态需要的是外部资源,即某些事件的发生。所以在正常情况下就绪态是进程的入口。


所以我们在执行do11时会发现进程1、2在运行态和就绪态之间相互转化,这说明两个进程在交替使用cpu资源。如果一个处于执行态在使用cpu资源,那么另一个就处于就绪态在等待cpu资源。


我们在程序中加入一个getch函数:



执行结果如下:



当程序执行到getch()时等待键盘输入,我们看到这时进程的状态还是运行态,这是为什么呢?为什么这时是等待外部事件发生,但是进程没有转到阻塞态?查询函数手册可知,getch函数是调用进程循环等待,不会使进程进入阻塞态,而get_char会使进程进入阻塞态来等待输入,我们把程序里的getch换成get_char函数执行来看看结果:



可以看到此时的进程处于阻塞态来等待输入。


所以我们在使用相关函数时要注意它是否是一个阻塞函数,要注意阻塞和循环等待的区别。类似的函数还有gets和get_str、wait和sleep等。要注意我们使用get_str时在进行键盘输入就会唤醒进程,即让进程从阻塞态进入运行态,那么对于阻塞的进程,除进程需要的事件发生,可以用其他的方式将进程唤醒吗?查询函数手册可知wakeup函数为唤醒原语,那么可以用wakeup函数唤醒阻塞的进程吗?我在上面程序的getch()改成get_char后调用wakeup函数,结果发现没有起作用,这是因为进程在执行get_char函数后就进入了阻塞态,这时程序不往下执行,所以不会执行wakeup语句。但是因为wakeup是唤醒原语,所以要唤醒一个进程一定会使用它,但是可能是在get_char函数中调用,这涉及到进程的三态模型是通过什么来控制的,进程是操作系统执行程序的一种方式和过程,所以是操作系统控制进程在三种状态之间转换。


我们可以体会一下三态模型的思想:进程执行需要一些外部的操作和内部的资源,就绪态是缺少内部的资源(cpu),这是内因,阻塞态是缺少外部的资源(事件的发生),这是外因,当内因和外因都具备时就可以转到运行态执行了。在这里,cpu资源是最宝贵的,它直接决定了计算机和程序的运行速度,所以进程思想和三态模型的出现都是为了最大程度地分配和利用cpu资源。


进程的创建也是操作系统所要做的工作,当我们执行一个程序时,操作系统

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇配置TC2.0运行环境 下一篇高级语言里的函数在汇编里的实现..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目