有关进程的知识。


今天我来总结一下有关进程的知识,希望大家能多多游览学习。

首先在我们学习进程前得了解冯诺依曼结构,这对我们有很大的帮助。


一。进程的概念

进程:从用户角度来看,它就是程序一次动态的执行过程;也是操作系统分配资源的基本单位,还是最小单位。并且它还有自己的运行状态和虚拟的地址空间。

二。进程的描述

进程控制块PCB。Linux中常用的PCB就是task_struct。

它的内容分类:

(1)标示符:描述本进程的唯一标示符,用来区分其它进程。

(2)状态:任务状态,退出代码,退出信号等。

(3)优先级:相对于其它进程的优先级。

(4)程序计数器:程序中即将被执行的下一条命令的地址。

(5)内存指针:包括程序代码和进程相关数据的指针,还有其它进程共享的内存块的指针。

(6)上下文数据:进程执行时处理器的寄存器中的数据。

(7)I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

(8)记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

(9)其它信息。

三。进程的调度算法

(1)先进先出调度算法(FIFO):按照进程就绪的先后次序来调度进程。

(2)短作业(进程)优先调度算法(SJF SPF):选择就绪队列中估计运行时间最短的进程投入运行。

(3)时间片轮转调度算法(RR-Round Robin)

(4)优先权调度算法(HPF—Highest Priority First):优先选择就绪队列中优先权最高的执行。

(5)高响应比优先调度算法:把CPU分配给就绪队列中响应比最高的进程。

四。进程的特殊情况。

(1)僵尸进程:当进程退出并且父进程没有读到子进程退出的返回代码的进程。

僵死进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。

举例:这个程序是一个维持30秒的僵尸进程。

#include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 
  5 int main()
  6 {
  7         pid_t id=fork();
  8         if(id<0){
  9                 perror("fork");
 10                 return 1;
 11         }
 12         else if(id>0){
 13                 printf("parent[%d] is sleeping...\n",getpid());
 14                 sleep(30);
 15         }
 16         else{
 17                 printf("child[%d] is begin Z...\n",getpid());
 18                 sleep(5);
 19                 exit(EXIT_SUCCESS);
 20         }
 21         return 0;
 22 }

结果:


图上箭头所指的就是僵尸进程的标志。

(2)孤儿进程:父进程先退出,子进程就被称为孤儿进程。

举例:

#include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 
  5 int main()
  6 {
  7         pid_t id=fork();
  8         if(id<0){
  9                 perror("fork");
 10                 return 1;
 11         }
 12         else if(id==0){
 13                 printf("i am child,pid :%d\n",getpid());
 14                 sleep(10);
 15         }
 16         else{
 17                 printf("i am parent,pid :%d\n",getpid());
 18                 sleep(3);
 19                 exit(0);
 20         }
 21         return 0;
 22 }

结果:

五。进程状态。


查看进程的命令:ps -ef | grep a.out

六。环境变量

(1)概念:一般是指在操作系统中用来指定操作系统运行环境的一些参数。

(2)常见的环境变量:PATH*:指定命令的搜索路径;HOME*:指定用户的主工作目录;

         HISTSIZE*:指保存历史命令记录的条数。SHELL*:当前shell,它的值通常是/bin/bash.

(3)查看环境变量:echo $name     //name:你的环境变量名。

        export:设置一个新的环境变量。

        env:显示所有环境变量。

        unset:清除环境变量。

(4)举例应用:

1.用命令行第三个参数获取环境变量:

#include<stdio.h>
  2 #include<stdlib.h>
  3 int main(int argc,char *argv[],char *envp[])
  4 {
  5   int i=0;
  6   for(i=0;envp[i]!=NULL;i++)
  7   {
  8      printf("%d: %s\n",i+1,envp[i]);
  9      }
 10 
 11 
 12 
 13 
 14 }

2.通过getenv获取一个已存在的环境变量:

#include<stdio.h>
  2 #include<stdlib.h>
  3 int main()
  4 {
  5     printf("%s\n",getenv("PATH"));
  6 }

3.通过getenv和putenv获取一个未存在的环境变量。

#include<stdio.h>
  2 #include<stdlib.h>
  3 int main()
  4 {
  5         putenv("kobe=laker");
  6         printf("%s\n",getenv("kobe"));
  7 }

以上就是我对进程的基本知识总结。





猜你喜欢

转载自blog.csdn.net/ymk1507050118/article/details/80961570