【1++的Linux】之进程(一)

作者主页:进击的1++
专栏链接:【1++的Linux】

文章目录

  • 一,冯诺依曼与操作系统概念
    • 1.1 冯诺依曼体系结构
    • 1.2 操作系统
  • 二,进程的基本概念

一,冯诺依曼与操作系统概念

1.1 冯诺依曼体系结构

【1++的Linux】之进程(一)_第1张图片
如图所示,就是冯诺依曼体系结构,它由输入输出设备;存储器;中央处理器组成。
其中,我们常见的输入设备有:键盘,鼠标,扫描仪,网卡等。
常见的输出设备有:显示器,网卡。中央处理器(CPU):包括运算器:算数运算,逻辑运算;控制器:控制协调。

**要注意的是:**CPU读取数据都要到内存中去读,站在数据角度,CPU不和输入设备直接打交道。对于要输出数据,也是得通过内存,因此也可以认为,外设只和内存打交道。总结就是,程序要运行,必须被加载到内存中,所有设备都直接和内存打交道。
对于不同存储设备的读取速度,我们也做如下总结:
CPU&&寄存器>内存>磁盘>光盘>磁带。

1.2 操作系统

  1. 什么是操作系统?
    对于任何计算机系统都包含一个基本的程序集合,称为操作系统。操作系统包括:内核与其他程序(shell等)。
  2. 操作系统的作用?
    与硬件交互,管理好软硬件资源,从而为用户提供一个好的环境。因此也可以称其为一款”搞管理“的软件。
  3. 操作系统是如何进行管理的?
    我们以一个学校的简化版为例。
    我们有角色:校长(管理者),辅导员(驱动程序),学生(被管理对象,硬件)。校长不一定要直接去管理学生,而是通过辅导员而去间接的进行管理。那么校长靠什么去做相应的决策呢?最方便,高效的就是通过辅导员拿到学生的数据,从而进行管理,也就是说,管理者管理的是被管理者的数据。那么由于学生太多,产生的数据也过多,因此为了方便管理,我们要对学生进行描述,根据描述类型,定义为对象,这类似于我们C语言中的struct结构体,为了管理,我们还需将这么多对象用数据结构将其组织起来,方面我们的增删查改。
    这就是操作系统进行管理的原理。
    总结就是:先描述,后组织!

【1++的Linux】之进程(一)_第2张图片

二,进程的基本概念

什么叫进程呢?
正在执行的程序或者可以说是担当分配系统资源的实体。
在第一小节我们说过,操作系统进行管理的手段是:先描述后组织。对于进程的管理也是这样的,先对进程进行描述,然后将其信息放在一个叫做进程控制模块的数据结构中。我们称之为PCB,在Linux中,叫做
task_struct。

task_struct是Linux内核的一种数据结构,它会被装载到内存里并且包含着进程的信息。
所有运行在系统里的进程都以task_struct链表的形式存在内核里。

task_struct中有什么?

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

除了操作系统创建的第一个进程外,所有进程都有其父进程。不一定有子进程。下面来讲一讲如何创建一个进程。
在创建进程前我们先来学习如何查看进程。
命令ps -选项 就能够查看进程,具体如下。
“-j” 选项表示以详细的格式显示进程信息
“-a” 选项表示显示所有用户的进程
“-x” 选项表示显示没有控制终端的进程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的进程
演示如下:
【1++的Linux】之进程(一)_第3张图片
【1++的Linux】之进程(一)_第4张图片

接下来我们对这段命令进行剖析:ps aux | head -1 是将其头部份显式出来;&&是与的意思,只有第一条命令执行完了,才能执行第二条命令;ps aux | grep test3是将test3中的所有进程显式出来;grep -v grep由于grep命令本身在执行时也是进程,所以这段命令是不限grep进程。

讲了如何查看进程,接下来我们学习如何创建进程。
通过系统调用函数fork()来创建进程。
和我们平常所认识到的不一样的是,fork()有两个返回值,其代码是父子共享的,但其会各自开辟空间。
先演示,用结果说话!

【1++的Linux】之进程(一)_第5张图片

【1++的Linux】之进程(一)_第6张图片

或许大家会有疑问,为什么会有两个返回值?
【1++的Linux】之进程(一)_第7张图片
在fork()后,会产生两个执行流,并且这两个执行流的执行先后顺序是不确定的,谁先才运行队列就谁先执行。因此看似有两个返回值,其实是同一份代码,被执行了两次,并且返回值不同罢了。
这时操作系统就会讲这个新产生的task_struct链接到其链表中。因此,我们可以推出,进程的调度就成了在task_struct链表中选择一个进程。
【1++的Linux】之进程(一)_第8张图片

你可能感兴趣的:(1++的Linux,linux,进程)