操作系统任何处理线程
1.先描述一个进程(明确出一个进程上面的一些相关的属性)
操作系统里面主要是通过c/c++来实现的,此处的描述其实就是用的c语言中的"结构体"(操作系统中描述进程的这个结构体称为"PCB"(process control block)进程控制块。
2.再组织若干个进程(使用一些数据结构,把很多描述进程的信息放到一起,方便进行增删查改)
典型的实现就是使用双向链表把每个进程的PCB给串起来。
1.“创建进程”就是先创建出PCB,然后把PCB加到双向链表中。
2.“销毁进程”就是找到链表上的PCB,从链表中删除。
3.“查看任务管理器”就是遍历链表
PCB中的一些属性
1.pid
pid(进程id)为进程的身份标识
2.内存指针
指向该进程持有的一些重要数据在内存中的位置。
重要的数据包括:a)执行的指令都有啥 b)这些指令依赖的数据都是啥。
内存是操作系统给该进程分配资源的一部分。
3.文件描述符
程序在运行的过程中,经常要和文件打交道(文件是在磁盘上),进程每次打开一个文件,就会在文件描述表上多增加一项(这个文件描述符表可以视为一个数组,里面的每一个元素是一个结构体,就对应一个文件的相关信息),这个文件描述表的下标就称为文件描述符.
一个进程只有一启动,不管你代码中是否写了打开/操作文件的代码 ,都会默认的打开三个文件。 1.标准输入文件 2.标准输出文件 3.标准错误文件
什么是进程调度?包含了那些属性?
用通俗的话来将就是:一个系统同一时间执行了很多任务,这件事就是“进程调度”(进程调度就是操作系统在考虑CPU资源如何给各个进程分配)
A.有钱的 B.长的帅 C.有钱又帅。我们需要合理的管理时间,避免同一时刻三个人碰面
2.1状态
这个状态描述了当前这个进程接下来应该怎么调整 1.就绪状态:随时可以去CPU上执行 2.阻塞状态/睡眠状态,暂时不可以去CPU上执行
2.2优先级
先给谁分配时间,后给谁分配时间,以及分给谁多谁少
2.3记账信息
统计每一个进程,都执行了多久,分别都执行了那些指令,分别都排队等了多久——给进程调度提供了指导依据。
2.4上下文
表示上次进程被调度出CPU的时候,当时程序的执行 状态条件下,下次进程上的CPU的时候就可以恢复之前状态然后继续往下执行。 进程被调度出CPU之前,要先把CPU中所有的寄存器的数据都给保存到内存中相当于存档。 下次进程再被调度到CPU的 时候,就可以从刚才的内存中恢复到这些数据到寄存器中,相当于读档。
并行和并发
并行:微观上,两个CPU核心,同时执行两个任务的代码 并发:微观上,一个CPU核心,先执行一会任务1,再执行一会任务2,再执行一个任务3.....再执行任务1,只要切换的足够快,宏观上看起来就好像这么多任务同时在进行。
进程的独立性是什么
由于操作系统上,同时运行着很多个进程,如果某个进程出现了BUG,进程崩溃是否会影响其他进程呢?
进程的独立性保证了如果出现bug不会影响到其他进程,能够做到这一点就是"进程的独立性”来保证的,并且依赖了“虚拟地址空间”
进程间的通信
操作系统中,提供的公共空间很多种,并且各有各的特点,有的存储空间大,有的小,有的速度快,有的速度慢,操作系统中提供了多种这样的进程间的通信机制 主要使用的进程通信方式: 1.文件操作 2.网络操作
线程
线程是什么?
线程是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。
举个例子:进程是一个工厂,而线程就是工厂的生产线,一个工厂里面可以有一个生产线和多个生产线
线程在 并发编程上 和进程的区别
通过多进程,我们可以实现并发编程,但是有一个问题,如果频繁的创建/销毁进程,这个事情成本是比较高,如果需要频繁的调度进程,这个事情成本也比较高。
如何解决这个问题呢?
1.进程池
进程池虽然能够解决上述问题,提高效率,同时也有问题,池子里的闲置进程,不适用的时候也在消耗系统里面的资源,消耗的系统资源太多了
2.使用多线程来实现并发编程
线程比进程更轻量,每个进程可以执行一个任务,每个线程也能执行一个任务(执行一段代码),也能过并发编程。
创建线程的成本比创建进程要低得多 销毁线程的成本比销毁进程要低得多 调度线程的成本比调度进程要低得多
为什么线程比进程更轻量呢?进程重在哪?
进程重在资源申请和释放(在仓库里找东西),线程里包含进程中的,一个进程中的多个线程共用一份资源(同一份内存+文件)