| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> linux篇(四)linux进程(上) -> 正文阅读 |
|
[系统运维]linux篇(四)linux进程(上) |
作者介绍:
目录认识操作系统感性的认识操作系统我们的计算机,其实它的本质是由冯诺依曼结构为基础,由一个个硬件之间相互配合而形成的拥有计算功能的机器罢了 而我们是不能直接对一堆冷冰冰的机器进行交互的。它需要有一个管家,来管理好这些硬件,并且这个管家我们是能够直接使用的,这个管家,就叫做操作系统 像这种任何计算机包含的一种最基本的能够进行软硬交互的一款软件,我们把它叫做操作系统(英文缩写OS) 而狭义上的OS,它包括:
理性的认识操作系统既然我们知道了操作系统是一款搞管理的软件,那么它是如何搞管理的呢? 首先,我们先来认识一下OS的工作基本原理 先上一张OS的层次图
OS对下先通过调用驱动程序(驱动程序是能直接与硬件交互的一种软件),能往下操作硬件 对应用户,OS有一些暴露在外的用户能够直接调用的接口(其实说白了,这个接口就是函数,就是对一些接口进行封装而成的),能使用户向OS下达命令,实现一些功能
所以,在整个计算机设计架构中,OS的定位是:一款纯正的“搞管理”的软件 初步认识OS的管理先看看生活中,我们有哪些管理的例子? 我们可以拿校长和学生来举例子,可以得出管理者和被管理者的关系
所以,我们可以得出以下的结论:
但是我们可不能盲目的管理,比如你肯定不会给全年级倒数第一发奖学金。所以,我们如果要管理,可能还需要一些材料来支撑我们高效的管理 这个材料,就是数据 比如,你要查看一个学生的基本信息,可能需要查看他的生源地啊,成绩啊,获奖历史啊等等数据,然后根据这些数据来决定是否给他发奖学金 那么,如何聚合这些数据呢? 而在c++中,我们可以使用类来描述我们需要管理的一个个对象,c语言中我们叫结构体 而这个过程,我们通常叫做数据的描述 其次,如果你要快速找出全校排满前几的学生,可能需要一些数据结构和算法,来高效的找出你需要的对象 而这个过程,我们通常叫做数据的组织 所以,我们可以得出一个十分重要的结论: 计算机执行管理时,先把管理对象描述起来,再把管理对象组织起来
进程的认识进程管理作为OS一款十分重要的组件之一,它可以管理我们计算机中运行的所有程序 而进程又是什么呢? 这是书本上的定义:
而根本我们本文提到的OS管理的中心思想,我想重新给进程下一个定义: 进程=程序对应的文件内容(struct)+相关数据结构(比如优先级队列) OS如何管理进程?先描述再组织 其实OS中的描述也是这样,在每个进程开始时,都会创建对应的PCB进程控制块 PCB的本质就是task_struct结构体,进程的所有属性都存储到了这个结构体中 所有,有了PCB,所有的进程管理都与程序本身无关,而与PCB强相关 PCB包含的所有信息:
不急,下文将会详细地说明它们分别的含义 进行管理图示: PCB的基本数据说明查看进程linux下,我们可以使用ps命令来查看进程 有两种指令:
演示: 我们先写出一个死循环,一直运行的程序
我们把这个程序取名为test,使其开始运行 然后打开新的对话框,查看
PCB基本数据之标识符每个进程都有一个独一无二的标识符,就像人的名字一样,用来区分不同的进程 在程序中,我们使用getpid函数来获取当前进程的pid,使用getppid来获取它的父进程(后文讲解)的id PCB基本数据之上下文数据我们知道,一个电脑只有1个cpu,而我们的电脑可能会同时存在几十个进程,它们真的是同时运行的吗? 其实不是的,OS规定了每个程序单次运行的时间片,也就是每个进程只能运行这么多时间,然后立刻切换到下一个进程,但是由于进程之间的切换极快,(大概是纳秒ns级别),所以看起来像在一起运行一样,这种模式我们也称作并发 而上下文数据,就是保存每次进程在运行时生成的临时数据,可以实现进程切换回来时,立刻恢复到切换前的状态继续运行此程序 利用fork来认识父子进程我们知道,我们每个进程都有自己的父进程,父进程负责回收管理其对应的子进程,而有些进程的父进程可以直接是OS本身(pid为1) 而我们可以查看我们上面程序的父进程的信息
fork是一种可以创建子进程的函数,它的返回值是一个int 用fork接受返回值,可能会出现意料之外的情况 测试代码:
一般我们的函数只有一个返回值,但是我们却发现我们的程序却两个条件都执行了!我们在语言层次上根本不能理解这种行为
我们可以验证一下:
我们发现,helloworld的父进程刚好就是can you see me 那么,父子进程有什么相互联系呢?
PCB基本数据之进程状态进程状态可以方便OS快速判断进程的状态,方便使其完成各种功能,本质是一种分类 linux中的进程一般有以下状态:
回到我们的第一个程序,状态码在这里显示: 睡眠状态和运行状态
演示:
程序打印的这么快,为什么它仍然在休眠状态呢? 因为我们的IO设备的相应其实相对于cpu很慢(cpu在纳秒级而io在毫秒级) 但相对我们人来说,cpu的切换实在太快,所以我们可能会认为程序一直在运行,其实它本来大部分时间在休眠 官方定义: 把程序从等待队列放在运行队列中,就叫唤醒 等待队列中的程序处于睡眠态 特殊状态之僵尸状态当一个进程需要退出时,系统会回收这个进程的资源,然后进程就进入了死亡 而linux却不能随便让一个程序死亡,它需要先确认退出原因,确认后才会允许死亡 而一个进程在发出死亡请求后,linux确认死亡原因会有一个时间段,这个进程在这个时间段就会被置为僵尸状态 验证:根据子进程的维护由父进程管理,所以我们先让子进程死亡,然后不让父进程正常退出 先让这个程序运行
然后杀掉子进程
僵尸进程我们需要尽量避免,因为会导致过度占用空间和内存泄漏 特殊进程之孤儿进程父子进程在同时运行时,父进程先退出,而子进程会因为没有父进程而被置为孤儿进程 孤儿进程将会被1号进程(OS本身)领养 PCB基本数据之优先级为什么要有优先级?本质是因为资源太少而进程太多! 所以OS会把优先级高的进程赋予其优先使用资源的权限,这样优先级可以把重要的和不重要的进程分开,以提高OS的效率 如何查看?
PRI值默认为80,值越小,说明其优先级越高 NI是优先级的校正值,可以人为的修改,PRI的最终值也取决于NI值(PRI=80+NI) 如何修改优先级?
强烈建议大家不要随意修改进程优先级,会导致进程饥饿问题 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 2:29:55- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |