操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。 [12]操作系统是人与计算机之间的接口,也是计算机的灵魂。-------------摘自百度百科~
对于操作系统OS,其实大家并不怎么陌生,在日常经常接触到,只不过咱们不叫操作系统这么官方的话语~~尴尬!!操作系统本质是一类软件~如:Windows,Android,iOS等软件,主要有两个功能:
- 对下:要管理号各种硬件设备~
- 对上:要给软件提供稳定的运行环境~
因此,某个软件程序,要想操作某个硬件设备,此时就需要通过操作系统来完成!!
其实操作系统的功能非常多,其中有个和咱们密切相关的功能模板----->进程管理(进程process,任务task)
说白了:一个运行起来的程序就是进程~
.exe是一个可执行文件/一个程序,双击这个.exe文件,程序就会跑起来!在系统中形成一个进程(在任务管理器中可见)
进程管理(为什么要管理进程??进程多了在需要管理)
所谓的进程管理,主要分为两部分:(值得注意的是:主流的操作系统,一般都用C语言来实现的)
- 描述一个进程:使用结构体/类,把一个进程中有哪些信息,表示出来~
- 组织这些程序:使用一定的数据结构,把这些结构体/对象,放到一起~
那么,既然进程中使用了结构体,值得思考一下:进程的结构体里有哪些属性呢??(核心)
- pid:每个进程都需要有一个唯一的身份标识~
- 内存指针:当前这个进程使用的是哪一部分??--------》进程需要跑起来,就需要消耗一定的硬件资源;如:内存……(进程运行的时候,使用了哪些内存上的资源??)
- 文件描述符表:文件?硬盘上存储数据往往以文件为单位进行整理的,进程每次打开一个文件就会产生一个“文件描述符”(标识这个被打开的文件),一个进程可能会打开很多文件,对应了一组文件描述符,把这些文件描述符放到一个顺序表这样的结构里,就构成“文件描述符”;(进程运行的时候,使用了哪些硬盘上的资源??)
因此得出:进程的运行需要从操作系统这里申请资源~
进程是操作系统进行资源分配的基本单位~!!
- 接下来这一组属性都是描述和CPU资源相关的属性~(这些属性都是辅助进行进程调度)
- 进程状态:可以简单的认为进程状态主要是这两个:就绪态:该进程已经准备好,随时可以上CPU ;阻塞态:该进程暂时无法上CPU
- 进程的优先级:进程之间的调度不一定是“公平的”,有的需要优先调度
- 进程的上下文:(有点饿抽象,尽可能的去理解):上下文就是描述了当前进程执行到哪里,这样的”存档记录“;进程在离开CPU的时候,就要把当前的运行中间结果“存档”,等到下次进程回来CPU上,再恢复到之前的“存档”,从上次的结果继续往后执行。 所谓的上下文具体是指:进程运行过程中,CPU内部的一系列寄存器的值(对于寄存器有很多种,其中最典型的作用就是保存当前进程执行的中间结果,包括进行运行到哪一条指令?(存档:进程离开CPU,就需要把这些寄存器的值保存到PCB的上下文字段中; 读档:进程下次回来CPU,再把PCB中的值给恢复到寄存器中~)
- 进程的记账信息:统计了每个进程再CPU上执行了多少次,可以作为调度的参考数据~
对于PCB的属性其实有非常多,如:进程的调度,并发并行,也是非常关键的~~
操作系统往往用双向链表这样的结构来组织PCB
- 创建一个进程,就是创建一个链表的节点~
- 销毁一个进程,就是把链表的节点给删除了~
- 遍历进程列表,就是再遍历链表~
上面所描述的便是进程~,但是在Java圈子中,并不是很鼓励多进程编程,所提倡的是多线程编程~~
Java主要用文件,socket这两种方式完成进程之间的通信~,所以非常鼓励多线程编程,那么,线程又是啥东西呢??接下来跟着笔者看一下多线程是啥东西吧?
聊一聊多线程是啥东西??(Java圈子中常用多线程编程)
首先对于进程而言,进程是比较”重量“的,速度慢/消耗资源多
- 创建一个进程,成本较高
- 销毁一个进程,成本也较高
- 调度一个进程,成本也挺高的
虽然多线程编程可以解决并发编程的问题,但是,不是一个高效的选择~
那么,进程为啥这么重量呢??主要体现在资源分配上,而资源分配往往是一个耗时操作~
相对于进程而言,线程则是一个更轻量的进程(轻量级进程)
约定:一个进程中可以包含多个线程,此时这多个线程都是一个独立可以调度执行的“执行流”(这些执行流之间本身就是并发的),同时,这些线程共用同一份进程的系统资源(意味着:对于线程而言,系统资源是已经分配好了的,创建线程就省下了资源分配的开销~。
进程调度:
- 为啥要调度??狼多肉少~
- CPU是按照并发的方式来执行进程的~
- PCB中提供了一些属性:进程的优先级,进程的状态,进程的上下文,进程的记账信息
操作系统引入进程:目的就是为了能够实现多个任务并发执行这样的效果。进程有个重大的问题,比较重量,如果频繁的创建/销毁进程,成本比较高(资源分配)
线程(进程包含线程)
一个进程里可以有一个线程,或者多个线程~
每个线程都是一个独立的执行流,多个线程之间也是可以并发执行的~
多个线程可能在多个CPU核心上同时运行,也可能是在一个CPU核心上通过快速调度来快速运行
操作系统:真正调度的是在调度线程,而不是进程~
进程是操作系统进行调度运行的基本单位~
进程是操作系统资源分配的基本单位~
一个进程中的多个线程之间:共用同一份系统资源
- 内存空间
- 文件描述符表
只有在进程启动,创建第一个线程的时候,需要花成本去申请系统资源,一旦进程(第一个线程)创建完毕,此时,后续再创建的线程就不必再申请资源了(也不是说完全不申请资源,只是会少很多~),因此,创建/销毁的效率就提高了不少~~
问题:计算机再什么情况下会再创建一个进程??
答:取决于你的代码咋写的!!创建进程和创建线程都是程序员可以控制的~,如:同一个程序,内部想要并发的完成多组任务,此时使用多线程比较合适(如:EV录屏,这是一个程序,同时的录制画面,录制声音………),多个程序之间,此时就是多个进程了(如:EV录屏是一个进程,画图板是另一个进程~)
说了那麽多,找个列子来讲解一下吧~~(滑稽老铁吃100只鸡)
1.当只有一个滑稽老铁吃鸡(100只)的时候,效率比较低
2.当有两个房间,两个滑稽老铁,两张桌子,吃100只鸡,互不干扰(看不到对方的进度)
两个房间就相当于两个进程:多个进程吃鸡方式,提高了效率,这种方式,开销比较大,需要多搞一个房间,一张桌子……,此时这两个滑稽老铁看不到彼此的进度~~
3.当只有一个房间,一张桌子,两个滑稽老铁吃鸡(100只)
此时,两个滑稽老铁在一个房间,一个桌子上吃鸡,相当于多线程的方式吃鸡(此时有两个滑稽老铁,两个线程),房间和桌子啥的都是一份,吃鸡的效率大大提升了,这两滑稽老铁之间能看到对方~~
4.提高滑稽老铁的个数~
当滑稽老铁个数提高以后,此时每个滑稽老铁吃的鸡更少,整体的吃鸡效率就更高了~~
其实,只要系统资源是足够的,进程里的线程也是没上限的,当然也不是越多越好~
桌子所提供的空间是固定的(CPU的核心数是固定的),此时进一步提高滑稽老铁的数量,桌子围满了,剩余的滑稽老铁只能在旁边看着,干着急~!此时,程序的效率没有进一步提升(非但没有提升,还有可能会下降-----》进程调度本身也有开销的,桌子就这么大,此时就算是进程调度,调度上了一个滑稽老铁,势必会导致要挤掉一个滑稽老铁),因此总并发程度仍然是固定的~
但是,当出现:某滑稽老铁A是个暴脾气,在挤来挤去的过程中,没有挤上,很生气,直接掀桌~~
此时,这种情况就相当于:一个线程出现异常,此时就很容易把整个进程都带走~,其他进程也就随之被带走了~~
经过上面的滑稽老铁吃鸡的问题,希望大家能够理解进程与线程之间的区别(非常经典的面试题)
进程与线程的区别~
- 进程包含线程
- 进程有自己独立的内存空间和文件描述符:同一个进程中的多个线程之间,共享同一份地址空间和文件描述符
- 进程是操作系统资源分配的基本单位,线程是操作系统调度执行的基本单位
- 进程之间具有独立性,一个进程挂了不会影响到别的进程:同一个进程里的多个线程之间,如果一个线程挂了,可能会把整个进程带走,影响到其他线程
谈到JavaSE最高频的问题:让你谈谈多态
谈到数据结构最高频的问题:让你谈谈哈希表~
谈到数据库最高频的问题:让你谈谈索引和事务
谈到系统编程最高频的问题:让你谈谈进程和线程的基本概念和区别~
当每次运行一个.exe程序,如:EV录屏,画图板,都是一个一个的进程,每个进程里可以再并发的执行多个功能,就可以通过多线程来完成了,比如:腾讯会议是一个程序,同时可以录制画面,录制声音,网络传输…………
多进程和多线程再咱们电脑中都是同时存在的,不是说,多线程就完全代替了多进程!如:咱们一个班100多号人,每个人都是一个进程(多进程),每个人的脑子里,可能还有一些小九九,某个同学一边听课,一边想中午吃啥~~(多个线程)
多个进程/多个线程,都是可以并发和并行的~
每个程序打开,至少是一个进程,也可能是有多个进程的(Chrome)
一个进程里可以只有一个线程,也可以包含多个线程
系统自带的任务管理器看不到线程,只能看到进程,若要看到线程,则需要使用其他的第三方工具才能看到:windbg…………,关于这段知识,感兴趣的话,请大家借鉴其余博客,在此笔者不做过多的讲述!
~~~~~~~~~~~~~已完~~~~~~~~~~~