进程的概念

        学习进程之前,需要略微谈一谈操作系统。

冯诺依曼体系结构

        什么叫做体系结构?

        这与计算机组成相关,一般存在输入单元、输出单元、存储器(内存)、cpu内部的运算器和控制器五大单元,他们通过线运算起来。

        如今,最常见的就是冯诺依曼体系结构。我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。

        

        在计算机组成里,计算机里几乎所有的设备,都有数据存储的能力!

        为什么要谈存储?因为我们设备之间交互的时候本质就是把数据从一个设备拷贝到另一个设备,拷贝的效率就是设备之间通信的效率。

        根据速度分级、成本分级、存储分级,我们可以得到下图:

        总结:cpu为中心,离cpu越近,存储效率越高,造价越贵!

        如果全用高价格,一定导致的就是计算机太贵了,但如果我们全部用便宜的存储介质,计算机价格便宜,但是基本用不了。因此,基于冯诺依曼体系结构的计算机的本质:用比较少的钱,作出效率不错的计算机!!性价比较高,也导致了我们普通人也能用得上计算机了。

        在数据层面上,CPU一般是不和外设直接交互的!

        为什么?

        木桶效应:

        CPU与外设交互会导致整机效率降级!而与内存交互相对而言,效率更高,我们因此也可以将内存看做一个硬件基本的大的缓存!!

那么,对于下列问题是否有着更清晰的认知。

1.程序在运行之前,必须得先加载到内存?为什么?

        程序=代码+数据,最终都要CPU来执行处理,cpu需要先读取到这些代码和数据,而CPU和内存有“数据(二进制层面)”层面的交互,但是形成了一个exe,本质就是一个文件,只能在磁盘(外设)中保存,由体系结构便决定了该文件需要从磁盘加载到内存中再加载到cpu中运行。

2.在你使用软件与他人交流的时候,你发送的信息和传送的文件的过程又是怎么样的呢?

        通过键盘输入或者进行文件传输,我们的电脑首先会加载到存储器,即内存中,然后加载到cpu中进行传输,由于CPU不与外设交互,会再进入内存中与网卡交互输出,通过网络传输到对方网卡中,对方加载到内存、CPU后再进入内存中,最后在显示器中显示出来、加载到磁盘中。

如图:

硬件谈完了,接下来谈软件。

操作系统

1.什么是操作系统?

        任何计算机系统都包含一个基本的程序集合,称为操作系统(OS),其是一款软件,进行软硬件资源管理的软件!是计算机开机后第一个加载的软件。操作系统包括:内核(进程管理、内存管理、文件管理、驱动管理)以及其他程序(例如函数库,shell程序等等)。

2.为什么存在操作系统?

        操作系统将软硬件资源管理好(手段),给用户提供良好的(稳定,高效,安全,易用)使用环境(目的)。如下图:

底层硬件部分按冯诺依曼形式组织在一起。

驱动程序:每一种硬件几乎都有对应的驱动程序。

操作系统处于中间,进行软硬件资源管理。

3.怎么办进行管理呢?

这就需要重要的理念”先描述再组织”,任何管理工作都可以经过这六个字进行计算机建模!

 如何理解先描述?

        人是通过属性认识世界上任何事物/事务的!重要的属性的集合就代表着这个人或者事务。

        而操作系统由于是C语言写的,于是便是用struct结构体来描述。也因此,操作系统作为管理者,其内部一定会存在大量的对象和数据结构!

如何理解再组织?

        通过描述后对每一个对象通过一定规律进行组织。

        在操作系统里,则是通过链表或者其他高效的数据结构进行组织起来。

对于下三层,由于操作系统并不相信任何用户,但仍需要向用户提供服务。

4.操作系统怎么对用户提供服务?

操作系统管理的核心是:1.进程管理;2.内存管理;3.文件/IO管理;4.驱动管理。

一般一个用户想访问非常底层OS数据或者访问硬件,必须贯穿整个层状结构!!

        这就有了系统调用这一层。

系统调用,使用起来比较麻烦。

        站在用系统的人,外壳程序(shell,图形化界面)

        站在系统上开发的人的角度,可以直接调用系统接口,为了更好的让人使用,将系统接口可以封装成为各种各样好用的函数,打包形成库!所有的开发者,用很多功能,不能自己去写了,而是直接调用库函数即可!

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

        

        那么,进程自然也是操作系统通过先描述后组织的方法来进行管理起来的!

进程

        对于进程,我们是否可以猜测程序从磁盘加载、拷贝到内存里,就形成了进程?在操作系统里,我们可以同时间打开许多程序,这就是否意味着我们可以同时存在多个进程?那么操作系统是不是要管理所有的进程呢?那么如何管理呢?“先描述,再组织”,由于操作系统是C语言来写的,因此先描述就是使用struct来描述进程的各种属性。

1.什么是进程?

        进程 = 可执行程序 + 内核数据结构(PCB),这样方便OS对进程进行管理。在操作系统中,进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合,称之为PCB(process control block)。

        进程的描述对象就是PCB,每当把磁盘里的程序加载、拷贝到内存中后,就会创建对应的PCB,再进行组织,对进程的管理,被建模成为了对链表的增删查改!!

        在linux里,进程的PCB具体是struct task_struct{}

那么PCB的属性就是task_struct中定义的成员变量,task_struct的成员变量又有哪些呢?

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

        因此,对于进程的管理就有了具体化的对象,对于进程的学习也便是对PCB的成员变量的学习以及对操作系统如何管理PCB的学习。而我们运行的所有的指令,软件,自己写的程序,最终都是进程!!

对此,我们已经有了进程的基本框架了,task_struct的核心字段便是我们深入学习的目标。我们通过下列问题进行深入学习。

在linux中,登陆之后,命令行启动的进程,父进程一直不变?

        1.这个父进程是谁?

        2.父进程是什么?

        3.如何获取父进程的ID?

在linux中创建进程的方式:(1)命令行中直接启动进程,即手动启动;(2)通过代码进行创建。因此,启动进程,本质就是创建进程,一般通过父进程创建!我们命令行启动的进程都是bash的子进程。而我们可以使用系统调用即getppid()来获取父进程ID。

2.如何查看进程?       

根据Linux中一切皆文件的性质,以此可以通过动态的目录结构/proc,来查看所有存在的进程,而目录的名称就是这个进程的id命名的!

        第一种方法便是通过直接访问这些进程对应的文件进行查看。       

当前工作目录——>cwd——>默认情况下,进程启动所处的路径,就是当前路径!

当前工作目录,可以更改,chdir()

        第二种方法,我们也可以通过top和ps这种用户级工具来获取大多数进程信息。

top:

ps:

        第三种方法,在linux中,我们也可以通过系统调用获取进程标识符。

        getpid()可以得到该程序pid。

        getppid()可以得到该程序的父进程id。

        

           ​​​​​​​

  • 28
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值