🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法
💫个人格言:“没有罗马,那就自己创造罗马~”
文章目录
- 操作系统管理进程
- PCB核心属性
- 线程&多线程编程
- 为什么线程比进程更轻量?为什么线程创建/开销比进程更小?
- 线程基本特性的例子
- 🏷️总结:
操作系统管理进程
- (1)先描述 -> 通过PCB结构体将进程的各种属性都表示出来
- (2)再组织 -> 通过链表数据结构把多个PCB串起来。
PCB核心属性
- 1.pid进程标识符
- 2.内存指针,该进程依赖的指令和数据在哪里
- 3.文件描述符表,该进程打开了哪些文件
- 4.支持进程调度的属性:状态、优先级、上下文、记账信息。
线程&多线程编程
-
当前的CPU基本上都是多核心CPU
-
多线程编程:通过特定的编程技巧(并发编程=并行+并发),把要完成的任务,拆解成多个部分,并让他们在不同的CPU上运行。【防止出现“一核有难,多核围观”的现象。】
-
由于服务器,频繁地有客户端来来去去,这导致服务器需要频繁的创建/销毁进程(过于频繁的创建和销毁进程会导致服务器的响应速度变慢)。
-
为了解决进程的负重,所以引入线程来解决进程开销过大的问题。
-
线程(Thread):也叫做“轻量级进程”(创建销毁开销更小),可以理解成线程是进程的一部分。
-
一个进程中可以包含一个线程或多个线程
-
描述进程,使用的是PCB这样的结构体
- 一个PCB其实就是描述一个线程
- 若干个PCB(线程)联合在一起用来描述一个进程。
-
PCB属性
- 1.pid (每个线程都不一样)
- 2.内存指针
- 3.文件描述符表
- 在同一个进程的若干个线程中,内存指针和文件描述附表其实是同一个 。
- 同一个进程中的若干个线程之间,是公用相同的内存资源和文件资源的。
- (eg:线程1中new个对象,线程2可以访问到;线程1打开一个文件,线程2也可以直接使用。)
- 4.状态、上下文、优先级、记账信息
- (对于进程调度的这四个属性,每个线程都有属于自己的一组属性)
- 每个线程都是在独立的在CPU上执行调度的。
- 进程是系统资源分配的基本单位
- 线程是系统调度执行的基本单位
- 5.tgid:同一个进程的
tgid
是同一个。
为什么线程比进程更轻量?为什么线程创建/开销比进程更小?
-
核心在于:
-
创建进程,可能要包含多个线程,在这个过程中,涉及到了资源分配/资源释放。
-
创建线程,相当于已经拥有资源,省去了资源分配/释放的步骤了。
-
同一个进程包含N个线程,这些线程之间资源是共用的。
-
只有当创建第一个线程的时候(即创建进程的时候),才需要去进行资源申请操作。
-
后续再创建线程,都没有申请资源的过程了。
线程基本特性的例子
-
滑稽有个任务,吃掉100只盐焗鸡,但是现在只有它一个人吃,效率比较低~
-
为了解决效率低这个问题,我们引入了多进程和多线程方案:
-
①多进程方案:
-
我们可以看到我们又找了一个滑稽来吃鸡,不仅要租房子还要搞个桌子,这使得吃鸡成本大大增加
-
②多线程方案:
-
房间和桌子还是同一个,把滑稽变成两个,这两个滑稽都可以同时来吃鸡,还是相当于一个人吃了两50只鸡,效率和多进程相比,成本降低了。
-
③引入更多线程的方案:
-
根据上图,我们可以看到随着引入的线程增多,每个线程要完成的任务量更少了,整体吃鸡的速度就会更快!!
-
④引入无限多个多线程的方案:
-
由于桌子大小是有限的,我们的滑稽需要坐在椅子上才能吃鸡,当引入更多的滑稽时,会导致滑稽无法凑到桌子边上,没法和正在坐姿上的滑稽一样并发的执行任务。
-
此外,外面的滑稽往里面挤,可能会打断里面正在吃鸡的滑稽,此时,线程调度会非常明显,可能会导致程序性能不升反降。
-
⑤多个线程共同完成某个任务:
-
如果是多个线程共同完成某个任务,在这个过程中,多个滑稽之间,可能会发生冲突!!
- 1号滑稽看上大鸡腿
- 2号滑稽盯上了同一个大鸡腿
- 导致两个人起了冲突,打起来了 => 程序出现bug~ 【线程安全问题】
-
⑤一个线程·抛出异常并且未处理好:
-
如果,某个滑稽,不太开心,不想吃鸡了~
-
直接反抗,使得别的滑稽也吃不了鸡。
-
如果一个线程抛出异常,并且没有很好的捕获处理好,就会使得整个进程退出(其它线程也没了)。
🏷️总结:
- 对于多线程:一个线程挂了,会影响到其他线程。
- 对于进程:进程与线程相比,具有更好的独立性,当一个进程挂了,一般不会影响到其它进程。
特性 | 进程 (Process) | 线程 (Thread) |
---|---|---|
定义 | 操作系统进行资源分配和调度的一个独立单位。 | 进程的一个实体,是被系统独立调度和分派的基本单位。 |
资源拥有 | 每个进程拥有独立的内存空间,进程间的资源不共享。 | 同一进程内的线程共享进程的资源,如内存和文件描述符。 |
创建开销 | 创建和销毁进程涉及到资源的分配和释放,开销较大。 | 线程的创建和销毁开销较小,因为它们可以利用进程已经分配的资源。 |
独立性 | 进程间相互独立,一个进程的崩溃不会直接影响到其他进程。 | 线程间不独立,一个线程的崩溃可能会影响到同一进程的其他线程。 |
通信方式 | 进程间通信(IPC)需要特定的机制,如管道、信号、共享内存等。 | 同一进程内的线程可以通过读写共享变量的方式进行通信,无需特定的IPC机制。 |
上下文切换 | 进程间的上下文切换开销较大。 | 线程间的上下文切换开销较小,因为它们共享相同的地址空间。 |