Linux进程

1.进程基本概念

a.程序的一个执行实例,正在执行的程序。
b.(内核的角度)担当分配系统资源(CPU时间,内存)的实体。

2.进程组成

PCB,虚拟地址空间,页表,映射关系。

3.管理方式:先描述再组织。

先用结构体将进程描述,再使用合适的数据结构将这些结构体描述块组织起来。

1)描述进程

a.进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
b.Linux操作系统下的PCB是task_struct.(它定义在linux-2.6.38.8/include/linux/sched.h文件中) ,task_struct是linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

  • task_struct内容分类

    a.标识符:描述本进程的唯一标识符,用来区别其他进程
    b. 状态:任务状态,退出代码,退出信息
    c. 优先级:相对于其他进程的优先级
    d. 程序计数器:程序中即将被执行的下一条指令的地址。
    e. 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
    f. 上下文数据:进程执行时处理器的寄存器中的数据
    g. I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
    h. 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
    i. 其他信息

2)组织进程

可以在内核源代码里找到它,所有运行在系统里面的进程都以task_struct链表的形式存在内核中。

4.查看进程

进程的信息可以通过/proc系统文件夹查看
a.如:要获取PID为1的进程信息,你需要查看/proc/1这个文件夹。
b.大多数进程信息也可以使用top/ps用户级工具获取

<1>使用`ps aux | grep 文件1 | grev -v grep命令获取文件1的进程信息

ps指针:寄存器当前正在执行指令的下一条指令的地址
时间片:一个进程占有CPU资源的基本单位

<2> top:动态查看进程的变化

参数:
-d:后面直接加秒数,表示显示整个进程界面更新到的秒数,如top -d 3每三秒更新一次
-b:以批次的方式执行top
-n:与-b搭配,表示需要几次top输出的结果
-p:指定某个特定的PID进行检测

5.通过系统调用获取进程标识符号

a.进程id(PID)
b.父进程id(PPID)

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
  printf("pid: %d\n",getpid());
  printf("ppid: %d\n",getppid());
  return 0;
}

6.进程的状态

1)常见状态

1.R运行状态(running):并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列中。
2.S睡眠状态(sleeping);意味着进程在等待事件完成(这里的睡眠有时候也叫作中断睡眠)(interruptible sleep)(浅度睡眠,可以被kill -9 杀掉)
3.D磁盘休眠状态:不可中断睡眠状态,在这个状态的进程通常等待IO的结束(硬盘访问中可能遇到),不可以被杀掉
4.T停止状态:可以通过发送SIGSTOP信号给进程来停止(T)进程,这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。
5.X死亡状态:这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

2)进程状态修改

1.kill -9 进程 :杀死进程
2.kill -SIGSTOP 进程:使进程变为T状态
3.kill -SIGCONT 进程:使T状态进程继续运行
4.kill -l 查看系统支持的信号列表

7.僵尸进程

1)概念

a.僵尸状态是一个比较特殊的状态,当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回码时就会产生僵尸进程。
b.僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
c.所以只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

2)僵尸进程的危害

(1)退出状态本身就是要用数据去维护的,也属于进程信息,所以保存在task_struct(PCB)中,那么z状态一直不退出,PCB就一直要维护
(2)当一个父进程创建了很多子进程,但却一直没有回收,这样就会造成内存资源的浪费。(因为数据结构本身就要占用内存)
(3)如果父进程不去回收子进程,还会造成内存泄漏

3)怎样避免僵尸进程

1)父进程通过wait和waitpid等函数等待子进程的结束,这样会导致父进程挂起
(2)倘若父进程非常忙,那么可以用singal函数为SIGCHLD安装handler(因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收)
(3) 如果父进程不关心子进程什么时候结束,那么可以signal(SIGCHLD,SIG_IGN) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送信号。
(4)fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还是需要自己做。

4)代码实现

#include<stdio.h>     
#include<stdlib.h>
#include<unistd.h>

 int main()
{
    pid_t pid = fork();
    if(pid < 0){ 
        perror("fork");                                                         
        return 1;
    }else if(pid > 0){
        printf("parent : %d\n", getpid());
        sleep(30);
    }else{
        printf("child : %d\n",getpid());
        sleep(5);
    }   
}


打开两个终端,一个终端编译
在这里插入图片描述
另一个终端进行监视:使用命令:

while :; do ps aux | grep a.out |grep -v grep;sleep 1;echo "######";done    

下图为监控结果可观察到子进程变成了僵尸进程。

在这里插入图片描述

8.孤儿进程

1)概念

孤儿进程就是在其父进程执行完成或被终止后仍然继续运行的一类进程。这些孤儿进程将会被init进程(进程号为1号)所收养,并由init进程对它们完成状态收集工作。因为有init进程会循环的wait()已经退出的子进程,所以孤儿进程并不会产生什么危害。

2)实现

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
  pid_t id = fork();
  if(id<0){
    perror("fork");
    return 1;
  }
  else if(id == 0){//child
     printf("I am child, pid : %d\n",getpid());
     sleep(10);
  }else{//parent
     printf("I am parent, pid : %d\n",getpid());
     sleep(3);
     exit(0);
  }
  return 0;
}


9.进程优先级

1)基本概念

a.cpu资源分配的先后顺序,就是指进程的优先级
b.优先权高的进程优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
c.还可以把进程运行到指定的cpu上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

2)使用命令ps -l

会输出下面内容
在这里插入图片描述

a.UID :代表执行者的身份
b.PID:代表这个进程的代号
c.PPID:代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
d.PRI:代表这个进程可被执行的优先级,其值越小越早被执行
e. NI:代表这个进程的nice值

3)PRI与NI

a.PRI值越小进程的优先级别越高
b.NI也就是要说的nice值,表示进程可被执行的修正数值
c.PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。
d.这样,当nice值为负值时,那么该程序优先级值会变小,即优先级会变高,则其越快被执行。
e.所以,调整进程优先级,在Linux下就是调整nice值
f.nice值的取值范围为-20至19,一共40个级别。

  • 修改进程优先级的命令
    a.启动进程前调整nice:nice -n -调整值 ./test;调整test进程的nice为调整值
    b.调整已经存在进程的nice :renice -调整值 -p 进程1PID;将进程1的nice改为调整值
    c.top命令:top,进入top后按“r”,输入进程PID,输入nice值。

10.杂碎概念

1)竞争性

系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的,为了高效完成任务,更合理竞争相关资源,便具有优先级

2)独立性

多进程运行,需要独享各种资源,多进程运行期间互不干扰

3)并行

多个进程在多个CPU下分别,同时进行运行

4)并发

多个进程在一个CPU下采用进程切换的方式,在这一段时间之内,让多个进程都得以推进。。

11.进程与程序(完成特定任务的一系列指令集合)区别

程序: 数据+代码
进程: 数据+代码+堆栈+PCB

1.进程是动态的,程序是静态的;
2进程的生命周期是短暂的,而程序相对永久;
3.进程有重要的数据结构PCB;
4.一个进程只能对应一个程序
5.而一个程序可以对应多个进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值