原创发自我的公众号:我是攻城师
https://mp.weixin.qq.com/s?__biz=MzAxMzE4MDI0NQ==&mid=2650335998&idx=1&sn=33ec033a05a312cdbd8054dc68cc922d&chksm=83aac6c4b4dd4fd2d79898ceea02afa1d593cbf5e8dd3c768a270ad723b9df935770d229b322#rd
在现在
人人都有一部手机或电脑的年代,我们几乎天天都在使用各种app,如微信,
QQ,抖音,
优酷等等软件,表面上我们是与各种app交互,但如果站在操作系统的角度来看,其实我们每天都是在和各种进程或者
线程打交道,如果你已经有点疑惑了,没关系,下面我们慢慢来聊个明白。
先看这么几个问题:
1,你手机或者电脑上装的各种app在本质上是什么?
2,一个软件打开和不打开的区别是什么?
3,为什么打开的软件越多就感觉系统越慢?
4,为什么你在用微信语音的时候,还能和别人聊天发消息?
下面我们带着问题来学习一下这其中的知识:
首先对于第一个问题比较简单,我们的各种app其实都是一个软件,描述的再专业一些就是一个程序或者一份能执行的代码。
第二个问题,在使用者层面,打开了就是能用的app,不打开就是一个快捷图标,但在操作系统层面就不一样了,打开时候操作系统实际上会创建一个进程来运行,而关闭的时候,进程就会退出。
那么问题来了,什么是进程:简单的说就是一个正在运行的程序实例。 程序的运行是需要
内存和各种操作系统资源的,不同的程序使用的资源是不一样的,比如你打开一个吃鸡游戏和打开一个记事本两者消耗的资源是有很大差异的。
这也就解释了为什么打开的软件越多系统就越卡顿,本质上软件越多,打开的进程就越多,而每个进程都需要一定能资源才能维持运行,我们的操作系统的资源又是有限的,所以占用的越多系统就会越繁忙,就会出现各种卡顿和反应变慢。
仅仅把软件运行起来还是不够的,因为我们还要在软件里面各种交互,比如使用微信语音的同时,还能给对方发图片,或者捞个漂流瓶。再或者使用有道云笔记的时候,你在不停的写字,后台有一个线程会自动每隔一段时间保存一下内存,避免突然断电时内容全部丢失,这底层其实就是使用不同的线程来处理的。
到这里,我们在总结下进程和线程的定义:
进程:一个正在运行的程序实例,包含一个或多个线程,最少有一个线程。
线程:执行进程的一部分程序或者代码指令。
那么
他们之间的区别和联系是什么?
(1)进程包含至少一个线程,果只有一个线程,这个线程通常叫做主线程。线程是进程的一部分代码或者指令
(2)进程有独立的内存存储,线程共享进程的内存空间,此外线程有自己独立的的栈存储。
(3)进程通信只能依靠pipe管道或者
socket,一个进程内的线程可以直接通信
(4)创建一个进程是重量级操作,而创建一个线程是轻量级操作
(5)进程的文件描述符大部分不共享,线程共享文件描述符
(6)进程有独立的signal信号,线程共享进程的signal信号
(7)进程相互之间不依赖,线程之间有依赖。
(8)进程不需要
同步,线程一般需要同步
(9)进程是数据组织的概念,线程是cpu调度的概念
(10) 进程上下文切换慢,线程上下文切换快
最后还有一个问题,子进程与线程有什么关系?这里需要注意子进程也是一个进程,一般用于
多任务的操作系统,子进程也称子任务与进程的性质是一样的,也可以包含一个或多个线程。
总结:
本文主要介绍了操作系统中进程和线程的定义,区别和联系。了解这些知识将更加有助于我们学习和使用多线程编程。有一点需要大家注意,进程是程序的运行实例,类似面向对象编程里面的对象,而程序则更像是一个类,通过这个程序我们可以构造多个对象,也就是我们可以启动多个进程,比如PC上的QQ是可以启动数个的,当然跟软件有关系,有些软件只能启动一个,每启动一个程序,其实就是启动了一个进程。如在java的程序里面每启动一个main方法,其实就是启动了一个jvm进程,而main方法就是我们上面所说的进程中至少包含一个线程的主线程。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs) 路漫漫其修远兮,吾将上下而求索