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