Linux操作系统---进程1

冯诺依曼体系结构

我们常见的计算机,服务器大多都遵循冯诺依曼体系
在这里插入图片描述

输入设备:键盘,磁盘(写过程),话筒,摄像头,,,
输出设备:显示器,磁盘(读过程),音响,,,,
存储器:内存
运算器和控制器:CPU;

对于冯罗依曼体系:
大致过程:输入设备把数据加载到内存中,CPU从内存中读取和处理数据,然后再返回内存,输出设备再从内存中读取。
所有的外设都不和CPU直接交互,而是与内存直接交互。
为什么呢? CPU速度太快(纳秒级别),设备(秒级别)

帮助理解:CPU是一个年轻力壮的青年人,一秒可以搬1000快砖,而外设是一个年迈的老人,一秒只能搬一块砖。
如果CPU和外设直接打交道会出现:大爷,您快点搬砖啊,我都等不及了。
但是他们不直接交互:老人搬砖放到一块空地上(内存),年轻人一看空地上才这么几块砖,我再喝几口
可乐先,等砖多了直接一口气搬完。(这样的话,效率就大大的提升了)

操作系统详解

1,什么是操作系统:是一款专门针对软硬件资源管理的软件。
2,目的:对上:为用户提供良好的运行环境
对下:管理好底层的软硬件资源。

3,OS如何做到底层管理呢?
这个问题先看一张图
在这里插入图片描述
操作系统要做到管理:首先要做到对底层的硬件的数据要进行聚合(把一个个硬件的数据聚合后变为一个个的结构体)
对硬件的管理不就是变成了对数据结构的增删查改吗?

总结操纵系统管理核心:1,先描述 2 再组织

详解上图的系统调用接口:就是OS系统提供的接口(也就是函数)
有什么用呢? OS是不信任任何用户的,为什么呢? 如果一个人直接用指令去对OS进行操作,不合适的操作不就让OS直接挂了吗
所以这里操作系统提供接口的目的是为了保护自己。(例如你去银行的ATM取钱,不是让你直接里面拿钱,而是经过插卡,密码等等步骤
,,,,才取出钱,,)
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有的大佬
调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
也就是用户指令可以通过这些库直接去调用系统调用接口

举例:c语言中的printf()函数是如何将数据输出到显示器的呢?就是这样一步步贯穿执行的。

进程

什么是进程:被加载到内存中的程序(书本上)
进程的代码和数据+ 相关的数据结构(从内核角度出发,Linux下是task_struct)
在这里插入图片描述

操作系统如何管理进程呢? 先描述,再组织。
如何描述:PCB(进程控制块,Linux是task_struct),本质是一个结构体。
也就是说,任何进程在创建之前,都要创建PCB,它基本上包含进程的所有属性。
所以有了PCB,对进程的管理任务与进程对应的程序毫无关系,OS直接去管理PCB
如何组织:对数据结构的操作。

曾经启动程序的过程,本质都是在系统中创建进程。

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

对于
标识符
pid相当于是名字一样,ppid是父进程id
在这里插入图片描述

退出码查看指令
echo $?
在这里插入图片描述

详细说一下上下文:目的是让你去做其他事情,但不耽误当前的事情

一个进程在运行的时候不会在很短的时间内运行,如果有多个进程呢? 其实大多数的操作系统
在运行进程的时候都是切换的
,规定每个进程单次运行的时间片。(为了均衡CPU资源)

进程在运行期间是有切换的,那么产生的临时数据呢? 运行了一次,由下一个进程来运行,那么运行出来的临时数据放在那里呢?
其实存放在寄存器中。但是CPU只有一套,寄存器有限,所以当运行该进程的时候,临时数据存放于寄存器中
如果该进程不执行了,轮到下一个进程了,该进程的PCB就会存放这些数据(可以理解为PCB结构体里面创建一个结构体放这些数据)。

fork()函数

fork()函数是创建子进程。
在这里插入图片描述
在这里插入图片描述

方便理解:把管理PCB的数据结构假设为队列

进程的状态信息:R 运行状态,不一定占有CPU(因为进程在运行的时候是切换的,当它不运行的时候,可能是运行队列中等待)
D,S:当我们要完成某种任务的时候,任务条件不具备,需要等待就绪。
D:深度睡眠,不可中断,不可杀掉
S:浅度睡眠,可中断。
T:暂停态
X:死亡状态,回收进程资源 (父进程回收子进程
Z:僵尸状态 进程执行完后,不会直接进入死亡状态,而是要判断死亡原因,返回进程的退出信息
,判断出执行完的原因(例如非正常退出,因为错误退出,,,等等),然后再进入死亡状态回收。
如何产生的呢? 当子进程执行完后,父进程没有读取到退出信息,子进程就不能回收,这个时间段就是僵尸进程。
有什么危害呢? 内存泄漏,浪费CPU资源,
在这里插入图片描述
测试一下3种状态:R S Z
kill -l 查看操作进程的编码
在这里插入图片描述

在这里插入图片描述
如何进入僵尸进程:
子进程执行完后,父进程还没有检测回收。这个时间段就是僵尸进程

int main()
{ 
      int ret = fork();
      if(ret == 0) //子进程
      {
        cout << "I am a child process"  << endl;
        cout << getpid() << endl;
        exit(-1);//子进程输出一句话然后立刻退出
      } 
      else
      {
        while(1)
        {
          cout << "I am a parent child" <<endl;
          sleep(20);
        }

      }
      return 0;
}

在这里插入图片描述

什么是孤儿进程
父进程执行完退出后,子进程没有执行完。 这时候子进程就是孤儿进程。
但是子进程都会由1号进程领养。(并不会浪费资源,因为init进程会回收)
在这里插入图片描述

进程的优先权

什么是优先权? 也就是CPU分配资源的顺序。
为什么存在优先权呢?把重要的进程优先运行,不重要的进程后运行,这样可以提高系统性能。

在这里插入图片描述

ps -l 显示进程新消息
PRI 进程优先级,越小,越先被执行
NI nice值,范围是 -19 – 20 ,表示进程可被执行的优先级的修正数值。PRI(old) = PRI(new) + nice ;
为什么nice值是很小的范围呢? 优先级是一个相对较小的范围,是相对优先,不能出现绝对优先,不然有的
进程得不到CPU资源(“饥饿问题”)。
其中调度器的功能就是来让进程均衡CPU资源的

如何修改PRI呢? top --> r ->pid --> nice
nice的范围都是-19 — 20 超过范围都取最大或者最小。

进程的其他特点

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通过全部用例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值