计算机操作系统-线程

什么是线程

线程是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流
调度和分派的基本单位
因为还具备许多传统进程所具有的特性 所有线程也被成为轻型进程 进程元
因为进程可以并发 所以不同进程间的线程也可以并发

线程和进程的区别

线程中也有三个状态:执行,就绪,阻塞

一个程序至少有一个进程,一个进程至少有一个线程.

进程在执行过程中拥有独立的内存单元 而线一般是多个线程共享同一个内存单元

线程是比进程更小的能独立运行的基本单位.线程基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;
同一个进程中的多个线程之间可以并发执行.
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程 产生影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,一个线程死掉就相当于进程中有一个步骤没办法执行了 所以该进程就无法完成了
所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些
如果拿线程和进程做例子 :假设进程是文字处理器 那么线程就可以一个用来显示文字和图像 一个用来从键盘读入数据 再一个在后天进行拼写和语法检查
放在现实中就是 进程就相当于工厂中的每一个流水线而线程就相当于流水线上的工人

线程控制块TCB

与PCB类似
线程控制块中也有一个唯一标识线程的线程标识符
一组寄存器,线程运行状态,优先级,线程专有存储区,信号屏蔽

内核支持线程KST

该种线程是在操作系统内核支持下运行的 他的创建阻塞撤销切换都是在内核空间实现的
这种线程的优势是:
1.在多处理器系统种 内核能够同时调度同一进程中的多个线程并行执行
2.因为是内核支持线程 所以具有更小的数据结构和堆栈,线程的切换更快 切换开销更小
3.可以让内核也采用多线程技术 提高系统执行速度和效率
4.相较于用户级线程 内核支持线程的调度单位是线程 在执行时间片轮转算法时 是每个线程执行一个时间片 如果进程A有一个内核线程 进程B有一百个内核进程 则进程B分配的时间是进程A的一百倍
缺点:
因为他是内核支持 所以虽然系统切换时 切换的开销更小 但是如果是用户的线程切换 则器模式切换的开销会较大(从一个线程切换到另一个线程需要从用户态转到系统态进行 因为用户进程的线程在用户态运行,而内核支持线程是在内核实现的 所以系统开销会比较大)

用户级线程ULT

在用户空间中实现 对线程的创建撤销同步通信都不需要内核的支持 与内核无关了 并且一个系统中的用户级线程的数目可以达到数百个至数千个 这就可能导致一个问题 用户级线程调度还是以进程为单位 在时间轮转方法中 每个进程都是给予一样的时间 但是因为进程中的用户级线程数量是不一样的 所以每个线程的执行时间和速度就可能差距很大
缺点:
1.因为和内核无关 所以内核就完全不知道用户级线程的存在
2.系统调用的阻塞问题 在基于进程机制的OS中 大多少数系统调用将使进程阻塞 因此 当线程执行一个系统调用时 不仅线程被阻塞 进程内的所有线程都会被阻塞 而内核支持线程中进程中的其他线程仍然可以运行
(简单来说就是 线程执行系统调用可能会发生阻塞 而如果使用用户级线程就会在该线程阻塞时进程的所有线程都会发生阻塞(原因在第三点) 而内核进程其他的线程则可以继续运行)
3.(重点)单纯的用户级线程实现方式中 多线程应用不能利用多处理机进行多重处理的优点 内核每次分配给一个进程的仅有一个CPU 进程中仅有一个线程能执行 在该线程放弃CPU之前其他CPU只能等待 这里也是为什么第二点 所有线程都会发生阻塞的原因
优点:
1.节省模式切换的开销 因为所有线程的管理数据结构均在该进程的用户空间中
2.每个进程可以选择适合自己的调度算法
3.用户线程甚至可以在不支持线程机制的操作系统平台上实现 因为用户级线程的实现与OS平台无关 线程管理的代码时属于用户程序的一部分

用户级线程和内核支持线程组合

多对一

多个同进程的用户线程映射到一个内核控制线程 这些用户线程运行和调度管理都是在相应进程的用户空间中完成 仅当用户线程需要访问内核时 才将其映射到一个内核控制线程中 每次只允许一个线程进行映射
优点:开销小,效率高,
缺点:
1.一个线程在访问内核时发生阻塞 整个进程就会阻塞
2.任意时刻只有一个线程能够访问内核 多个线程不能同时在多个处理机上运行
在这里插入图片描述

一对一

每一个用户级线程映射到一个内核支持线程
优点:
1.当一个线程阻塞时 运行调度另一个线程运行 并发功能好
2.在多处理机系统中 允许多个线程并发的允许在多处理机系统上
缺点:每创建一个用户线程 相应的都要创建一个内核线程 开销大 限制了整个系统的线程数
在这里插入图片描述

多对多

多个用户线程映射到同样数量或者更少数量的内核线程上 映射数量是可以变换的
优点就是可以像一对一 也可以像一对多
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验目的 (1)掌握Windows系统提供的线程创建与撤销系统调用 (2)掌握Windows系统环境下线程的创建与撤销方法 2 实验准备知识 (1)线程创建 CreateThread()完成线程的创建。它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立线程的句柄。 原型: HANDLE CreateThread(   LPSECURITY_ATTRIBUTES lpThreadAttributes,   DWORD dwStackSize,   LPTHREAD_START_ROUTINE lpStartAddress,   LPVOID lpParameter,   DWORD dwCreationFlags,   LPDWORD lpThreadId);   参数说明:   lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。   dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。   lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:   DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。   lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。   dwCreationFlags :线程标志,可取值如下   CREATE_SUSPENDED: 创建一个挂起的线程   0 :创建后立即激活。   lpThreadId:保存新线程的id。   返回值:   函数成功,返回线程句柄;函数失败返回false。 (2)撤销线程 ExitThread()用于撤销当前线程 原型: VOID ExitThread( DWORD dwExitCode ); 参数说明: DwExitCode:指定线程返回码 返回值: 该函数没有返回值 用法举例: ExitThread(0); (3)挂起线程 Sleep()用于挂起当前正在执行的线程 原型: VOID Sleep( DWORD dwMilliseconds ); 参数说明: dwMilliseconds:指定挂起时间,单位为ms(毫秒)。 返回值: 该函数没有返回值。 (4)关闭句柄 函数CloseHandle()用于关闭已打开对象的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使进程安全运行。 原型: BOOL CloseHandle( HANDLE hObject ); 参数说明: hObject:已打开对象的句柄。 返回值: 成功,返回值为非0值;失败,则返回值为0.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值