操作系统初识
操作系统
概念
操作系统,是一个“软件”,是计算机上最重要,最复杂的软件之一。常见的操作系统有:Windows,Linux,Mac,iOS,Android 等。
作用
操作系统是一个管理计算机资源的软件,会管理好各种硬件设备,会给各种软件提供稳定的运行环境。
进程
进程说白了就是一个跑起来的程序,就是可执行文件“.exe”文件:
双击这些 exe 文件之后,操作系统就会把这个 exe 文件加载到内存当中,并且让 CPU 开始执行 exe 内部的一些指令,这些运行起来的可执行文件就是 进程。像任务管理器里面看到的这些,都是进程。进程也叫任务:
要想让一个进程正常工作,就需要给这个进程分配一些系统资源:内存,硬盘,CPU
线程
线程是进程内部的一个部分,进程包含线程,加入进程是一个工厂,线程就是工厂里面的流水线。
操作系统如何管理进程
- 先描述一个进程(明确出一个进程上面的一些相关属性)
- 再组织若干个进程(使用一些数据结构,把很多描述进程的信息放到一起,方便增删改查)。在 Linux 当中典型的实现:双向链表。通过双向链表,把每个进程的 PCB 连起来。
操作系统里面主要是通过 C/C++ 来实现对一个进程的描述,所以这里的描述就是用:结构体 来描述的,和 Java 的类差不多,不过结构体功能更简单。操作系统当中描述进程的结构体,叫做:PCB(进程控制块)。
创建进程:就是创建出 PCB,然后加到双向链表当中。
销毁进程:就是找到 PCB,然后从链表当中删除
PCB 当中的一些属性
- pid(进程id):进程的身份标识。
- 内存指针:指明了这个进程要执行的代码/指令在内存的哪里,以及这个进程当中依赖的数据都在哪里。
- 文件描述符表:程序运行过程当中,和文件处理有关。每次打开一个文件,就会在文件描述符表上多增加一项。(文件描述符表可以看作是一个数组,里面的每个元素又是一个结构体,就对应一个文件的相关信息)
- 一个进程只要启动,就会默认打开三个文件:标准输入,标准输出,标准错误。
并发和并行
并行:微观上:多个 CPU 核心,同时执行多个任务的代码。
并发:微观上,一个 CPU 先执行一会儿任务1,再执行任务2,再执行任务3,然后再执行任务1,这样来循环。宏观上来看,切换的快,就好像很多任务在同时执行。
进程的调度
实现进程调度所需的属性:状态,优先级,上下文,记账信息。进程调度(多任务操作系统):一个系统同一时间,执行了很多的任务。
- 进程的状态:描述了当前的进程接下来应该怎么调度。就绪:随时可以到 CPU 上去执行,就是随叫随到。阻塞/睡眠 状态:暂时不可以去 CPU 上执行。
- 进程的优先级:先给谁分配时间,后给谁分配时间。以及给谁分配的多,给谁分配的少。
- 进程的上下文:表示上次进程被调度出 CPU 的时候,当时程序的状态,下次进程进入 CPU 的时候,就恢复到之前的状态,然后继续往下执行。 就类似于存档和读档。
- 进程的记账信息:统计每个进程都分别被执行了多久,分别都执行来哪些指令,分别都排队等了多久,给进程调度提供指导依据。
进程的调度,其实就是 操作系统在考虑 CPU 资源如何给各个进程分配。
内存资源是通过:虚拟地址空间来分配的,就是进程的独立性。
由于操作系统上,同时运行很多进程,某个进程出现 bug 并不会影响其它进程,因为做到了进程独立,就是使用了:虚拟地址空间。如果发现某个程序出现 bug 了,就可能引起其它进程的崩溃。解决方法就是给出很多线程,这些道路之间彼此隔离开,彼此走各自的道路,就不用担心引起其它进程的崩溃。
进程间通信:有些时候,进程是需要交互的,所以就提供一个公共空间来进行交互。一个进程把数据放到公共空间,另外一个进程来取走,这样的话,隔离性就不会被打破。
在操作系统当中,提供的”公共空间“有很多种,而且各有特点,有的存储空间大,有的小,有的快,有的慢。操作系统当中提供了很多种这样的进程间的通信方式。现在最主要的就是:文件操作(I/O),网络操作(socket)。
版权归原作者 Lockey-s 所有, 如有侵权,请联系我们删除。