linux系统篇——进程概念

进程概念

  • 一、冯 · 诺依曼体系
  • 二、操作系统(Operator System)
    • 1.概念
    • 2.设计OS的目的
    • 3.定位
  • 三、进程基本概念
  • 四、进程描述--PCB
  • 五、task_struct内容分类
  • 六、查看进程
  • 七、进程状态
  • 八、Z(zombie)-僵尸进程
  • 九、僵尸进程的危害
  • 十、进程优先级

一、冯 · 诺依曼体系

谈及计算机的运行,离不开冯诺伊曼结构,大部分的计算机都遵行冯诺依曼体系,冯诺依曼规定了硬件的数据流向
linux系统篇——进程概念_第1张图片

所以可执行程序执行的时候,必须先加载到内存,为什么?
因为,冯诺依曼规定!!!
CPU不和外设打交道,只和内存打交道
原因是内存的读取速度大于其他外设(硬盘)的传输速度,若与其他外设交换数据,会严重拖慢程序的速度。

对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上,请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。从你打开窗口,开始给他发消息,到他的到消息之后的数据流动过程。如果是在qq上发送文件呢?

二、操作系统(Operator System)

1.概念

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

笼统的理解,操作系统包括

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

2.设计OS的目的

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

3.定位

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

如何理解 "管理"

  • 管理的例子
  • 描述被管理对象
  • 组织被管理对象

linux系统篇——进程概念_第2张图片

计算机管理硬件

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

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

操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把
进程组织起来!(先描述,再组织)

三、进程基本概念

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

四、进程描述–PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct。
  • 在Linux中描述进程的结构体叫做task_struct。
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

五、task_struct内容分类

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

六、查看进程

  • 进程的信息可以通过 /proc 系统文件夹查看
    在这里插入图片描述
  • 大多数进程信息同样可以使用top和ps这些用户级工具来获取
    在这里插入图片描述
  • 通过系统调用获取进程标示符(在进程用getpid() 即可获得该进程的pid)

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

  • 通过系统调用创建进程(-fork初识)
    运行 man fork 认识fork
    fork有两个返回值
    父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
    fork 之后通常要用 if 进行分流
#include 
#include 
#include 
int main()
{
 int ret = fork();
 if(ret < 0){
 perror("fork");
 return 1;
 }
 else if(ret == 0){ //child
 printf("I am child : %d!, ret: %d\n", getpid(), ret);
 }else{ //father
 printf("I am father : %d!, ret: %d\n", getpid(), ret);
 }
 sleep(1);
 return 0;
}

运行一下看看什么结果、很神奇。

七、进程状态

  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进可以通过发送 SIGCONT 信号让进程继续运行。
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态
    linux系统篇——进程概念_第3张图片

八、Z(zombie)-僵尸进程

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

九、僵尸进程的危害

  • 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
  • 那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据构
  • 对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
  • 内存泄漏?是的!

孤儿进程

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

十、进程优先级

篇幅过长,放这里介绍

  • linux学习ing,持续更新,欢迎给位指点改正~ (点个赞吧!)

你可能感兴趣的:(Linux学习计划,编辑器,linux,服务器)