操作系统——线程

线程作为进程内的轻量级执行单元,允许多个任务并发执行。线程间共享内存地址空间和进程资源,具有独立的线程ID和控制块。多线程模型包括多对一、一对一和多对多,其中多对多模型能克服前两种的缺点。用户级线程和内核级线程各有优劣,线程管理可在用户态或核心态进行。


有时一个进程也需要同时完成多个任务,比如微信聊天的同时还要给对方发文件,这时就我们就在进程内部给各个功能划分出不同的线程,相当于轻量级的进程。引入线程后,线程就成为最小的CPU执行单元,在分配非CPU的系统资源时,我们才用到进程。

线程的特点

多核CPU计算机,进程内部的各个线程可以占用不同的CPU。
共享内存地址空间,线程通信无需系统干预。
共享进程的资源。
每个线程都有线程ID、线程控制块(TCB)。
几乎不拥有系统资源。
操作系统中,线程又分为用户级和内核级线程。用户级线程(ULT,User-Level Thread)就是用户看到的进程内部的线程,线程管理工作都由应用程序在用户态下进行,不需要系统干预。内核级线程(KLT,Kernel-Level Thread)就是系统看到的进程,线程管理工作都由操作系统内核在核心态下进行。

多线程模型

多对一:多个用户级线程映射一个内核级线程。一旦一个线程阻塞后,其他线程就使用不了内核级进程。
一对一:一个用户级线程映射一个内核级线程。有时一个用户级线程可能需要多个内核级线程,这时就需要CPU切换到核心态,成本较高。
多对多:n个线程映射m个线程(m<=n),克服以上模型的缺点。

### 操作系统中进线程的概念 #### 进 (Process) 进操作系统结构的基础,表示序的一次执行过每个都有独立的代码和数据空间(指令、栈、堆),具有分配资源的功能单位。进由文本区(即代码)、数据区以及用户堆栈组成,并且拥有自己的地址空间[^1]。 ```c // 创建新进的例子 pid_t pid; pid = fork(); // Unix/Linux创建子进的方式 if (pid < 0){ printf("error in fork!"); } else if(pid == 0){ printf("I am child process"); } else { wait(NULL); // 父进等待子进结束 } ``` #### 线程 (Thread) 线程有时被称为轻量级进(Lightweight Process),同一进内的多个线程共享该进中大部分的数据和状态信息,如文件描述符、信号处理设置等;但是它们各自有自己的调用栈(call stack) 和寄存器集合(registers set)[^2]。 ```java class MyThread extends Thread{ public void run(){ System.out.println("This is a thread."); } } public class Main { public static void main(String[] args) { new MyThread().start(); } } ``` ### 进线程的主要区别 - **定义不同** - 进是一个具有一定独立功能的序关于某个数据集上的一次运行活动,而线程则是进的一个实体,是CPU调度和分派的基本单位[^3]。 - **开销方面** - 启动一个新的进所需的时间较长,因为这涉及到加载新的环境并初始化所有的上下文。相比之下,启动一个新线程则要快得多,因为它只需要复制父线程的一些属性即可完成创建工作[^4]。 - **资源共享** - 不同进之间无法直接访问对方的内存区域,如果需要交换数据,则必须通过特定机制实现跨进通讯(IPC) 。然而,在同一个进下的各个线程间可以直接读写彼此所在的全局变量或静态方法中的局部变量,因此更容易进行协作工作。 - **通信方式** - 对于多进而言,通常采用消息队列(message queue), 套接字(socket pair) 或者管道(pipe)等方式来进行相互通信;而对于属于同一进的不同线程来说,由于它们都处于相同的地址空间内,故可通过共享存储器(shared memory segment)来高效传递信息。 - **调度粒度** - 在现代操作系统里,实际被调度的对象往往是线程而非整个进——尽管后者确实包含了前者所需的全部资源和支持条件。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值