进程、线程、调度基础知识

          程序是一些保存在磁盘上的指令的有序集合,是静态的,说白了就是一堆有逻辑的代码。包装成一个软件。

一、进程

        是程序一次执行的过程。每个进程有自己独立的内存空间,一个进程有多个线程。

并行和并发对比:

        字面意思而言,并发表示线程同时开始,代表的是事件;而并行表示线程同时执行,代表的是过程或者活动。

并行:将多个线程分配或者指定到不同的处理器上同时执行。

并发:指的是在单处理器系统上线程在微观串行执行,而在宏观并发执行。

一句话:单核多任务并发执行;多核多任务并行执行

进程的状态(3+3)

运行状态(Running):此时进程占用CPU。

就绪状态(Ready):可运行,由于其他进程占用CPU而暂时停止运行。

阻塞状态(Blocked):该进程正在等待某一事件(如输入输出操作的完成)而暂时停止运行。此时即使给它CPU控制权,也无法运行。

创建状态(New):进程正在被创建时的状态。

结束状态(Exit):进程正从系统消失时的状态。

 挂起状态

                进程没有实际占用内存空间,而是被换到硬盘。

阻塞挂起状态:进程在外存(硬盘),等待某个事件。

就绪挂起状态:进程在外存(硬盘),只要进入内存立刻运行。

 挂起总结(三种原因)

        #系统资源紧张(如内存不够)进程暂时存在外存

        #用sleep让进程间歇性挂起,工作原理是设置一个定时器,到期后唤醒进程。

        #用户希望挂起进程,如linux   ctl+z挂起进程。

进程的控制结构

进程控制块(PCB):OS中描述进程的数据结构。

PCB是进程存在的唯一标识。

PCB包含的信息:

        1、进程描述信息:

                进程标示符(PID):标示各个进程,每个进程都有唯一的标识符。

                用户标识符(UID):标示进程所属的用户,UID为共享和保护服务。

        2、进程控制和管理信息:

                进程状态:new、ready、running、blocked、exit

                进程优先级:进程抢占CPU时的优先级

        3、资源分配清单:

                内存地址空间或虚拟地址空间信息,所打开文件的列表,所使用的I/O设备信息。

        4、CPU信息:

                CPU中各寄存器的值。当进程被切换,CPU中的状态信息被保存在对应的PCB中,进程                 重新执行时从断点处开始执行。

PCB组织方式

通过链表的方式组织,相同状态的进程链在一起,组成各种队列

有就绪队列,阻塞队列。

进程的控制

进程的创建、终止、阻塞、唤醒四个过程。

创建进程时,分配资源、建立 PCB;终止进程时,回收资源、撤销 PCB;进程切换时,保存当前进程的状态信息;

01创建进程

        OS允许一个进程创建另一个进程,并且允许子进程继承父进程所拥有的资源。

        *申请空白PCB,填写进程控制管理信息

        *为该进程分配运行时所需资源,如内存资源

        *将PCB插入到就绪队列,等待被调度运行

02终止进程

        三种终止方式:正常结束,异常结束,外界干预(信号kill掉)

        当子进程被终止,其继承父进程的资源还给父进程。当父进程被终止,                                               其子进程变成孤儿进程,会被1号进程收养,并完成对孤儿进程状态信息收集工作。

        *查找需终止进程的PCB

        *终止执行

        *子进程交给1号进程接管

        *该进程所拥有全部资源还给OS

        *将其从所在PCB队列删除

03阻塞进程

        当进程需要等待某一事件完成,调用阻塞语句使自己进入阻塞等待,                                                  当进入阻塞状态,只能由其他进程唤醒。

        *找到要被阻塞的进程的PID对应的PCB

        *若该进程当前运行状态,保护现场并进入阻塞状态

        *讲该PCB插入到阻塞队列

04唤醒进程

        进入阻塞状态的进程不可能自己唤醒自己,只能是发现者进程用唤醒语句叫醒他

        *在该事件的阻塞队列中找到对应的PCB

        *将其从阻塞队列中移除,状态改为就绪状态

        *将该PCB插入到就绪队列,等待调度程序调度

进程的上下文切换

进程的上下文切换:CPU中一个进程切换到另一个进程运行。

CPU上下文:CPU寄存器和程序计数器是CPU运行任何任务前必须依赖的环境,此环境即为XXX。

CPU上下文切换:把前一个任务的CPU上下文保存起来,加载新任务的CPU上下文到寄存器、PC,最后跳转到PC所指的新位置,执行新任务。

此处任务包含:进程、线程、中断。                                                                                                

CPU上下文切换包含:进程上下文切换、线程上下文切换、中断上下文切换。

进程由内核管理调度,所以进程切换只能发生在内核态

进程切换主要包含:

        用户空间资源:虚拟内存、栈、全局变量

        内核空间资源:内核堆栈、寄存器

进程切换时期

        *时间片耗尽

        *系统资源不足,进程被挂起

        *进程通过睡眠函数sleep主动将自己挂起

        *更高优先级进程运行

        *执行中断服务程序       

二、线程

        线程是进程当中的一条执行流程。

同类的多个线程共享进程的方法区,每个线程有自己的程序计数器、虚拟机栈、本地方法栈

堆和方法区:

堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

程序计数器私有目的:线程切换后可恢复到正确的执行位置。(多线程下PC记录当前线程执行位置)

虚拟机栈和本地方法栈私有目的:保证线程中的局部变量不被其他线程访问到。

线程的上下文切换

        #当线程不属于同一进程,线程上下文切换和进程上下文切换一样。

        #当线程属于同一进程,共享的堆方法区资源不变,只有私有资源才上下文切换。

线程的实现

        用户线程(UT):在用户空间实现的线程,由用户态的线程库完成对线程的管理。

        内核线程(KT):在内核中实现,由内核管理。

        轻量级进程(LWT):在内核中来支持用户线程。(内核支持的用户线程)

用户线程由线程库管理,OS只可看见PCB看不见TCB。因此用户线程整个线程的管理和调度,操作系统不直接参与,而是由用户级线程库函数来实现线程的创建、终止、同步、调度等。

        用户线程优点:

                *TCB由用户级线程库函数维护,可用于不支持线程技术的操作系统。

                *用户线程的切换由也线程库函数完成,无需用户态内核态切换,速度快。

        用户线程缺点:

                *由于只有OS有CPU控制权,但是用户线程不由OS管理,因此线程占用CPU运行                            只有主动退出,其他线程才能运行。

                *由于OS不参与线程的调度,当一个线程发起系统调用而阻塞,则该线程所在进程的                     其他线程也不能执行了。

内核线程有操作系统管理,线程对应的TCB放在操作系统里,线程的创建终止、管理由OS负责。

        内核线程优点:

                *内核线程由OS管理,一个进程中某线程发起系统调用而被阻塞,不影响其他内核线程。

                *多内核线程的进程获得更多CPU时间

        内核进程缺点:

                *在支持内核线程的OS中,由内核负责进程和线程的上下文信息,如PCB,TCB。

                *内核线程的创建终止切换由系统调用方式进行,因此系统开销较大。

轻量级进程???????????

此处知识点感觉怪怪的 直接看原讲解

5.1 进程、线程基础知识 | 小林coding

   

进程和线程区别总结:

根本区别:进程是操作系统资源分配的基本单位;线程是处理器任务调度和执行的基本单位。

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

三、调度

调度程序(scheduler):在操作系统中完成选择一个进程运行这一功能。

TIP

        线程才是OS调度单位!此处进程是指进程的主线程,所以调度主线程就等于调度进程。

        主要是操作系统相关书籍,都是用进程调度这个名字,所以博客也沿用了这个名字

调度时机

在进程的生命周期中,进程从一个状态变化到另一个状态时 就会触发一次   调度。

以下状态的变化都会触发操作系统的调度:

  • 从就绪态 -> 运行态:当进程被创建时,会进入到就绪队列,操作系统会从就绪队列选择一个进程运行;
  • 从运行态 -> 阻塞态:当进程发生 I/O 事件而阻塞时,操作系统必须选择另外一个进程运行;
  • 从运行态 -> 结束态:当进程退出结束后,操作系统得从就绪队列选择另外一个进程运行;

如果硬件时钟提供某个频率的周期性中断,那么可以根据如何处理时钟中断 ,把调度算法分为两类:

  • 非抢占式调度算法挑选一个进程,然后让该进程运行直到被阻塞,或者直到该进程退出,才会调用另外一个进程,也就是说不会理时钟中断这个事情。
  • 抢占式调度算法挑选一个进程,然后让该进程只运行某段时间,如果在该时段结束时,该进程仍然在运行时,则会把它挂起,接着调度程序从就绪队列挑选另外一个进程。这种抢占式调度处理,需要在时间间隔的末端发生时钟中断,以便把 CPU 控制返回给调度程序进行调度,也就是常说的时间片机制

调度原则

原则一:为提高CPU利用率,在发生I/O事件使CPU空闲时,调度程序从就绪队列选一个进程运行

原则二:为提高系统吞吐率,调度程序要权衡长任务与短任务进程的运行完成数量

原则三:为减少周转时间,调度程序要尽量减少进程的等待时间(周转T=等待时间+运行时间)

原则四:就绪队列中进程的等待时间也是调度程序要考虑的

原则五:对于交互式比较强的应用,调度程序也要考虑。如键盘鼠标

调度算法

不同场景适用不同调度算法

多级反馈队列调度算法

最高优先级调度算法

时间片轮转调度算法

猜你喜欢

转载自blog.csdn.net/m0_61843855/article/details/131686460