Linux中进程的基本概念

进程是什么?
  • 说简单一点就是正在运行中的程序。
  • 站在内核的角度,进程是分配系统资源(CPU时间、内存)的实体。
  • 进程把自己的信息全部放在一个结构体当中,这个结构体叫做进程控制块。也可以理解为进程的属性集合。我们称进程控制块为:PCB(process control block)。在linux下的PCB是task_struct。task_struct中的所有信息:http://www.cnblogs.com/tongyan2/p/5544887.html
  • 那么操作系统就使用PCB(进程控制块)来管理运行中的程序。
  • 进程控制块中的描述信息包括:
    • 标识符: 描述本进程的唯一标识符,⽤用来区别其他进程。
    • 状态: 任务状态,退出代码,退出信号等。
    • 优先级: 相对于其他进程的优先级。
    • 程序计数器: 程序中即将被执⾏的下一条指令的地址。
    • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
    • 上下文数据: 进程执行时处理器的寄存器中的数据
    • I/O状态信息: 包括显⽰示的I/O请求,分配给进程的I/O设备和被进程使⽤的文件列表。
    • 记账信息: 可能包括处理器时间总和,使⽤的时钟数总和,时间限制,记账号等。
    • 其他信息,暂时不学习他。
进程:站在用户角度,进程是运行中的程序。站在操作系统角度,进程好像C++中一个一个的类一样。这些类中有各种各样的描述进程的东西,当然还有各种各样的方法用来去为用户做事情。当然操作系统管理着这些类,让这些类运行或者不运行。那么这个类就叫做PCB,在Linux下叫做task_struct,所以我们可以说task_struct就是一个进程。所有task_struct都是以双向链表链接这进行组织。
  • 专业一点就是,操作系统运行一个程序需要描述这个程序的运行过程。而这个描述是通过一个结构体来描述的,在linux下是task_struct,我们把这个描述统称为PCB(进程控制块)。因此对操作系统来说,进程就是PCB。

查看进程

  • 进程的信息可以通过 /proc 系统⽂文件夹查看
    在这里插入图片描述- 比如我们写一个程序test。然后查看这个进程
    在这里插入图片描述
进程标识
  • 每个进程都有一个非负整数表示的唯一进程ID。因为进程ID标识符总是唯一的,常将其作为其他标识符的一部分以保证其唯一性。
  • 虽然是唯一的,但是进程ID是可复用的,当一个进程终止后,其进程ID就称为复用的候选者。
  • 系统中有一些专用进程,但具体细节随实现而不同。ID为0的进程通常是调度进程,常常被称为交换进程。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。进程ID为1通常是init进程,该进程负责启动一个Linnx系统。init通常读取与系统有关的初始化文件。init进程绝对不会终止,他是一个普通的用户进程(他不是内核进程)。但是它以超级用户特权运行。(比如init可能成为所有孤儿进程的父进程)。
#include<unistd.h>
pid_t getpid(void);    //返回值:调用进程的进程ID
pid_t getppid(void);	 //返回值:调用进程的父进程ID
函数fork
#include<unistd.h>
pid_t fork(void);    //返回值:子进程返回0,父进程返回子进程ID,出错,返回-1
  • 调用完了之后,子进程和父进程继续执行fork调用之后的指令。子进程是父进程的副本。例如:子进程获得父进程数据空间、堆、栈的副本。注意:这是子进程所拥有的副本。父进程和子进程并不共享这些存储空间部分。父进程和子进程共享正文段。

  • 由于在fork之后经常跟随着exec,所以现在的很多实现并不执行一个父进程数据段、栈、堆的完全副本。作为替代,使用了写时拷贝技术。这些区域由父进程和子进程共享,而且内核将他们的访问权限改变为只读。如果父进程或者子进程中的任一个试图修改这些区域,则内核只为修改区域的那块内存制作一个副本,通常是虚拟存储系统的一页。

  • fork之后的父子进程的相同

    • 打开的文件描述符
    • 实际用户ID、实际组ID、有效用户ID、有效组ID
    • 附属组ID
    • 进程组ID
    • 会话ID
    • 控制终端
    • 设置用户ID标志和设置组ID标志
    • 当前工作目录
    • 根目录
    • 文件模式创建屏蔽字
    • 信号屏蔽和安排
    • 对任一打开文件描述符的执行时关闭标志
    • 环境
    • 连接的共享存储段
    • 存储映像
    • 资源限制
  • 父子进程之间的区别

    • fork的返回值不同
    • 进程ID不同
    • 他们各自的父进程ID不同
    • 子进程不继承父进程设置的文件锁
    • 子进程的未处理闹钟被清除
    • 子进程的未处理信号集设置为空集
  • 使fork 失败的两个主要原因是:

    • 系统中已经有了太多的进程
    • 该实际用户ID的进程总数超过了系统限制。
函数vfork
  • vfork与fork基本上是一样的。说一下他们的不同之处就好了
  • 1、vfork与fork一样都会创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(exit),于是也就不会引用该地址空间。不过在子进程中调用exec或者exit之前,他在父进程中运行。如果子进程修改了数据、进行函数调用或者没有调用exec或者exit 就返回都可能会带来未知的结果。
  • 2、vfork保证子进程先运行,在他调用exec或者exit之后,父进程才能被调度运行,当子进程调用这两个函数中的任意一个时,父进程会恢复运行。
进程状态
  • R运⾏状态(running): 并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏队列⾥里。
  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这⾥的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运⾏。
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表⾥里看到这个状态。
  • Z僵死状态(Zombies)是⼀个比较特殊的状态。当进程退出并且⽗进程没有读取到⼦进程退出的返回代码时就会产生僵死(⼫)进程。僵死进程会以终⽌状态保持在进程表中,并且会⼀直在等待父进程读取退出状态代码。所以,只要子进程退出,⽗进程还在运行,但父进程没有读取子进程状态,⼦进程进入Z状态。
  • 孤儿进程,父进程先退出,子进程就称之为“孤儿进程”。孤儿进程被1号 init 进程领养,当然要有init进程回收。
僵尸进程:子进程先于父进程退出,操作系统检测到进程的退出,通知父进程,但是父进程这时候没有管这个通知,这时候操作系统为了封锁现场,不会释放子进程资源,因为子进程的PCB中包含有退出原因。这时候因为既没有运行也没有完全退出,因此成为僵死状态,成为僵尸进程。子进程不退出就是为了保存退出原因给父进程看。会造成操作系统的资源泄露。
进程优先级
  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权⾼的进程有优先执行权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以⼤大改善系统整体性能。
  • 我们使用ps -l来查看进程信息。
    在这里插入图片描述
UID : 代表执⾏行者的⾝身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍⽣生⽽而来的,亦即⽗父进程的代号
PRI :代表这个进程可被执⾏行的优先级,其值越⼩小越早被执⾏行
NI :代表这个进程的nice值
  • 调节优先级:PRI值越⼩越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
  • 在Linux下,调整进程nice值,可以改变进程的执行优先级。nice其取值范围是-20⾄至19,⼀共40个级别。
    注意:进程的 nice 值不是进程的优先级,他们不是一个概念,但是进程 nice 值会影响到进程的优先级变化。可以理解 nice 值是进程优先级的修正数据。
  • 调节优先级:
    • 对于未执行程序,直接使用nice命令指定nice值: nice -n -5 ./test
    • 对于正在执行中的程序,使用renice命令来指定nice值:renice -5 -p 5200 //PID为5200的进程nice设为-5
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值