热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux:浅析进程(一)

操作系统要说进程必须先讲讲操作系统的问题。1.操作系统概念:任何计算机系统都包含一个基本的程序集合,称为操作系统,笼统的理解ÿ

操作系统

要说进程必须先讲讲操作系统的问题。

1.操作系统概念:任何计算机系统都包含一个基本的程序集合,称为操作系统,笼统的理解,操作系统包括:内核(进程管理、内存管理、文件管理、驱动管理)其他程序(例如shell程序等等)

2.为什么要有操作系统?
操作系统可以与硬件交互,管理所有的软硬件资源,并且给应用程序提供一个好的执行环境。

由此可见操作系统是对软硬件管理的,而管理者与被管理者并不直接打交道。

所以进程也是由操作系统管理的,而操作系统如何管理进程的呢?

3.操作系统如何管理进程
操作系统管理进程的方法就两步,简单的说:①把进程描述起来②把这些描述的进程组织起来

进程

一、进程的基本概念
所谓进程就是一个正在执行的程序,它占有着系统资源(CPU时间,内存等)。

二、操作系统描述进程
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。这个集合也叫作PCB,在Linux操作系统下它的PCB是:task_struct

三、task_struct
task_struct是Linux内核的一种数据结构,它会被装载到内存里并包含着进程的信息,其内容有很多主要有:

  • 标示符:描述本进程的唯一标示符,用来区别其他进程。
  • 状态:任务状态,进程不管在什么情况下都有其状态,退出代码,退出信号等。
  • 优先级:进程在运行的时候也是要遵循优先级顺序的。
  • 程序计数器:程序中即将被执行的下一条指令的地址,类似于EIP的作用。
  • 内存指针:程序代码和进程相关数据的指针。
  • I / O 状态信息:包括显示I/O的请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 其他信息

四、Linux操作平台下组织进程(PCB)
所有运行在系统里面的进程都以task_struct双链表的形式存在内核里。

五、Linux操作平台下查看进程
进程的信息可以通过 /proc 系统文件夹里面查看,里面存储着各个进程的ID(进程的ID又叫做PID)

这里写图片描述

ps 命令 aux显示所有进程信息
这里写图片描述

六、初识 fork()函数

我们先来看一下fork函数的作用:
这里写图片描述
这里写图片描述

由此可以知道,fork函数是产生子进程的函数,他有两个返回值,其中返回给父亲的是子进程的PID,返回给子进程为0。并且在fork之后,子进程与父进程共享一份代码,但是数据各自私有一份。
写时拷贝:当父子之间有一者尝试写入时两者共同进行。

一般在fork()之后利用if语句来分流父子,让父子分别执行不同的代码,这样可以在有些情况下提高运行效率。

示例:
这里写图片描述
这里写图片描述

七、进程的状态

  • R:运行状态,并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  • S:浅度睡眠状态,意味着进程在等待事件完成,但是这个睡眠状态是可以被中断的。
  • D:磁盘休眠状态,也叫作深度睡眠状态,这个状态无法被中断,在这个状态的进程通常会等待IO的结束。
  • T:停止状态,可以通过发送SIGSTOP信号给进程来停止进程,这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。
  • Z:僵尸状态,也就是进程在非正常运行结束以后,这个进程的父进程需要去维护这个进程,即读取这个进程结束的原因,如果父进程一直不去维护,不去读取,那么这个进程就会变成僵尸进程,僵尸进程会造成一定程度的内存泄漏。

这里写图片描述

八、孤儿进程
如果父进程提前退出,那么子进程后退出,进入僵尸状态以后那么该如何处理呢?
如果父进程先退出,那么这时候子进程就称作为“孤儿进程”,如果系统发现孤儿进程,那么这个时候孤儿进程被一号进程所领养,并且如果孤儿进程退出,由一号进程完成之前其父进程所要完成的任务即可。

九、进程优先级
我们之前说过进程在有R状态,但是在R状态的进程不一定就在运行,也有可能在排队,因为进程在运行的时候会有优先级的判断,这里优先级由PRI的值来表示,PRI的值越低,这个进程的优先级也就越高,优先级越高的进程有先执行的权利。

在Linux系统中,输入 ps -l 命令则会输出关于进程的 一些信息,如下图:
这里写图片描述

我们可以看到在最上面一栏里面有着各个列的信息,这些信息分别代表着不同的含义。

  • UID:代表执行者的身份
  • PID:代表这个进程的ID号码
  • PPID:代表这个进程的父进程ID号码
  • PRI:代表这个进程的优先级
  • NI:代表进程的nice值
    上面前四个我们都已经接触到了,就是最后这个nice值是什么意思呢?

其实nice值带便进程可被执行的优先级的修正值,nice值的范围是(-20~19),总共40个级别,也就是说在Linux下我们的PRI最低到达60,最高到达99。(大部分进程都是这样)

修改进程优先级的命令:
nice、renice

启动进程前调整:nice
nice -n -5 ./test 设置nice值为-5
调整已存在进程的nice:renice
renice -5 -p 5200 将PID为5200的进程nice值设置为-5
用top命令更改已存在进程的nice值:
进入top以后按r,输入进程PID,输入nice值即可

十、进程之间还有其他的特性
竞争性:系统进程数目众多,而CPU资源只有少量,甚至一个,所以进程之间是具有竞争属性的。
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。
并行:多个进程在多个CPU下分别同时进行运行,这个称为并行。
并发:多个进程在一个CPU下采用进程切换模式,爱一段时间之内,让多个进程都能够推进,称之为并发。


欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!


推荐阅读
author-avatar
火影白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有