【多线程】进程

1.CPU

1.1 两种架构:X86架构;arm架构

(1)不同架构的cpu,支持的指令集(机器汇编)不同,对应的机器语言/汇编(cpu指令-二进制)语言不同;
(2)现在的x86cpu都是64位的

1.2 cpu位数

int *p=NULL;
printf("%d",sizeof(p));

若cpu是16位cpu,得到结果是2(2个字节,16个bit位);
若cpu是32位cpu,得到结果是4;若cpu是64位cpu,得到结果是8;
cpu位数和代码中内存地址用几个字节表示密切相关.

1.3 cpu构成

(1)门电路=>半加器=>全加器=>加法器=>ALU运算器=>差不多构成cpu
(2)cpu以及其他内存,硬件等重要设备都是门电路构成
(3)门电路由晶体管构成-基本单位足够多,足够小,小到nm级,越小集成程度越高,算力越强
(4)“多核cpu”-cpu核心,每个核心相当于完整cpu,多个软件-“并发编程”-cpu的核心数是重要参考证据,一个cpu当成两-“超线程技术”
(5)现在的cpu都是这种多核+超线程技术加持的产物,cpu的好坏不光要看核心,也要看频率
(6)核心数-多个核心运算能力;主频(基准频率,睿频)-单个核心运算能力

1.4 频率-描述单个cpu核心的速度

(1) 单位HZ- 一秒钟的次数 GHZ=1024MHZ MHZ=1024KHZ 1KHZ=1024HZ
(2)睿频技术-cpu的频率动态发生变化,即衡量任务多不多
(3)衡量一个cpu的单核性能,既要看基础频率(下限),最大睿频(上限)

2.指令

2.1 执行指令过程

指令就是内存中的一段数据;代码运行需要让操作系统先把写好的并编译好的指令加载到内存中,然后cpu才能执行
从0号地址开始执行程序,cpu先从0号地址读取数据到cpu寄存器,并对指令进行解析(查询指令表)

2.2 执行与冯诺依曼体系结构

冯诺依曼提出体系本质:把执行和存储分开-为了解耦合-降低硬件设计成本;
在当年很必要-cpu执行指令速度和存储器取指令差不多,相互配合很好;
但随着硬件发展,cpu越来越快,但内存读取数据提升不明显,设置缓存解决问题

2.3 CPU执行指令总结

1.cpu要执行指令是先在内存中(冯诺依曼体系结构基本设定-让执行单元与存储单元解耦合)
2.cpu要执行指令就要先取指令,在解析指令,然后才能执行指令
3.取指令需要从内存中读取指令到cpu寄存器中,取指令很耗时,通过引入缓存,流水线优化等技术
4.cpu解析指令需要指令表,不同架构cpu支持指令表不同
5.指令在执行过程中,可能会带有一些操作数,不同指令,操作数的个数含义不同
6.cpu重要参数,主频:-1s之内,一个核心能执行多少条指令(机器语言最终由CPU执行)

3.操作系统

3.1 基本介绍

1.是一个由代码构成程序的软件
2.主要职责:抽象封装

(1) 管理各种硬件
(2) 给其他软件提供稳定的运行环境

即:统一管理各种不同的硬件设备,给软件提供统一的api(类似jdbc),操作系统也提供一些管理软件资源的api,普通代码也可以通过调用api来完成特定工作(多线程,网络编程)

3.2 进程与任务

1.正在运行的程序,称为任务/进程
2.多任务操作系统:同一时刻,可以同时运行多个任务,来回切换也算,
3.单任务操作系统:同一时刻,只能运行一个任务,没有后台
4.每个任务在执行过程中都消耗一定硬件资源
5.进程是系统分配资源的基本单位-内存,硬盘

进程在系统中管理
1.先描述(使用类/结构体这样的方式把实体属性列出来);

表示进程信息的结构体PCB(Process Control Block)–进程控制板块;
PCB是操作系统学科里通用概念,在Linux是一个叫做struct task_struct{…}这样的结构体;

2.再组织(使用一定的数据结构(链表)把这些结构体/对象串到一起);

看到任务管理器进程时,表示系统内部在遍历链表并打印每个阶段的相关信息;
运行一个新程序,系统多一个进程,即需要构造一个新的PCB并添加到链表上;
若运行中的程序退出,需要把对应进程的PCB从链表中删除掉并销毁对应PCB资源;

PCB的核心属性
PCB是一个非常庞大的结构体,有上百个属性;

1.pid-进程的身份标识符,通过简单的不重复整数区分,是唯一的,用pid可对进程操作区分

2.内存指针-表述进程能使用哪些内存,表述进程使用内存资源详细情况

进程运行中需消耗一些系统资源,内存就是重要资源
每个进程,先从系统申请,内存才能使用,需要知道哪里存指令和数据
指令和数据都要加载到内存中
双击exe-运行进程-系统先把exe这个文件里的内容(指令和数据)先加载到内存中,在创建进程,让进程开始执行

3.文件描述表-操作系统对硬盘设备进行封装(文件),存储器=内存+外存

操作系统是统一进行抽象,都是按照文件方式操作
进程想要操作文件,需要先打开文件-让进程在文件描述符表中分配一个表项(构造一个结构体),表示这个文件的相关信息;进程消耗CPU资源:当前计算机执行过程都是并发(分时复用)+并行同时存在
fopen-C语言的标准库函数-操作系统提供的api(Linux)-open
进程消耗CPU资源:当前计算机执行过程都是并发(分时复用)+并行同时存在;

4.状态:表述某个进程是否能去CPU执行

就绪状态:随时准备好去CPU执行
阻塞状态:当前不方便去CPU执行,不应该调度(进程在等待/挂起IO:来自控制台/硬盘/网卡的输入输出)

5.优先级:先调度谁都可以进行调配

6.记账信息:针对每个进程占据多少CPU时间进行统计,会根据这个统计结果来进行调整调度的策略

在下一个轮次进行调整,确保每个进程都不至于完全捞不着CPU的情况.

7.上下文:支撑进程调度的重要属性:相当于游戏中的存档和读档;

是PCB中的数据结构相当于是在内存上的;
每个进程在运行过程中,会有很多中间结果,在CPU的寄存器中;
存档:在进程调度CPU之前,把当前寄存器中的这些信息给单独保存到一个地方;
保存上下文:把CPU的关键寄存器中的数据保存到内存中(PCB的上下文属性中)
读档:在该进程下次再去CPU上执行的时候,再把这些寄存器的信息给恢复回来;
恢复上下文:把内存中的关键寄存器的数据加载到CPU对应寄存器中

内存分配-内存管理

每个进程的内存:彼此独立,互不干扰;通常情况下,进程A不能直接访问进程B的内存(系统稳定性)

进程间通信

虽然有进程独立性,但有时候也需要多个进程相互配合,完成某项工作
进程间通信和进程的独立性并不冲突,系统提供公共空间(多个进程都能访问到),让两个进程借助这种公共空间来交互数据
通信方式:管道;共享内存;文件;网络;信号量;信号
在java中不鼓励多进程,而是多线程!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值