Linux操作系统基础(了解操作系统,操作系统的管理,进程详解)

我们常见的计算机,大部分都遵守冯诺依曼体系。
在这里插入图片描述

  1. 输入设备:键盘,鼠标,摄像头,麦克风,网卡,硬盘等
  2. 存储器:内存(掉电易失性存储介质)
  3. 中央处理器:
    - 运算器:算数运算,逻辑运算
    - 控制器:控制电路信号(非数据性,什么时候该进行什么操作,进行操作的时间)

输出设备:显示器,声卡,喇叭,硬盘

从数据信号看,cpu不和输入输出设备交互。
在这里插入图片描述

  • cpu 寄存器:纳秒
  • 内存:微妙
  • 硬盘:毫秒
  1. 距离cpu越近存储效率越高,成本越高,且容量比较小。
  2. 出于成本和效率,一般由快的设备给慢的设备做缓存。

输入输出设备距离cpu远,所以一般由内存作为缓冲区实现预加载与预写入。
这一些列操作都是计算机操作系统(os)帮我们做的。

当登上qq和某位朋友开始聊天,发消息的数据流动过程:
我:输入设备(键盘)——>存储器——>cpu封包——>存储器——>网卡
朋友:输入设备(网卡)——>存储器——>cpu解包——>存储器——>显示器

1. 操作系统

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

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

1.1 设计os的目的

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

1.2 定位

一款纯粹的"管理"软件

在这里插入图片描述
如何理解这个"管理"呢
管理:真正的管理是有"绝策权"的,与"执行权"不同。
任何管理都是先描述,在组织

先看下三层:
底层硬件:学生(被管理者)
驱动程序:导员,楼管,图书管理员(执行者)
操作系统:校长(管理者)

  1. 校长从来不与学生直接见面,通过信息管理,通知执行者导员,对学生进行操作
  2. 驱动层可以帮管理者拿到被管理者的数据
  3. 被管理者信息量很大,信息就需要被组织起来,要组织就要先描述。(可以理解为先声明,在定义)

先描述。

 struct stu
{
    
    
 _name;
 _sex;
 _num;
 _grades;
 struct stu*  next; 
}

在组织:

Struct s1,s2,s3...
s1->next=s2;
s2->next=s3;
...

操作系统操作过于复杂,提供了系统调用接口,操作也有部分成本,所以提供了用户操作接口。

在我们实际进行编程或者开发的时候大多数用的都是lib库函数,有的库函数与硬件进行交互那么,他就会调用系统调用。

总结:

  1. 操作系统是什么?什么是管理?
    一款"管理"软件;具有决策权的才叫管理,执行者不算。
  2. 操作系统怎么进行管理?
    通过驱动操作硬件信息。具有同种类型的信息很多,先描述,在组织。
  3. 操作系统为什么要进行管理?
    一套系统,需要一个管理者进行领导,对上给用户一个稳定高效的执行环境,对下管理好软硬件资源提供稳定的软硬件环境。
  4. lib库函数和系统调用之间的关系
    库函数在系统调用的上层,使用库函数与硬件进行交互的话会调用系统调用。

2. 进程

2.1 认识进程

操作系统一般在硬盘根目录的boot目录。
运行起来的时候加载在内存当中
在这里插入图片描述
当一个程序运行起来被加载到内存的瞬间就成为了进程。

写一个程序:
在这里插入图片描述

2.2 查看进程

2.2.1 第一种方法

首先,运行程序,在另一个窗口通过ps命令查看这个进程

在这里插入图片描述
USER :进程的所属用户,
PID :进程的进程ID号,
%CPU :进程占用的 CPU资源 百分比,
%MEM :进程占用的 物理内存 百分比,
VSZ :进程使用掉的虚拟内存量 (Kbytes) ,
RSS :进程占用的固定的内存量 (Kbytes) ,
TTY :与进程相关联的终端(tty),?代表无关,tty1-tty6是本机上面的登入者程序,pts/0表示为由网络连接进主机的程序。
STAT :进程的状态,具体见2.1列出来的部分 ,
START :进程开始创建的时间 ,
TIME :进程使用的总cpu时间,
COMMAND : 进程对应的实际程序。

2.2.2 第二种方法

线运行程序,在另一个窗口通过ls /proc查找

在这里插入图片描述
可以看到第一种方法查找到mybin 的pid是9797,在第二种方法中右上角也找到了9797。那个9999是grep命令的进程。
通过ctrl+c终止程序,发现9797没有了。
在这里插入图片描述
再次运行呢,又重新分配了pid。(进程1一般都是操作系统)

然后进入9797对应的目录里,这里都是它的基本信息
在这里插入图片描述

3. 通过系统调用获取标识符

1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/types.h>
  4 int main()
  5 {
    
    
  6   while(1)
  7   {
    
    
  8   printf("pid : %d\n" , getpid());
  9   printf("ppid : %d\n" ,getppid());
 10   sleep(1);
 11   }                                                                         
 12 }
~
~

- pid(进程id)
- ppid(父进程id)
运行查看对应的id。
在这里插入图片描述
终止,在重新运行,重新分配了pid。父进程没有变化
在这里插入图片描述
通过ps aux | grep 22717查看进程,发现父进程始终是bash命令。shell为命令行解释器,bash是Linux中的命令行解释器(就和pcb是进程,struct task_struct是Linux中的进程一样)

4. 进程需要注意的几个地方

  1. 内存当中会有很多进程,那么操作系统怎么进行管理呢?
    答:很明显 先描述,在组织。
  2. 进程(Process Control Block简称pcb)在c语言中pcb被定义为struct task_struct
  3. 就像文件=内容+属性一样。程序文件加载进内存成为进程,那么进程是一定比原文件体积要大的。
  4. 描述进程的数据结构,就是一批结构体对象。
    所以一个进程实际的大小就是可执行程序+所需要的数据结构的集合
struct task_struct
{
    
    
   1.标识信息
   2.运行信息,时间
   3.优先级信息
   4.上下文(假如程序暂时停止,等到他恢复的时候还要让他继续运行)
   5.关系信息
   6.信号
   7.状态
   
}
  1. 在Linux内核,采用双链表进行管理进程
  2. 为什么bash(命令行解释器)要存在子进程?
    答:在对Linux进行操作时,总会有些指令出现bug,那么作为父进程他是不可以被挂掉的,他一出现问题所有的命令不能在被执行,所以每次在命令行运行命令bash创建自己的子进程,即使出现问题子进程挂掉也不影响父进程。

猜你喜欢

转载自blog.csdn.net/qq_45928272/article/details/113784080