关于计算机操作系统的进程线程的个人看法理解

来源:互联网 发布:双色球算法必中6红预测 编辑:程序博客网 时间:2024/05/23 01:58

  所谓的进程,用我的话来讲就是一个程序进行一次活动,跟程序既有联系又有区别,分为三个状态,就绪状态、运行状态、等待状态(阻塞状态)。当你需要一个活动的时候就会创建一个进程,被创建后就进入就绪状态,直到该进程被调度,在处理机上运行就进行运行状态,在运行过程中,可能需要什么输入输出的操作,这时候就要进行等待状态,等重新调度程序后才继续进行运行状态。

进程包括程序段和进程控制块PCB,对进程实施有效的控制可以更高效进行程序运行。

我们知道计算机可以同时有很多个进程在运行,它们可能会在系统资源上竞争,为了避免这些影响,就要协调进程。系统中存在临界资源,就是一次只能允许一个进程使用的资源,这时候就必须要对进程进行协调,就引入了互斥和同步的概念。

互斥:假如有两个并发进程,其中一个进程在访问某个存储区域的时候,另一个进程只能等那个进程完成后才能读取该存储区的内容。

同步:两个并发的进程,要完成一个任务,要互相等待和互通消息,也就是其中一个进程完成到一个点时要另一个进程的信息,这时候就要等待,直到另一个程序发出消息。

那么操作系统就要实现这两个关系才能使程序正常运行。就有了锁和信号灯两个操作。锁:以0表示资源可用,1表示资源被占用,要用的时候就上锁,用完后解锁。  信号灯:分为P操作和V操作,P操作取信号灯值减1,若结果大于等于0则进程执行,反之不执行。V操作取信号灯值加1,若结果大于0则进程执行,反之不执行。互斥很好实现,我主要讲一下同步的实现,利用P、V操作。

</pre><pre name="code" class="plain">main(){      int s1=0;                  <span style="font-family: Arial, Helvetica, sans-serif;"> /*表示有无化验单*/</span>      int s2=0;                 <span style="font-family: Arial, Helvetica, sans-serif;"> </span><span style="font-family: Arial, Helvetica, sans-serif;">/*表示有无化验结果*/</span>      cobegin               a();                            b();                  coend}a()       while(化验工作未完成)        {               P(s1);               化验工作;               V(s2);          }}b(){          while(看病工作未完成)          {                    看病;                    V(s1);                    P(s2);                    诊断;           }}}
上面是就诊的例子,首先cobegin和coend之间的两个函数表示并行的,s1和s2就是相当于信号值,两个进程开始运行,P(s1)的时候s1要减1,小于0,则进程不能运行,要等待,所以a()在P(s1)的时候就进入等待状态。然后看b(),V(s1)操作然后s1加1,这时候上面a()中的P(s1)的值刚好等于0,程序能执行了,而b()中运行到了P(s2),值小于0不能继续运行,要等待。然后b()就在等待状态,a()开始进入运行状态,化验工作完成后进行V(s2)操作,这个操作让b()开始运行,接着往下运行就完成了就诊的操作。再仔细理解一下,就会知道顺序是看病之后进行化验工作,完成后进行诊断。就实现了进程的同步。所以在适当的位置增加P、V操作能更好的调度程序。


线程:进程中的一个执行路径。一个进程有很多的线程,每个线程独立活动的话就能加快处理速度,提高系统的并行处理能力。

接下来我讲一下我当时难理解的一个操作系统并发机制的例子。


用户要创建一个进程要调用fork。调用fork的进程为父进程,新创建的进程叫子进程,子进程有一个唯一的进程标识号PID,子进程中PID的值为0。

main(){        pid_t child;        int i=2;
        if((child=fork())==-1){
                  printf("fork error.\n");
                  exit(0);
        }        if(child==0){                i=i+3;                printf("i=%d\n",i);        }        i=i+5;        printf("i=%d\n",i);}

以上是一个Linux程序一部分,输出结果i的值的顺序有三种,5 10 7,7 5 10,5 7 10。一开始我不明白的是为什么输出会有三个值,在这个程序中不管怎么样最多也就两个输出。经过仔细的理解,因为调用了fork,所以会创建出一个进程,这两个进程会和其他进程一起开始并发执行。在上面提到过,子进程的PID的值为0,所以在子进程中child是等于0的,也就是子进程会运行if(child==0)这一段if语句,所以子进程有两个输出,而父进程是不会运行那个if(child==0)语句的,所以只有一个输出,为什么会有三个结果呢,因为是并发的,不知道究竟哪个进程快,可能子进程全部执行后父进程才进行,也可能父进程执行后子进程才执行,也有可能子进程完成了一个输出,父进程就开始执行输出,接着子进程执行下一个输出。所以才会有三种结果。

  

以上是我对进程线程的一些理解,如果有哪里说得不够好或者不对的地方,欢迎指出,谢谢。


0 0
原创粉丝点击