Neo's Blog

不抽象就无法深入思考
不还原就看不到本来面目!

0%

操作系统 - 进程与线程

进程与线程

  • 进程线程的区别

线程独享:线程局部存储TLS、errno、寄存器、栈空间

1.进程:一个静态程序的执行过程;

线程:操作系统调度的基本单位;
1.线程ID 每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标识线程。

2.寄存器组的值       由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线

程切换到另一个线程上时,必须将原有的线程的寄存器集合的状态保存,以便
将来该线程在被重新切换到时能得以恢复。

3.线程的堆栈       堆栈是保证线程独立运行所必须的。       线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程

必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影
响。
4.错误返回码 由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用
后设置了errno值,而在该线程还没有处理这个错误,另外一个线程就在此时
被调度器投入运行,这样错误值就有可能被修改。 所以,不同的线程应该拥有自己的错误返回码变量。
5.线程的信号屏蔽码 由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程自己管理。但所有的线程都共享同样的信号处理器。
6.线程的优先级 由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参数,这个参数就是线程的优先级。

  • 进程间通信方式

  • 线程的状态

  • 介绍死锁和如何避免

线程安全

(1)synchronized 方法 + 代码块

(2)互斥锁lock

(3) 线程局部存储

(4)乐观锁

进程调度算法

多级反馈队列调度算法

设置多个就绪队列。在系统中设置多个就绪队列,并为每个队列赋予不同的优先。第一个队列的优先级最高,第二个次之,其余队列的优先级逐个降低。该算法为不同列中的进程所赋予的执行时间片的大小也各不相同,在优先级愈高的队列中,其时间片愈小。

    每个队列都采用FCFS算法。当新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可撤离系统。否则,即它在一个时间片结束时尚未完成,调度程序将其转入第二队列的末尾等待调度;如果它在第二队列中运行个时间片后仍未完成, 再依次将它放入第三队列…依此类推。当进程最后被降到第n队列后,在第n队列中便采取按RR方式运行。

    按队列优先级调度。调度程序首先调度最高优先级队列中的诸进程运行,仅当第一队列空闲时才调度第二队列中的进程运行;仅当第1到(i-1)所有队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时又有新进程进入任一优先级较高的队列,此时须立即把正在运行的进程放回到第i队列的末尾,而把处理机分配给新到的高优先级进程。

summary:
多级反馈队列调度算法,“多级”在于有多个不同优先级的队列,“反馈”在于如果有进程加入优先级高的队列时立即停止当前任务,转去执行优先级高的队列中进程,上述过程循环调度就形成多级反馈队列调度算法。

例子:
上图是一个调度的示例,进程有A(4),B(3),C(4),D(2),E(4),括号内是需要服务的时间。设第一队列时间片q=1,因为该算法中时间片的规则为:后一个时间片长度为前一个的2倍,所以第二队列时间片q=2,第三队列时间片q=4。

若不能执行完,则放到下一个队列尾部(橙色部分)

到最后一个队列的时候,则执行轮转调度(RR)算法,也就是每次执行一个时间片长度的服务,直到循环执行完所有的进程。

分离thread

非分离线程在终止后,必须要有一个线程用 join 来等待它。否则,不会释放该线程的资源以供新线程使用,而这通常会导致内存泄漏。因此,如果不希望线程被等待,请将该线程作为分离线程来创建。

你的支持是我坚持的最大动力!