【线程篇】线程的实现和线程安全

线程的实现?

要管理线程就要维持线程的各种信息,存放这些信息的数据结构称为线程控制块。线程共享一个进程空间,因此许多资源是共享的(如地址空间、全局变量、文件等),这些共享资源存放在进程控制块即可。还有一些不被共享的资源和信息(如程序计数器、寄存器等),需要存放在线程控制块里。 由谁来管理线程有两种选择:一是让进程自己来管理线程;二是让操作系统来管理线程。由进程自己管理就是用户态线程实现,由操作系统管理就是内核态线程实现。

操作系统关于线程实现:用户级线程  内核级线程  组合模型

用户级:线程创建、管理、销毁,都由线程库代码完成开销比较小

操作系统对线程的存在一无所知,操作系统只能看到进程,而不能看到线程。这种模式最致命的缺点也是由于操作系统不知道线程的存在,因此当一个进程中的某一个线程进行系统调用时,比如缺页中断而导致线程阻塞,此时操作系统会阻塞整个进程,即使这个进程中其它线程还在工作。

内核级:线程创建,管理都由内核完成,开销大,系统调用

操作系统知道线程的存在。此时线程表存在操作系统内核中。因为线程在内核态实现,每次线程切换都需要陷入到内核,由操作系统来进行调度。其次,占用内核稀缺的内存资源。操作系统需要维护线程表,操作系统所占的内存空间一旦装载结束后就已经固定,无法动态改变。由于线程的数量大大高于进程的数量,那么随着线程数量的增加,操作系统内核空间将迅速耗尽。

混合模式:

用户态的执行系统负责进程内部线程在非阻塞时的切换;内核态的操作系统负责阻塞线程的切换,即我们同时实现内核态和用户态线程管理。

用户级多处理器

Linux线程的实现:《Linux内核与实现》第三章

Linux 进程的方式实现线程,共享很多资源

Pthread_create ->clone() ->do_fork()

 

查看线程的id ps -eLf “L”显示线程的信息  top -H

什么是线程安全

线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步。

解决方法:1.同步线程2.使用线程安全的函数

线程安全的函数|可重入函数(有同步)

非线程安全(没有同步):一般是由于在函数中使用了静态变量、全局变量而引起的

strtok(不安全) strtok_r(安全)

多线程,fork()复制的子进程只有一条执行路径,就是fork所在的那条执行路径

共享哪些资源?

进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值