编程知识 cdmana.com

Linux process concept (on)

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

冯诺依曼体系结构

查看源图像

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

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

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

存储器:内存

问:Why do you want to have a memory?

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

从数据角度,Peripherals are almost notCPU直接进行交互,Direct and direct memory interaction,CPU也同样如此.

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

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

操作系统(Operator System)

概念

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

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

设计OS的目的

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

定位

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

image-20220809211343735

总结

计算机管理硬件

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

系统调用和库函数概念

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

进程

基本概念

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

image-20220809213923913

描述进程-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)

注意:PIDEvery time to open the new process will be randomly assigned to aPID.

组织进程

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

查看进程

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

注意:proc是内存文件系统,Store the current system of real-time process information.

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

image-20220811163301007

注意:Above the blue Numbers that is the process ofPID.

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

First to edit a.c代码:

image-20220810133655100

然后运行:

image-20220810133728548

使用ps ajxCommand to view process(all job,xIn a specific format for display)

image-20220810134005412

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

image-20220811161702375

注意:我们常常使用的ls、pwd、touch、grep、chgrp、chown、mkdir、rmSuch as commands are each process after start,The binary executable file in/usr/bin目录下,Can we use the instructions below to view,ls /usr/bin/*

使用ps ajx | grep 'mytest' | grep -v grepWe can check about withmytestKeywords at the same time withoutgrepThe process of key words:

image-20220811161631546

问:How to view process information and process information on behalf of the meaning of?

答:使用ps ajx | head -1Can view the process information in different column represents the significance of:

image-20220811164313285

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

image-20220811164510124

注意:&&是逻辑与,Its meaning is in front of the instruction execution success,Executes instructions behind again.

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

image-20220811164805965

或者:

image-20220811164948414

使用ls /proc/31745 -alDetailed information can view the process:

image-20220811180208113

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

exeBehind the corresponding disk file is an executable program.

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

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

PID

使用man getpid来查看getpid介绍

image-20220811182849102

使用举例:

image-20220811183307043

运行:

image-20220811183339712

PPID

使用举例:

image-20220811193941011

运行:

image-20220811194039390

问:Why every time creating process,当前进程的PID每次都会改变,但是PPID却没有发生改变?

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

杀掉进程

  • 在程序运行过程中,使用ctrl + cTo kill the program.

    使用举例:

    image-20220811183557419

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

    使用举例:

    image-20220811193221852

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

  • 运行 man fork 认识fork

    man 2 fork

    image-20220811203606509

  • fork有两个返回值

    image-20220811203738709

    代码:

    image-20220811215837389

    运行结果:

    image-20220811215816007

    代码:

    image-20220812113941572

    执行结果:

    image-20220812114018087

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

    答:fork之后,父进程和子进程会共享代码,一般都会执行后续的代码,这就是为什么printfWill print two problems.

    fork之后,父进程和子进程返回值不同,Can not return values,判断,让父子执行不同的代码块.

    问:为什么forkWill the child returned to the parent processPID,给子进程返回0?

    答:Because the parent process must have identified the childPIDTo convenient for process management,所以forkAfter the child returned to the parent processPID.

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

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

    答:image-20220812202845288

    注意:for()之前的代码,In the heart of the child process will not continue to perform.

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

进程状态

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 */
};

注意:The state of the process definition in the process oftask_struct中.

  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里. (Operating system called perform)

    问:Running state is a process inCPU上运行,Or process as long as in the run queue called running state?

    答:image-20220812222541094

    Running state according to the current process oftask_struct在运行队列runqueue中,已经准备好了,Can be scheduled toCPU中进行执行.(Reference time-sharing operating system)

  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep)).(Operating system call blocking)

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

    注意:In the blocking state of the process of the code has not been performed.

  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束. (Operating system call blocking)

    For example the following code example:

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

    In the process in the wait queue in the blocking state.

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

    答:S可以被中断,The operating system can be compulsory recycling,但是DCan only wait the program ends or wake up,The operating system can't compulsory recycling.

  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程.这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行. (Operating system call termination state)

    问:This process has been released,Call termination state?还是该进程还在,只不过永远不运行了,随时等待被释放?

    答:该进程还在,But never run,This state is called the end state.Why this state is called end state?Because it takes time to release,Sometimes the operating system is very busy,So can't immediately recycling our process and process the resources occupied,Recycling processes and processes the amount of resources and modificationtask_structThe status of a compared,The cost of the former is obviously to get smaller.

    问:How to make the program in a suspended state?

    答:使用kill -19 PIDCommand can make the program in a suspended state.

    问:How to make the program to continue?

    答:使用kill -18 PIDCommand can make the program to continue.

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

image-20220812213923600

运行:R

终止:Z和X

阻塞:S或者D

挂起:S或者T

挂起状态:

image-20220813110312580

进程状态查看

ps aux / ps axj 命令

使用举例:

process.c文件:

image-20220813120241730

After running to check the process status:

image-20220813120421384

问:The process state isS,That program dormant or blocking state,Why dormant program at this time, not running state?

答:因为CPU执行的速度很快,大部分时间,Processes waiting for peripherals that output device,So most of the time is blocked state

Changes to the source code for the following,The state of the process will change:

image-20220813203814689

image-20220813203900576

image-20220813213315180

注意:In the above ready and execution status in the operating system is the correspondingR状态.

Z(zombie)-僵尸进程

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

模拟僵尸进程:

代码:

image-20220813224312659

image-20220813224212777

image-20220813224152795

问:For a long time to keep zombie will appear what problem?

答:If no one recycling zombie child,该状态会一直维护,And the process of the related resources(task_struct)也不会被释放,进而出现内存泄漏问题.

孤儿进程

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

process.c代码:

image-20220815172129232

执行结果:

image-20220815172229437

image-20220815172242688

Finally only a child process.

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

答:S+是前台进程,可以通过ctrl + c退出,但是S状态不可以.When the parent process is not yet out,The state of the two processes areS+ 状态,But when the parent process after,子进程变成了S状态.

问:When the parent is whyS状态而不是Z状态?

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

问:The parent process exit,Why the child has not been recycling?

答:Because in our code,We don't have to write the recycling child processes of the code,所以子进程没有被回收.

问:The parent process be recycled,Why the child of the parent process changed?

答:If the parent did not change at this time,There is no parent to pair process to manage.So if the parent process exit ahead of time,子进程还在,子进程就会被1号进程领养.At this time of the child is an orphan.

问:How to exit the orphaned at this time?

答:当父进程退出后,State of the child into aS状态,We found that the child can't through at this timectrl + C退出,此时我们只能通过kill -9 PID使进程退出.

问:什么是1号进程?

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

T和t状态

TIs the conventional suspension,tIs a process being debugged the breakpoint of the state.

进程优先级

基本概念

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

查看系统进程

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

image-20220816142238104

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

PRI and NI

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

PRI vs NI

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

查看进程优先级的命令

用top命令更改已存在进程的nice

  • top(注意:If we want to change the following priority,我们就需要用sudoInstruction temporarily increasetop的权限

    image-20220816143645994

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

    image-20220816144319420

    image-20220816144707564

    Check the priority at this time:

    image-20220816144844881

    PID为9782The process priority has changed(82 + (- 20) = 60)

其它概念

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

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

答:Different priorities will form different queue,Different priority will be put into the process of the corresponding priority of the queue.

image-20220816183400730

版权声明
本文为[Shikokumaru]所创,转载请带上原文链接,感谢
https://cdmana.com/2022/266/202209230842136079.html

Scroll to Top