linux-进程(1)

1.冯诺依曼体系结构

在讲解进程之前,要先知道什么是冯诺伊曼体系结构。冯诺依曼体系结构是如今最主流的体系结构,所有的硬件可以分为5大单元,单元之间存在交互。

运算器和控制器就是cpu,运算器就是帮助计算机做运算的,控制器就是控制硬件之间的交互。

输入设备最常见的就是键盘,话筒,鼠标.....

输出设备最常见的就是声卡,显示屏,磁盘......

当然有些设备既做输入,也做输出.......

存储器指的就是内存,内存有个特点就是掉电易失,就是说没电了数据容易丢失。

但是磁盘就是永久性存储介质,即使没电数据也会在,是个输入或者输出设备。

关于冯诺依曼,必须强调几点:

这里的存储器指的是内存。

不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。

一句话,所有设备都只能直接和内存打交道。

各个设备之间是独立的,但是通过电路,各个设备又是连接起来的,目的是为了设备之间的数据流动。

数据的流动就是从这个设备拷贝到另外一个设备,那么拷贝的速度快慢就决定了计算机效率的快慢。

 那么输入设备和输出设备之间存在一个cpu来快速计算不就可以了吗?为什么要使用存储器来减慢速度呢?因为存储器的造价,效率,单体容量都是适中的的。而输入和输出设备的速度太慢了,如果直接将数据交给cpu的话,又太快了,那么数据一交给cpu,cpu一下子就计算完成了,那么整体的效率也就变慢了。那么此时存储器就很重要了,可以调和这个效率,输入设备将数据给存储器,存储器将数据交给cpu计算,然后将计算好的数据返回给存储器,再由存储器交给输出设备。

那么这样做的话不就是增加了拷贝数据的次数吗?怎么会变得更快呢?那么在cpu计算数据1的时候,数据2已经通过输入设备加载到了存储器,这就是预加载,在cpu计算数据2的时候,数据1已经被存放在了存储器,输出设备需要的时候就直接从存储器拿,这就是缓存,通过预加载和缓存就能提高计算机的效率

正是因为冯诺依曼这种体系结构引入了内存,将效率问题转化成了软件问题,使得内存快慢决定计算机的快慢,让大家能使用效率不错i的计算机。


2.操作系统(Operator System)

2.1概念

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

内核(进程管理,内存管理,文件管理,驱动管理)

其他程序(例如函数库, shell程序等等)

2.2设计OS的目的

与硬件交互,管理所有的软硬件资源

为用户程序(应用程序)提供一个良好的执行环境

os是怎么管理硬件的呢?每一款硬件设备都有对应的厂商,每家厂商都会为硬件设计软件,也就是驱动程序来管理硬件,所以os只需要管理硬件对应的驱动程序就行了。  

管理硬件资源是手段,为的是为用户提供良好的执行环境,那么用户想要使用硬件设备的时候,就直接去访问os吗?不是的,os内有大量的数据,如果给用户直接访问的话,就不安全,所以用户需要使用系统调用的接口来调用os,防止用户直接访问os,提高了安全性。

scanf和printf都使用了硬件设备,那么这两个函数的底层一定封装了系统调用,只有这样才能通过系统调用来使用硬件设备,用户不能直接跳过系统调用接口来调用os,也不能跳过os来使用硬件设备。

2.3定位

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

2.4总结

计算机管理硬件

1. 描述起来,用struct结构体

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


3.系统调用和库函数概念

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。

系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。


4.进程

4.1基本概念

课本概念:程序的一个执行实例,正在执行的程序等

内核观点:担当分配系统资源(CPU时间,内存)的实体。

我们平时写的程序会存放在哪里呢?大家都知道程序是二进制文件,那么就存放在磁盘中, 磁盘就是硬件设备。那么当我们运行起来这个文件,根据冯诺依曼体系结构,这个文件会先加载到内存中,然后再被cpu进行计算。 

我们在使用计算机的时候,可以同时启动很多个程序,那么就代表着内存中可以加载很多个文件,那么os就需要对这些加载到内存的文件进行管理,那么os怎么进行管理呢?先描述,在组织。

4.2描述进程-PCB

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。

课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct

4.2.1task_struct-PCB的一种

在Linux中描述进程的结构体叫做task_struct。

task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息

4.2.2task_ struct内容分类 

标示符: 描述本进程的唯一标示符,用来区别其他进程。

状态: 任务状态,退出代码,退出信号等。

优先级: 相对于其他进程的优先级。

程序计数器: 程序中即将被执行的下一条指令的地址。

内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。

I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。

记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

其他信息

那么有了PCB之后os就认识了这些程序,因为PCB描述了这些程序的属性。那么os管理进程就变成了管理PCB的链表。

4.3组织进程

可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。

4.4查看进程

进程的信息可以通过 /proc 系统文件夹查看

如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹

大多数进程信息同样可以使用top和ps这些用户级工具来获取

当我编译下面这段代码生成可执行程序时,再将它运行起来,就有了一个进程,那么我们怎么知道有一个进程了呢?

使用下面这段指令,就能查到这个可执行程序对应的进程,第二行就是对应的进程。

那么第三行是什么呢?grep这个指令执行起来后也会变成一个进程,所以第三行是grep这个指令执行后所产生的进程。所以可以得出一个结论:几乎所有独立的指令,都是一个程序,执行后都会变成进程!
 

 需要注意的是进程是有生命的,如果进程结束了就查不到了,所以我们可以使用do-while的指令查看到进程从开始到结束的全过程。


 今天的分享到这里就结束了,感谢大家的阅读!

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-01 13:38:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-01 13:38:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-01 13:38:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-01 13:38:05       18 阅读

热门阅读

  1. flask+uwsgi+云服务器 部署服务端

    2024-04-01 13:38:05       22 阅读
  2. 【微服务篇】分布式事务方案以及原理详解

    2024-04-01 13:38:05       16 阅读
  3. 多线程(24)Future接口

    2024-04-01 13:38:05       15 阅读
  4. 设计模式之策略模式

    2024-04-01 13:38:05       12 阅读
  5. Spark数据倾斜解决方案

    2024-04-01 13:38:05       16 阅读
  6. 如何用Redis实现消息队列

    2024-04-01 13:38:05       19 阅读
  7. Codeforces Round 932 (Div. 2)(A,B,C,D)

    2024-04-01 13:38:05       16 阅读
  8. [蓝桥杯 2016 国 C] 赢球票

    2024-04-01 13:38:05       17 阅读
  9. 专升本-大数据

    2024-04-01 13:38:05       18 阅读