操作系统 - 线程
要介绍线程,就必须先从进程存在的问题说起
一、进程存在的问题
进程切换很耗费时间
进程间调度切换时,很耗费计算机资源,即花费时间也耗费存储空间,
因为要为被切换的进程保留大量信息,以便该进程再次被调度时恢复
这个有点类似于函数调用,当 A
函数调用 B
函数时,A
函数的断点地址、局部变量等都是要被保存起来的,等到从 B
函数返回时,A
函数需要从断点地址重新继续运行,同时恢复 A
函数的局部变量,以便让 A
函数再次正常运行
二、线程 - 进程问题的解决
使用线程,更轻量的进程
线程也叫轻量级的进程,相比进程来说,线程最大优势就是相互切换时,非常节省计算机资源,
至于为什么线程切换省事,这里不探究这个问题。
不管实在c/c++/java/c#的程序开发中,都涉及线程的使用,所有这些线程的使用原理其实都是一样的,
只是涉及的语言不同而已,只要你会了其中某类线程的使用,其它类线程的使用都不成问题
如果学会了C语言的线程使用,学习c++和java的线程都很简单
线程有两种提供方式,
1)第一种则由操作系统提供
2)第二种以线程库方式提供,独立于OS之外
比如:
- Linux:两种方式都有,不过常见的都是以独立于OS之外的线程库来提供。
- Win32:由OS提供
如果OS有提供线程,同时也有第三方线程库提供线程,你可以根据自己的选择来决定使用哪一个线程,
一般来说使用C、C++、JAVA编程时,线程都是由第三方库来实现的,
当然有些公司不满意别人提供的这个线程库的话,完全可以自己开发一个线程库
与进程一样,线程也有
就绪态、执行态、阻塞态等各种状态
线程也会参与调度器的调度,所以进程与线程一起并发运行的
不能!
虽然线程很好,但是线程只是弥补了进程的缺点,但是无法干掉进程,
因为线程是基于进程而存在,没有进程也无法无法实现
三、进程与线程关系
资源(
cpu
和内存)以进程为单位进程分配的,因此进程被称为“资源分配的最小单位”,线程基于进程的这些资源来工作的
在进程中开辟多个线程后,进程内部的线程会共享进程资源,所以进程内的线程切换时,不涉及进程间的切换,
因此进程内部线程切换时,不会耗费太多计算机资源,因为不涉及费劲的进程间切换。
当然如果进程内部没有开辟多个线程的话,它就是单线程的,即当前进程可以被看作是一个单线程
这个进程就是这个单线程,这个单线程就是这个进程
1)程序运行起来后就变成了进程,OS以进程为单位分配cpu、内存等计算机资源
2)线程实现进程内部的多线任务
当进程内部有很多事情要并发进行时,比如在读取键盘数据的同时,又需要从网卡读取数据,
这个时候就可以在进程内部开辟两个线程,一个专门用于读取键盘数据,另一个专门用于从网卡读数据,
两个线程并发运行,各行其事,线程的时间片也是 ms
级的,宏观上表现是,两个线程是同时运行、同时做事的。