OS. *1 .进程与线程

本文详细阐述了进程和线程的基础概念,包括进程控制块(PCB)的作用、线程的特性,以及进程与线程之间的主要区别。同时,还介绍了进程状态的切换,并解释了孤儿进程和僵尸进程的概念。

基础概念

1.进程

进程是资源分配的基本单位。
进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。

2.线程

线程是独立调度的基本单位。
一个进程中可以有多个线程,它们共享进程资源。
QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。

进程与线程的区别区别

Ⅰ 拥有资源

进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

Ⅱ 调度

线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。

Ⅲ 系统开销

由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

Ⅳ 通信方面

线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。

进程状态的切换

  • 就绪状态(ready):等待被调度
  • 运行状态(running)
  • 阻塞状态(waiting):等待资源

应该注意以下内容:

  • 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
  • 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。

几种特殊的进程类型

孤儿进程: 父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被init 进程(进程号为1)所收养,并由init 进程对他们完成状态收集工作。

僵尸进程: 进程使用fork 创建子进程,如果子进程退出,而父进程并没有调用wait 获waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。

避免僵尸进程的方法:

  • fork 两次用孙子进程去完成子进程的任务
  • 用wait()函数使父进程阻塞
  • 使用信号量,在signal handler 中调用waitpid,这样父进程不用阻塞
### 线程进程的区别 #### 进程的概念及其特性 进程是操作系统结构的基础单元,作为程序在一个数据集合上的运行过程。每个进程拥有自己独立的地址空间、内存和其他资源。这意味着不同进程间的操作互不干扰,除非通过特定机制如管道或套接字进行通信[^1]。 #### 线程的概念及其特点 线程则是更细粒度的操作单位,存在于进程中并共享同一进程内的大部分资源,比如全局变量和堆栈指针等。然而,每一个线程都有自己的寄存器集以及栈帧来保存局部变量信息。由于它们属于同一个进程,因此创建销毁成本较低,并能高效地切换执行路径[^2]。 #### 资源分配差异 - **进程**:具有完整的虚拟地址空间,包括代码段、数据段、堆区、栈区等部分;还维护着打开文件列表副本。 - **线程**:仅需少量额外的数据结构用于存储其自身的状态参数(即TCB),而其余绝大部分资源其他同属一进程下的兄弟姐妹们共同享有[^3]。 #### 执行效率对比 因为不需要像启动新进程那样复制大量环境配置项,所以在线程级别上发起的任务往往更快捷轻便得多。不过这也意味着过多数量的活跃线程可能导致频繁上下文转换带来的性能损耗问题。 #### 安全性和稳定性考量 当单个线程遇到未捕获错误时,有可能波及到整个宿主进程内部其它正在工作的伙伴们——这便是所谓的“牵一发而动全身”。相反,两个分离出来的个体则相互隔离得更好些,即使一方崩溃也不会轻易殃及其他方正常运转的状态[^4]。 ```python import threading, os def print_current_thread_info(): current_thread = threading.current_thread() process_id = os.getpid() print(f"Thread Name: {current_thread.name}, Process ID: {process_id}") thread_1 = threading.Thread(target=print_current_thread_info, name="Thread One") thread_2 = threading.Thread(target=print_current_thread_info, name="Thread Two") thread_1.start(); thread_2.start() thread_1.join(); thread_2.join() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值