Linux进程概念(上)

这篇具有很好参考价值的文章主要介绍了Linux进程概念(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux进程概念(上),Linux,linux,运维,服务器
哈喽大家好,我是 鹿九丸 \color{red}{鹿九丸} 鹿九丸,今天给大家带来的是Linux进程概念(上)。
如果大家在看我的博客的过程中或者学习的过程中以及在学习方向上有什么问题或者想跟我交流的话可以加我的企鹅号: 2361038962 \color{red}{2361038962} 2361038962,或者寄邮件到相应的邮箱里: 2361038962 @ q q . c o m \color{red}{2361038962@qq.com} 2361038962@qq.com,我会尽量帮大家进行解答!

冯诺依曼体系结构

Linux进程概念(上),Linux,linux,运维,服务器

输入:键盘、话筒、摄像头、磁盘、网卡…

输出:显示器、音响、磁盘、网卡…

(运算器 + 控制器)[CPU]:

存储器:内存

问:为什么要有内存?

答:技术角度:cpu的运算速度 > 寄存器的速度 > L1~L3 Cache > 内存 >> 外设(磁盘)>> 光盘磁带

从数据角度,外设几乎不和CPU直接进行交互,直接和内存直接交互,CPU也同样如此。

成本角度:寄存器 >> 内存 >> 磁盘(外设)

注意:几乎所有的硬件,只能被动的完成某种功能,不能主动的完成某种功能,一般都是要配合软件完成的(OS + CPU)。

操作系统(Operator System)

概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:

  • 内核(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(例如函数库,shell程序等等)

设计OS的目的

  • 与硬件交互,管理所有的软硬件资源
  • 为用户程序(应用程序)提供一个良好的执行环境

定位

  • 在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件

Linux进程概念(上),Linux,linux,运维,服务器

总结

计算机管理硬件

  1. 描述起来,用struct结构体
  2. 组织起来,用链表或其他高效的数据结构

系统调用和库函数概念

  • 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分 由操作系统提供的接口,叫做系统调用。
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统 调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

进程

基本概念

  • 课本概念:程序的一个执行实例,正在执行的程序等
  • 内核观点:担当分配系统资源(CPU时间,内存)的实体。

Linux进程概念(上),Linux,linux,运维,服务器

描述进程-PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCB(process control block),Linux操作系统下的PCB是:task_struct

task_struct-PCB的一种

  • 在Linux中描述进程的结构体叫做task_struct。
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

task_ struct内容分类

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

PID

每个进程在系统中,都会存在一个唯一的标识符。这个标识就是PID(process ID)

注意:PID每次开启新进程都会随机分配一个PID。

组织进程

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

查看进程

进程的信息可以通过 /proc 系统文件夹查看(pro的全称是process)

注意:proc是内存文件系统,存放当前系统实时的进程信息。

  • 如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹。

Linux进程概念(上),Linux,linux,运维,服务器

注意:上面这些蓝色的数字就是进程的PID。

  • 大多数进程信息同样可以使用top和ps这些用户级工具来获取

首先先编辑一个.c代码:

Linux进程概念(上),Linux,linux,运维,服务器

然后运行:

Linux进程概念(上),Linux,linux,运维,服务器

使用ps ajx命令即可查看进程(all job,x是以特定格式进行显示)

Linux进程概念(上),Linux,linux,运维,服务器

使用ps ajx | grep 'mytest'查看与mytest相关的进程:

Linux进程概念(上),Linux,linux,运维,服务器

注意:我们常常使用的ls、pwd、touch、grep、chgrp、chown、mkdir、rm等命令在启动后也都是一个个进程,这些二进制可执行文件在/usr/bin目录下,我们使用下面的指令可以进行查看,ls /usr/bin/*

使用ps ajx | grep 'mytest' | grep -v grep我们可以查看待用mytest关键词同时又不带有grep关键词的进程:

Linux进程概念(上),Linux,linux,运维,服务器

问:如何查看进程信息和进程信息代表的意义?

答:使用ps ajx | head -1可以查看不同列的进程信息代表的意义:

Linux进程概念(上),Linux,linux,运维,服务器

使用ps ajx | head -1 && ps ajx | grep 'mytest' | grep -v grep

Linux进程概念(上),Linux,linux,运维,服务器

注意:&&是逻辑与,其意义是前面的指令执行成功了,再实行后面的指令

此时根据PID在proc目录中进行查看:

Linux进程概念(上),Linux,linux,运维,服务器

或者:

Linux进程概念(上),Linux,linux,运维,服务器

使用ls /proc/31745 -al可以查看进程的详细信息:

Linux进程概念(上),Linux,linux,运维,服务器

cwd(current work director):进程当前的工作路径。

exe后面对应的是可执行程序的磁盘文件。

通过系统调用获取进程标示符

  • 进程id(PID)
  • 父进程id(PPID)

PID

使用man getpid来查看getpid介绍

Linux进程概念(上),Linux,linux,运维,服务器

使用举例:

Linux进程概念(上),Linux,linux,运维,服务器

运行:

Linux进程概念(上),Linux,linux,运维,服务器

PPID

使用举例:

Linux进程概念(上),Linux,linux,运维,服务器

运行:

Linux进程概念(上),Linux,linux,运维,服务器

问:为什么每次创建进程时,当前进程的PID每次都会改变,但是PPID却没有发生改变?

答:因为几乎我们在命令行上所执行的所有的指令(cmd),都是bash进程的子进程。

杀掉进程

  • 在程序运行过程中,使用ctrl + c来杀掉程序。

    使用举例:

    Linux进程概念(上),Linux,linux,运维,服务器

  • 使用kill -9 PID来杀掉进程。

    使用举例:

    Linux进程概念(上),Linux,linux,运维,服务器

通过系统调用创建进程-fork初识

  • 运行 man fork 认识fork

    man 2 fork

    Linux进程概念(上),Linux,linux,运维,服务器

  • fork有两个返回值

    Linux进程概念(上),Linux,linux,运维,服务器

    代码:

    Linux进程概念(上),Linux,linux,运维,服务器

    运行结果:

    Linux进程概念(上),Linux,linux,运维,服务器

    代码:

    Linux进程概念(上),Linux,linux,运维,服务器

    执行结果:

    Linux进程概念(上),Linux,linux,运维,服务器

    问:为什么会出现这种情况?

    答:fork之后,父进程和子进程会共享代码,一般都会执行后续的代码,这就是为什么printf会打印两次的问题。

    fork之后,父进程和子进程返回值不同,可以通过不通的返回值,判断,让父子执行不同的代码块。

    问:为什么fork会给父进程返回子进程的PID,给子进程返回0?

    答:因为父进程必须有标识子进程的PID来方便对子进程进行管理,所以fork之后会给父进程返回子进程的PID。

    子进程最重要的是知道自己被创建成功了,因为子进程找父进程成本非常低(getppid())。

    问:为什么fork函数会返回两次,有两个返回值?

    答:Linux进程概念(上),Linux,linux,运维,服务器

    注意:for()之前的代码,在子进程中将不会继续执行

  • 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

进程状态

Linux内核源代码

下面的状态在kernel源代码里定义:

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

注意:进程的状态定义在进程的task_struct中

  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。 (操作系统中叫执行)

    问:运行态是进程在CPU上运行,还是进程只要在运行队列中叫作运行态?

    答:Linux进程概念(上),Linux,linux,运维,服务器

    运行态表示当前进程的task_struct在运行队列runqueue中,已经准备好了,可以随时被调度到CPU中进行执行。(参考分时操作系统)

  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。(操作系统中叫阻塞)

    定义:当进程访问某些资源(磁盘网卡),该资源如果暂时没有准备好,或者正在给其它进程提供服务,此时:1. 当前进程要从runqueue中移除 2. 将当前进程放入对应设备的描述结构体中的等待队列。此时进程就处于阻塞状态。

    注意:处于阻塞状态的进程的代码并没有被执行

  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。 (操作系统中叫阻塞)

    例如下面代码举例:

    struct disk_div
    {
        //磁盘属性
        task_struct *wait_queue;
    }
    

    在等待队列中的进程就处于阻塞状态。

    问:S和D有什么区别吗?

    答:S可以被中断,即可以被操作系统强制回收,但是D只能等待程序自己结束或者醒来,操作系统无法强制回收。

  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。 (操作系统中叫终止态)

    问:这个进程已经被释放,就叫终止态?还是该进程还在,只不过永远不运行了,随时等待被释放?

    答:该进程还在,只不过永远都不运行了,这种状态叫作终止态。为什么这种状态才叫作终止态?因为释放是要花费时间的,有时候操作系统很忙,所以没法立即回收我们的进程以及进程所占用的资源,回收进程和进程占用的资源与修改task_struct的状态位相比,显然前者的开销是要更小一些的。

    问:如何使程序处于暂停状态?

    答:使用kill -19 PID命令就可以使程序处于暂停状态。

    问:如何使程序继续?

    答:使用kill -18 PID命令就可以使程序继续。

  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

Linux进程概念(上),Linux,linux,运维,服务器

运行:R

终止:Z和X

阻塞:S或者D

挂起:S或者T

挂起状态:

Linux进程概念(上),Linux,linux,运维,服务器

进程状态查看

ps aux / ps axj 命令

使用举例:

process.c文件:

Linux进程概念(上),Linux,linux,运维,服务器

运行之后查看进程状态:

Linux进程概念(上),Linux,linux,运维,服务器

问:此时进程的状态是S,说明程序处于休眠状态或者阻塞状态,为什么此时的程序处于休眠状态而不是运行状态?

答:因为CPU执行的速度很快,大部分时间,进程在等待外设即输出设备,所以大部分时间是阻塞状态

对源程序进行下面的改变,进程的状态就会发生改变:

Linux进程概念(上),Linux,linux,运维,服务器

Linux进程概念(上),Linux,linux,运维,服务器

Linux进程概念(上),Linux,linux,运维,服务器

注意:在上图中的就绪和执行状态在操作系统中都对应的是R状态

Z(zombie)-僵尸进程

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

模拟僵尸进程:

代码:

Linux进程概念(上),Linux,linux,运维,服务器

Linux进程概念(上),Linux,linux,运维,服务器

Linux进程概念(上),Linux,linux,运维,服务器

问:长时间的保持僵尸状态会出现什么问题?

答:如果没有人回收僵尸子进程,该状态会一直维护,并且该进程的相关资源(task_struct)也不会被释放,进而出现内存泄漏问题。

孤儿进程

  • 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
  • 父进程先退出,子进程就称之为“孤儿进程”
  • 孤儿进程被1号init进程领养,当然要有init进程回收喽。

process.c代码:

Linux进程概念(上),Linux,linux,运维,服务器

执行结果:

Linux进程概念(上),Linux,linux,运维,服务器

Linux进程概念(上),Linux,linux,运维,服务器

最终只剩下一个子进程。

问:S+和S状态有什么区别?

答:S+是前台进程,可以通过ctrl + c退出,但是S状态不可以。当父进程尚未退出时,两个进程的状态都是S+ 状态,但是当父进程退出后,子进程变成了S状态。

问:父进程退出的时候为什么是S状态而不是Z状态?

答:因为父进程的父进程是bash,父进程被bash回收了。

问:父进程退出的时候,子进程为什么没有被回收?

答:因为在我们的代码中,我们没有写父进程回收子进程的的代码,所以子进程没有被回收。

问:父进程被回收后,为什么子进程的父进程发生了改变?

答:如果此时的父进程没有发生改变的话,就没有父进程来对子进程进行管理了。所以如果父进程提前退出,子进程还在,子进程就会被1号进程领养。此时的子进程就是孤儿进程。

问:如何退出此时的孤儿进程?

答:当父进程退出后,子进程的状态变成了S状态,此时我们发现子进程无法通过ctrl + C退出,此时我们只能通过kill -9 PID使进程退出。

问:什么是1号进程?

答:1号进程就是操作系统。

T和t状态

T是常规的暂停,t是进程被调试的时候遇到断点时所处的状态。

进程优先级

基本概念

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

查看系统进程

在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:

Linux进程概念(上),Linux,linux,运维,服务器

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

PRI and NI

  • PRI即进程的优先级,就是程序被CPU执行的先后顺序,此值越小,进程的优先级别越高
  • NI表示进程可被执行的优先级的修正数值
  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice(注意:每次设置,此处都默认PRI都是80
  • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
  • 所以,调整进程优先级,在Linux下,就是调整进程nice值 nice其取值范围是-20至19,一共40个级别([60 , 99])。

PRI vs NI

注意:进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进 程的优先级变化。 可以理解为:nice值是进程优先级的修正修正数据

查看进程优先级的命令

用top命令更改已存在进程的nice
  • top(注意:如果我们想要修改后续的优先级,我们就需要用sudo指令暂时提高top的权限

    Linux进程概念(上),Linux,linux,运维,服务器

  • 进入top后按“r”–>输入进程PID–>输入nice值

    Linux进程概念(上),Linux,linux,运维,服务器

    Linux进程概念(上),Linux,linux,运维,服务器

    此时查看优先级:

    Linux进程概念(上),Linux,linux,运维,服务器

    PID为9782的进程优先级发生了改变(82 + (- 20) = 60)

其它概念

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高 效完成任务,更合理竞争相关资源,便具有了优先级
  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为 并发

问:Linux内部是如何实现的?

答:不同优先级会形成不同的队列,不同优先级的进程会放入相应优先级所对应的队列中。

Linux进程概念(上),Linux,linux,运维,服务器文章来源地址https://www.toymoban.com/news/detail-827053.html

到了这里,关于Linux进程概念(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux运维】shell脚本检查服务器内存和CPU利用率

    在管理服务器时候写了一个 shell脚本,在服务上实现每天凌晨3点查系统的指定文件夹下的容量大小,如果超过10G就要删除3天前的内容,还要时刻查询内存和cpu利用率,如果超过80%就要提示用户出现过载 将以上代码保存为一个.sh文件,然后通过crontab在每天凌晨3点运行即可:

    2024年02月09日
    浏览(48)
  • Linux服务器中查看进程的四种方法

    1. 使用 ps aux 命令来查看,能以简单列表的形式显示出进程信息 ps aux 用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序. ps 命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进

    2024年02月02日
    浏览(30)
  • Linux网络编程:多进程 多线程_并发服务器

    文章目录: 一:wrap常用函数封装 wrap.h  wrap.c server.c封装实现 client.c封装实现 二:多进程process并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 三:多线程thread并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 ​​​​   read 函数的返回值 wrap.h  wrap

    2024年02月12日
    浏览(44)
  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(54)
  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(58)
  • 蓝易云:Linux系统sshd命令 – openssh服务器守护进程

    sshd是Linux系统中的一个守护进程,它提供了远程登录服务和安全的文件传输功能。以下是sshd的详细教程。 1. 安装openssh-server 在Debian/Ubuntu上安装openssh-server命令如下: sudo apt-get update sudo apt-get install openssh-server 在CentOS/RHEL上安装openssh-server命令如下: sudo yum update sudo yum install

    2024年02月16日
    浏览(36)
  • 基于linux下的高并发服务器开发(第二章)- 2.7 进程退出、孤儿进程、僵尸进程

    ◼ 父进程运行结束,但子进程还在运行(未运行结束),这样的子进程就称为孤儿进程 (Orphan Process)。 ◼ 每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为 init ,而 init 进程会循环地 wait() 它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束 了其生

    2024年02月16日
    浏览(40)
  • Linux高并发服务器开发---笔记1(环境搭建、系统编程、多进程)

    0613 首先这整个系列笔记属于笔记①:牛客校招冲刺集训营—C++工程师中的 第四章 笔记。 视频课链接: 视频1:Linux高并发服务器开发(40h); 视频2:第4章 项目制作与技能提升(录播)(26h30min); 视频课3: 第5章 高频考点与真题精讲(录播)中的 5.10-5.13 项目回顾 有个学

    2024年02月15日
    浏览(45)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(72)
  • linux 服务器进程、端口查找,nginx 配置日志查找,lsof 命令详解

    1.1 使用查看端口号对应的进程信息 方式一 : 使用netstat命令 -t:显示TCP连接 -u:显示UDP连接 -l:仅显示监听状态的连接 -n:以数字形式显示端口号,而不是以服务名称显示 通过管道符号|将netstat的输出结果传递给grep命令,用于过滤出包含指定端口号的行。 执行命令后,终端

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包