操作系统学习笔记_04_线程的概念、操作和应用

1.线程的基本概念

线程概念是进程模型的进一步深化,是现代操作系统为适应新硬件、新要求而提供的模型。在线程模型中,单个进程包含多个控制线程,这些线程共享代码、数据、文件等资源,而每个线程有独立的寄存器和堆栈,并独立处理任务。工作时,每个线程执行一个任务。他们可以相互调用或调用系统调用,但不能回到任务分配的位置。在多核体系结构下,线程可以利用同一资源并发运行,充分改善资源利用率和计算机工作效率。

单线程进程和多线程进程

多线程是实际需求下的产物,存在如下好处:一,经济性。现代计算机的应用经常需要执行多个相似任务,如果为每个任务建立进程,需要耗费不必要的内存空间。多线程可以使全部任务共享同一份资源,节省空间。二,充分利用体系结构。当今的体系结构以多核为主,多线程通过使不同的核独立运行不同的线程,可以实现真正的多核并行,而单线程进程只能在单核上运行。三,响应度高。即使某个线程被封锁,其他线程还可以继续运行。此特性可应用于交互式应用程序,实现即时响应的效果,即同时接受输入和计算结果。四,易于通信。多线程方便了任务之间的通信,两个线程可通过访问相同的资源进行交互;对应于进程通信,进程之间要共享资源需要设定共享内存或设立通信机制,这些都需要程序员额外部署,没有线程的资源共享这么方便。

多线程面临的挑战包括如下几点:一,调度。为了保证硬件资源的充分合理运用,操作系统要权衡任务执行的先后顺序,并合理调度线程的生成与销毁,对应任务的执行。在执行中,操作系统也需要明确各任务、各线程的状态(任务是等待执行还是正在执行,线程是正在运行、等待资源还是已经完成任务等)。目前操作系统分为进程调度和线程调度两种,前者只调度到进程,具体进程运行哪个线程由线程库控制;后者直接按线程调度,对进程的控制直接封装在里面。二,测试和调试。针对多线程进程的系统调用和原来有所区别,比如fork()分为两种形式,复制全部线程或只复制调用fork()的线程;exec*()对应改动为程序代码替换所有线程。系统调用针对多线程有所调整,那么基于系统调用的函数等必须要重新调试。三,数据独立及同步。线程彼此独立运行在不同的核上,所以它们使用的数据必须分离开;但考虑到各线程对数据的共享,线程对数据的修改需要及时同步,以防数据冲突。

2.线程的模型

线程模型的支持由用户层(user space)的用户线程和内核层(kernel space)的内核线程提供。前者受内核支持而无需内核管理,后者受操作系统支持和管理。在操作系统的实际设计中,用户线程和内核线程可以采取多对一、一对一和多对多的对应关系。

多对一,即所有用户线程映射到同一个内核线程。这样做好处是易于实现、效率高(线程管理由线程库在用户空间进行),坏处是单个线程容易阻塞(以下用系统调用block()代称)整个进程,另外多个线程也不能多核并行。

一对一,即每个用户线程对应一个内核线程,规避掉了多对一的两点坏处:线程调用block()只会封锁自身,不影响其他线程;多线程可以作为独立进程而运行在不同的核上,实现高度并行。缺点是内核线程的开销太大,影响到整个应用的性能(甚至用尽内核存储),所以一般会限制线程总数。

多对多就是建立多个进程承载多个线程。这样做规避掉了一对一中线程总数的受限,也保证了高并行度,颇受开发者青睐。

3.线程的具体编程实现

在实际的操作系统中,线程模型与操作是通过线程库实现的。线程库中建立了线程的模型,并提供若干操作接口(API).常用的操作有创建(系统调用pcreate根据函数和参数创建线程)、传参数(通过修改公共区域数据直接传参),返回值(系统调用pjoin接收线程的结束信号,并为任务的返回值提供返回地址)。

在实际工作情况下,为了提升效率、增进安全性等各种目的,还会使用一些实用模型与操作,比如线程隐式实例化,在此不再赘述。

参考文献:

[1] Abraham Silberschatz. 操作系统概念:Java实现:第7版:翻译版. 高等教育出版社, 2010.1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值