操作系统中的进程


操作系统是计算机中最重要的软件,常见的操作系统有 Windows ,Linux ,iOS,Android等等

一、操作系统的基本定位

基本功能 :

  1. 管理计算机中的各种硬件设备
  2. 给计算机上的各种软件资源提供稳定的运行环境

在计算机中操作系统处于的位置如下图:

在这里插入图片描述

比如,写一个简单的 Java 代码 System.out.println(“hello world”);

这句代码写在了引用程序当中。

在 println 方法内部,就会调用到操作系统提供的一个 API,对于 Linux 来说这个 API 是一个 C 语言提供的一个叫 write 的函数。

通过操作系统调用该 write 函数,逻辑就会进入到内核中执行。

操作系统内核就会找到显示器的驱动,将要打印的数据传输了过去。

最后由显卡驱动,操作显示器,将要打印的数据 hello world 打印在了

二、操作系统中的进程

进程是操作系统管理的一个非常重要的软件资源。我们可以通过任务管理器来查看进程

在这里插入图片描述

在进程这一栏中显示着当下计算机正在运行的各种程序以及后台运行着的程序,当我们再点击一个可执行程序后,就会发现进程中又会多出一条新的记录。

因此,进程实际上就是运行起来的程序,也可以认为进程是一个可执行文件跑起来之后的动态过程在操作系统的内部,就是根据进程来分配资源的。

2.1 进程管理

Linux 操作系统中用一个结构体来描述进程,该结构体称作 PCB(Process Control Block 进程控制块),包含着该进程具备的各种信息。然后通过双向链表将 PCB 组织起来(此处只是针对一个进程中只有一个线程的情况)。

当打开一个应用程序,运行起来一个新的进程时,就会创建新的 PCB ,并将其添加到双向链表中,关闭一个程序后,操作系统就会找到对应的 PCB ,然后将其删除。向任务管理器中显示着所有的进程,实际上就是双向链表进行遍历的结果。

2.2 进程属性

PCB中包含的字段

  1. PID:身份标识
  2. 内存指针:在操作系统的内部,进程是操作系统进行资源分配的基本单元,只要运行了这个进程,就会给该进程分配一定的内存空间。内存指针就是在描述该进程使用的内存是哪些范围,描述了哪里是代码段,哪里是数据段
  3. 文件描述符表:描述该进程都打开哪些文件。文件描述符表可以看做是一个结构体数组,各个结构体描述了对应的文件的信息,数组的下标就成为 “文件描述符”。一个系统启动,默认打开标准输入,标准输出,标准错误这三个文件。
  4. 进程状态
  • 运行状态:当某进程正在运行时
  • 就绪状态:进程具备运行的条件,等待系统分配内存来运行
  • 睡眠状态:也叫阻塞状态,指进程不具有运行条件
  1. 优先级:调度进程的时候,给每个进程安排的时间和先后都可以存在差别
  2. 上下文:操作系统在执行某个进程的时候,如果需要把该进程从 CPU 上调度走,就需要保存 CPU 的运行现场,包括寄存器中的数值之类的,等到下次调度该进程的时候,就可以继续从上次保存的位置继续往后执行。类似于读档存档操作。
  3. 记账信息:统计了每个进程执行的时间和指令的数目,根据这来平衡调度的效果

进程状态、优先级、上下文、记账信息这几个是和进程调度相关的属性。那么什么是调度。在一个系统上同时在跑的进程数是要比 CPU 的核心数多得多的,导致这些进程互相争夺 CPU 资源,这个时候就需要进程调度,按照一定的策略,动态的将 CPU 资源分配给处于就绪状态的进程们,使他们能够有条不紊的被执行。

什么时候会引起进程调度呢?

  1. 一个进程运行完毕或者遇到异常情况。此时就需要执行新的就绪状态的进程,避免 CPU 资源的浪费
  2. 一个正在运行的进程被阻塞进入了睡眠状态
  3. 在抢占式调度中,一个优先级较高的进程被创建
  4. 在抢占式调度中,一个高优先级进程由阻塞唤醒
  5. 在分时系统中时间片已经被用完

2.3 并行和并发

并行:CPU 中有俩核心,同时在执行两个进程的指令,这两个进程同时进行着,并且互不干扰。

并发:只有一个核心,“同时”在执行多个进程的指令,实际上只是宏观上同时执行,微观上 CPU 在同一时刻只有一条指令正在执行,然后靠着快速的切换使得宏观上感觉像是同时执行多个进程。

就比如B站何同学自制的AirDesk可以实现给多个设备同时充电的功能,桌子下的线圈会感应到需要被充电的设备,然后给它充电。线圈只有一个,当桌子上有多个需要被充电的设备时,只需要线圈在这几个设备之间快速的切换位置,只要切换的够快,宏观上就感觉设备同时在充电。

2.4 进程的独立性

在操作系统中需要给软件提供一个稳定的运行环境,就需要各个进程保持独立性,一个进程出了问题,不会波及到其他的进程,更不会波及到整个系统。

就像是 OJ 系统,用户提交的代码都需要是一个进程,保持一定的独立性,否则写出了什么危险代码,就有把整个系统搞挂的可能性,这样谁也用不了该系统。

因此,操作系统会给每个进程分配一个独立的“虚拟地址空间”,保证当下的每个进程之间,访问的内存没有公共区域,互相之间无法产生影响。

2.5 进程间通信

进程之间存在着独立性,但有些时候需要多个进程之间相互配合来完成一些工作,操作系统提供了一些“进程间通信”机制,让进程在有限的情况下进行一些沟通交互工作。该机制就是在进程独立性的要求上,提供了一些专门的区域,让多个进程可以同时访问到。比如共享内存,消息机制,全局变量之类的

完!

猜你喜欢

转载自blog.csdn.net/weixin_46103589/article/details/123996844