操作系统--进程与线程

进程

进程其实是个抽象的概念,我认为只要掌握它的关键就行了,因为各个操作系统的实现细节又不一样,扣细节是扣不清楚的。

进程说白了就是对单个程序的抽象。操作系统里面就是很多个进程在运行,它们不是全都并排着运行的,而是有层次结构,在linux里面用ps -t可以打印出一颗所有正在运行的进程的树形图。

想让多个进程看起来在同时运行,就需要轮流着给它们分配CPU资源。为了方便切换工作的有效进行,操作系统设计者弄出了一个调度程序(scheduler),这里不仅仅只能调度进程,也可以是线程,当调度线程的时候,就意味着这个线程不会被I/O阻塞,我猜这才是真>多线程吧。

调度程序是怎么工作的呢?首先,操作系统维护了一个进程表格,记录了所有的进程的详细信息,然后每一个进程对应着一个表项(程序控制块PCB),在这个表项里记录的关键字段有,程序计数器,堆栈指针,内存分配状况,调度信息,进程开始时间,使用的CPU时间,程序状态字等。还需要为进程设计出了运行状态,分别是就绪,阻塞,运行。并且这些PCB需要能根据状态和资源需求等信息排成一个队列。准备工作都做得差不多了,可以开始设计调度算法了,值得注意的是在不同机器上的调度要满足不同的需求,所以肯定不一样,我这只讨论交互式环境的调度算法。既然是交互式,那就必须得快速响应请求才行。书上介绍了轮转调度和优先级调度,这些算法都是最基础的方法,比较好理解。轮转调度很简单,就是设置固定的时间片,每个进程用完了时间片就中断,如果没用完时间片但是发生了阻塞或者结束,那么也会切换;优先级调度,就是给进程设置优先级,而且在每一个时钟中断的时候降低当前运行进程的优先级,每个进程还是基于时间片来运行。算法倒是简单,但是实际应用起来很难,这里有一篇对linux进程调度的源码分析,可惜看不太懂。不过没关系,现在把进程当做一个黑盒子来看。

除了时间片用完了或者程序结束了,会重新调度,当发生中断的时候也会重新调度。中断是什么意思呢?有个很好的比喻就是,你在看书,有人敲门,这个敲门的事件就是中断(敲门可能是你预料中的,也可能是意外)。你把书反扣在桌上,这叫保护现场,然后你去开门,这就是根据中断向量去执行对应的中断服务,然后执行完了之后会再发生调度,你开完门回来是继续看书还是去接一个电话。这里的关键点是中断不是这个正在运行的进程发出的,而是其他进程,比如在shell里摁了Ctrl-c。中断是多进程的基础。

线程

线程很容易造成一些我们认识上的假象,比如线程是在进程里面的,就像被包裹了一样,但实际并没有任何包裹的意思。关于线程,你首先要知道它为什么会出现,我们知道不同的进程有自己的独立的地址空间,它们是不能共享数据的,而我们需要能共享数据的机制。在研究线程怎么实现的之前,先看看它具体能怎么使用。书上根本没有讲它的具体使用,所以看一下linux上怎么用,会发现,其实就是在程序里自己创建线程,然后传进去一些参数,里面包括将要运行的函数,然后这些线程(函数)会”同时”运行。如何让它同时运行,查了几篇资料,都指出,linux里线程就是由进程来实现的,无论是进程还是线程在linux里都视为task,就是有完整的执行环境。显然,调度的问题就利用了操作系统里进程调度的模块,显然是在系统的内核态里进行调度的,阻塞什么的也就自然解决了,所以并不会因为一个线程阻塞而暂停整个进程。书上说的用select实现的用户态的线程包,通过系统调用请求一个时钟信号来切换的不知道什么鬼,就不深入看了。

总的来说,线程表现它们的栈不同。基础概念搞懂了,什么是多线程编程呢?可以用多线程开发什么功能的程序呢?这些问题,应该可以在实践中弄明白的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值