操作系统简要知识

一.操作系统的性质与作用

操作系统是一个软件,由代码构成程序

  1. 主要职责是管理各种硬件设备
  2. 给其他软件提供稳定的运行环境

由于一个电脑有许多硬件,每种硬件都有许多不同厂商,各自硬件如何在电脑上正确无误使用就依赖于操作系统,由操作系统管理不同硬件设备并提供给软件统一的api

二.进程/任务(Process/Task)

进程就是操作系统提供的一种 "软件资源",是进行系统资源分配的基本单位,每个进程都需要消耗一定的硬件资源

一次仅能运行一个进程的操作系统称为单任务操作系统,许久以前的设备,一次性只能运行程序,例如古早的手机如果想使用QQ只能在前台打开才可接受信息,切出QQ到别的程序QQ无法接受信息

能运行多个程序的称为多任务操作系统,例如如今的手机,电脑,手机可以在后台挂QQ微信,甚至游戏,电脑更为直观,打开任务管理器即可看到许多进程

进程如何管理(以Linux为例)

1,描述

使用,结构体/类,这样的方式罗列出进程的属性,操作系统一般由C/C++实现,没有Java写的操作系统 ,一般使用的是结构体

该结构体称为PCB(Process Control Block)

c 复制代码
struck task_struct{...}

2,组织

运用数据结构将许多结构体/对象,串到一起

Linux中使用链表结构串联许多个结构体

我们使用的任务管理器就是对链表信息的遍历,打印,删除...

三.PCB的核心属性

1)pid

进程的身份标识,系统会保证,同一时刻,同一机器上,每个进程的pid是唯一的,因此后续对进程进行操作常常依靠pid作为标识

2)内存指针

内存是进程运行中消耗的重要资源,每个进程都需要对系统发送申请后才由系统给进程分配资源。

内存指针即描述了该进程可使用的内存(包括该部分内存哪部分是指令,哪部分是数据)

3)文件描述符表

描述进程所涉及的 硬盘 相关资源

进程常常需要访问硬盘, 操作系统把上面提到的各种资源(文件、设备、管道、套接字等)都抽象成了"文件" 。对进程来说,操作键盘输入、硬盘文件、网络连接,都可以用一套相似的"读文件"、"写文件"的接口。

4)状态

描述某个程序是否能到(是否合适)CPU上执行

分为:

就绪状态,随时可到CPU上执行

阻塞状态,例如进程在等待IO(等待与挂起),此时如果将程序放到CPU上执行,由于用户的IO时机不确定,即使在CPU上程序依旧无法继续进行,浪费了CPU资源,因此不适合此时到CPU上执行,因此划分为阻塞状态

4)优先级

结合下文四.进程对CPU的消耗观看

多个进程间每个进程在CPU上执行的时间不是平均的,有的进程执行时间片较其他的多,就表示了该进程的优先级较高

5)记账信息

每个进程占据了多少CPU时间会被进行统计,称为记账信息,用于避免某个进程完全无CPU资源分配,根据记账信息来调整CPU分配时间片的策略

上下文

进程上下文就是操作系统给每个进程进行的"游戏存档"。

当需要换另一个进程运行时,操作系统就进行对当前进程的存档,然后加载下一个进程的读档。

这样,每个进程被切换回来时(重新对该程序读档),都能精确恢复到它上次被暂停的地方,就像什么都没发生过一样。这是实现多任务(同时"运行"多个程序)的基础。

四.进程对CPU的消耗

CPU每个逻辑核心,同一时刻,仅能执行一个进程,因此为了实现多任务进程,将运用分时复用(并发)机制

以单核为例,单核CPU上,

把连续的时间轴划分成一个个非常小、长度固定的时间间隔,称为 "时间片"。

轮流分配: 操作系统按照特定的规则(如轮询、优先级),将每个时间片依次分配给不同的进程

快速切换: 资源在不同使用者之间快速切换。当一个进程的时间片用完,无论它是否完成任务,资源都会被强制收回并分配给下一个等待的进程。

宏观并发: 由于时间片非常短(毫秒甚至微秒级),切换速度极快,从用户或宏观角度看,多个进程就像在"同时"进行

五.内存管理

核心结论:进程独立性,每个进程的内存是彼此独立,互不干扰的

为了维护系统的稳定性(防止一个进程的崩溃影响其他进程),通常情况下一个进程无法访问另一个进程的内存。

进程间通信

虽然进程具有独立性,但是无法避免的,会有多个点进程相互配合完成的工作。

有许多方法可进行进程间通信,所有方法本质上都是通过创建某种形式的"公共访问区域",让不同进程能通过该区域交换数据或状态

Java程序员主要使用的进程间通信方式是网络,网络支持不仅支持同一主机不同进程的交换,还支持不同主机的不同进程间交互

后端常常是一组服务器间进行通信

相关推荐
lkbhua莱克瓦2435 分钟前
Java基础——常用API2
java·笔记·github·学习方法
java_logo1 小时前
Docker 部署 Rocky Linux 全流程教程
linux·运维·服务器·docker·容器·1024程序员节
丰锋ff1 小时前
英一2016年真题学习笔记
笔记·学习
摇滚侠1 小时前
Spring Boot3零基础教程,Lambda 表达式与函数式接口,笔记95
java·spring boot·笔记
新子y1 小时前
【小白笔记】稀疏数组 (Sparse Array) 在计算机科学中的存储优化问题
笔记
Lynnxiaowen1 小时前
今天我们学习Linux架构keepalived实现LVS代理双击热备
linux·学习·架构·云计算
摇滚侠1 小时前
Spring Boot3零基础教程,Lambda 表达式的使用,笔记96
spring boot·笔记
0wioiw02 小时前
Ubuntu(⑤Redis)
linux·运维·ubuntu
我爱钱因此会努力2 小时前
ansible实战-不同的用户登录不同的主机
linux·运维·服务器·ansible
Wang's Blog2 小时前
Linux小课堂: 系统核心技能与应用总结与进阶指南
linux·运维·服务器