今天我来总结一下有关进程的知识,希望大家能多多游览学习。
首先在我们学习进程前得了解冯诺依曼结构,这对我们有很大的帮助。
一。进程的概念
进程:从用户角度来看,它就是程序一次动态的执行过程;也是操作系统分配资源的基本单位,还是最小单位。并且它还有自己的运行状态和虚拟的地址空间。
二。进程的描述
进程控制块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 }
以上就是我对进程的基本知识总结。