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

👍作者主页:进击的1++

🤩 专栏链接:【1++的Linux】

文章目录

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

1.1 冯诺依曼体系结构

如图所示,就是冯诺依曼体系结构,它由输入输出设备;存储器;中央处理器组成。

其中,我们常见的输入设备有:键盘,鼠标,扫描仪,网卡等。

常见的输出设备有:显示器,网卡。中央处理器(CPU):包括运算器:算数运算,逻辑运算;控制器:控制协调。

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

对于不同存储设备的读取速度,我们也做如下总结:
CPU&&寄存器>内存>磁盘>光盘>磁带。

1.2 操作系统

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

二,进程的基本概念

什么叫进程呢?🤔🤔🤔
正在执行的程序或者可以说是担当分配系统资源的实体。
在第一小节我们说过,操作系统进行管理的手段是:先描述后组织。对于进程的管理也是这样的,先对进程进行描述,然后将其信息放在一个叫做进程控制模块的数据结构中。我们称之为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 显示所有包含其他使用者的进程

演示如下:

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

讲了如何查看进程,接下来我们学习如何创建进程。

通过系统调用函数fork()来创建进程。

和我们平常所认识到的不一样的是,fork()有两个返回值,其代码是父子共享的,但其会各自开辟空间。

先演示,用结果说话!😲😲😲

或许大家会有疑问,为什么会有两个返回值?

在fork()后,会产生两个执行流,并且这两个执行流的执行先后顺序是不确定的,谁先才运行队列就谁先执行。因此看似有两个返回值,其实是同一份代码,被执行了两次,并且返回值不同罢了。

这时操作系统就会讲这个新产生的task_struct链接到其链表中。因此,我们可以推出,进程的调度就成了在task_struct链表中选择一个进程。

相关推荐
许白掰1 小时前
Linux入门篇学习——Linux 工具之 make 工具和 makefile 文件
linux·运维·服务器·前端·学习·编辑器
longze_75 小时前
Ubuntu连接不上网络问题(Network is unreachable)
linux·服务器·ubuntu
Dirschs5 小时前
【Ubuntu22.04安装ROS Noetic】
linux·ubuntu·ros
qianshanxue115 小时前
ubuntu 操作记录
linux
AmosTian8 小时前
【系统与工具】Linux——Linux简介、安装、简单使用
linux·运维·服务器
这我可不懂11 小时前
Python 项目快速部署到 Linux 服务器基础教程
linux·服务器·python
车车不吃香菇11 小时前
java idea 本地debug linux服务
java·linux·intellij-idea
tan77º11 小时前
【Linux网络编程】Socket - TCP
linux·网络·c++·tcp/ip
kfepiza12 小时前
Linux的`if test`和`if [ ]中括号`的取反语法比较 笔记250709
linux·服务器·笔记·bash
CodeWithMe12 小时前
【Note】《深入理解Linux内核》 第十九章:深入理解 Linux 进程通信机制
linux·运维·php