关于Linux进程那些事儿

你了解进程吗?

从用户的角度来看,进程是程序的一次动态执行过程;

从内核的角度来看,进程是资源分配的基本单位,每个进程都有其独立的虚拟地址空间。

那你知道如何管理一个进程吗?

将一个进程管理起来,需要做以下两件事情:

1.程序加载到内存中,先将进程描述起来,进程信息被放在一个叫做进程控制块的数据结构中,称为PCB,在Linux中,描述进程的PCB结构体叫做task_struct。

2.再将结构体组织起来,Linux中是使用双链表的形式存在内核中的。

对于task_struct内容你了解多少呢?

1.标识符:描述本进程的唯一标识符,用来区别其它进程

2.状态:任务状态、退出代码、退出信号等

3.优先级:相对于其它进程的优先级

4.程序计数器:程序中即将被执行的下一条指令的地址

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

6.上下文数据:进程执行时处理器的寄存器中的数据,例如,进程切换时,要保存上下文数据以及恢复上下文数据

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

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

对于进程的调度算法你了解吗?

1、先来先服务调度算法(FCFS,first come first served):谁第一个排队,谁就先被执行,在它执行过程中,不会中断它;

2、短作业优先调度算法(SJF,shortest job first):对预计执行时间短的进程有限分配处理机,通常后来的短进程不会抢先正在执行的进程;对长进程非常不利,可能长时间得不到执行。

3、高响应比优先法(HRRN,highest response radio next):对于FCFS和SJF的平衡,FCFS方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJF只考虑了执行时间而未考虑等待时间的长短,因此两种算法在某种极端的情况下会带来某些不便。HRRN通过综合这两种情况算出响应比R,根据响应比完成调度。优点:长作业也有机会投入运行,缺点:每次调度前要计算响应比。

4、时间片轮转法(RR,Round-Robin):采用剥夺方式,每个进程被分配一个时间段,按照在队列中的顺序交替执行;不利于处理紧急作业。

5、多级反馈队列(multilevel feedback queue): UNIX使用这种调度算法;进程在进入待调度的队列等待时,首先进入优先级最高的Q1中等待;首先调度优先级高的队列中的进程。若高优先级队列中已经没有调度的进程,则调度次优先级队列的进程;同一队列中的各个进程按照时间片轮转调度;在低优先级队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业(剥夺)。

对于僵尸进程(Z)和孤儿进程你了解多少呢?

僵尸进程:只要子进程退出,父进程在运行,父进程没有读到子进程的状态,子进程就会进入僵尸状态;

下面用一段代码模拟实现进程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(void)
{
  pid_t pid=fork();
  if(pid>0){
   printf("This is parent!\n");}
  else if(pid==0){
   printf("This is child!\n");
   sleep(3);
   exit(EXIT_SUCCESS);}
}

孤儿进程:父进程死亡,子进程变成孤儿进程,最后由1号进程领养,代码模拟如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(void)
{
  pid_t pid=fork();
  if(pid>0){
   printf("This is parent!\n");
   sleep(3);
   exit(0);}
  else if(pid==0){
   printf("This is child!\n");
   sleep(3);}
}

关于setenv, export等环境变量相关的函数和命令你熟悉吗?

int setenv(const char *name, const char *value, int overwrite);
//函数功能:增加或改变环境变量,注意:通过setenv函数设定的环境变量只在本进程并且只在本次执行中有效
//参数:
//value:变量内容
//overwrite:决定是否要改变已经存在的环境变量

关于export

将我们的程序所在路径加入环境变量PATH当中,export PATH=$PATH:hello

export用于导出环境变量,把本地变量导成环境变量。

猜你喜欢

转载自blog.csdn.net/weixin_40123831/article/details/81185235