操作系统学习体会之进程管理篇

亢胤运
2023-12-01

       计算机基础知识的学习中,操作系统则是重中之重。继对微机原理和计算机组成原理的基础知识了解和学习后,对硬件和基础原理的理论有了初步的了解,结合在所在公司的项目中开发应用的经历和体会,进行了操作系统的学习,发现操作系统其实是很有意思的,把个人学习操作系统的体会归纳为以下内容交流学习(只限于我目前阶段的学习,因为对于操作系统的学习根据工作环境要求和个人兴趣可以有不断的深入学习和探索):

      一.学习体会 

        操作系统的学习,不限于需要从逻辑层面来理解其中的知识内容,初期学习个人感觉最难的在于没有形成对操作系统“角色定位”和大体的知识框架时,陷入具体的知识点,进度非常缓慢,感觉晦涩的同时会失去方向感。所以一方面,首先需要有微机原理和组成原理的了解学习,最好也有应用开发经验,软件和硬件两方面的认知;另一方面,不能陷入具体某一个知识点裹足不前,记得在看几种不同方式的内存管理方式时,先啃页面内存管理,艰难过完,又出来一个段式内存管理,就觉得愈发艰难,当时觉得太多太难了,有点打击到积极性(可怕的是几个月之后已经不太记得内存管理的细节知识了),可以先继续往下看,拘泥于细节不可取。

      二. 主要功能

       学习基础知识,一方面有助于了解计算机基础原理,不至于在编程时,只使用高级语言以及第三方库所封装的功能,遇到技术更新,又再进行一系列的机械记忆,并且所做的技术工作不会有层次上的突破,这对于学习进步益处不大。另一方面,可以借鉴这些成熟的机制在解决问题中的一些思路,学的知识一段时间若不使用,很快就会忘记其中的内容,尤其是细节内容,但是学习过程中的体会和大致的知识框架不会忘记的。以下是梳理出来的进程管理部分知识点:

    ● 进程的概念:可描述程序的执行过程且能用来共享资源的基本单位。进程是操作系统学习的一个核心概念。

    ● 概念:进程快照:Core Image 代表进程在某一特定时刻的状态。

    ● 概念:进程核:Core 进程所占有的所有的资源(eg: 包含内存,内核数据结构和资源)。


    进程的产生与消失:

       系统初始化时,会有多个进程产生,作为系统正常运行所需。之后用户启动程序,系统也可将执行文件创立为一个进程。并且用户可以在编程时通过系统调用,CreateProcess生成新的进程;进程的消失则有寿终(运行完成而退出)、自杀(因错误自行退出)、他杀(被其他进程强行“杀死”)、处决(因异常强行终结)四种情况。在编程过程中,应当追求两两种进程结束方式。

    ● 进程的状态与状态转换:

       以下归纳为三种状态与6种/4种转换。状态为执行态、阻塞态、就绪态。状态之间的转换则是三种状态之间两两互相转换,排列组合一下,就是6种情况,就绪态到阻塞态以及阻塞态到执行态,因为操作系统在调度时不会在阻塞队列中挑选,并且就绪态的线程因为没有执行也不会进入到阻塞状态,除去此两种,则是4种转换。         

     ● 效率问题:

      多道编程的极限,为一个临界点,到达这个临界点,进程数量的增加,将不会带来效率的提升。

   ● 进程控制块:

      windows是使用系统调用来完成进程的创建,就是调用CreateProcess,Unix为先fork再exec,此为进程的创建。在进程创建过程中,首先分配进程控制块,(也包括其他初始化机器寄存器、初始化页表、将程序代码从磁盘读入内存,将处理器状态设置为“用户态”,设置程序计数器)。

      内核空间含有进程表,进程可由操作系统通过进程控制块来进行管理,进程控制块(Process Control Block)存放包括寄存器、程序计数器、状态字、栈指针、优先级、进程ID、信号、创立时间、所耗CPU时间等等。进程表中包括进程基本信息指针,也包括进程家族树指针,子进程、父进程、孙子进程、祖父进程,及其其他需要的信息指针。实际情况是不同的操作系统维护的进程资料不尽相同,不同的商业系统的内核教程列有更为详细的信息,不过基本的所需信息基本包含。

       进程管理的主要目的。各个程序均有机会执行,为公平;任何程序不能无休止的阻挠其他程序的正常执行,为非阻塞;程序对于资源的利用需要程序设定合理的优先级。

      ● 线程

       各线程拥有同样的程序文本,但是线程执行时的上下文不一致。线程为一个进程中的执行序列,一个进程可拥有多个执行序列。便可实现进程级别并发,由此出现线程间通信,线程间同步的需要解决的问题。

    ● 常见通信方式:

       管道:一种双半工的通信方式,数据只能单向流动,且只在具有亲缘关系进程间使用。

       有名管道FIFO:同为双半工通信方式,但可允许无亲缘关系进程间的通信。

       消息队列MessageQueue:由消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

       共享存储ShareMemory:共享内存为映射一段能被其他进程所访问的内存,共享内存由一个进程创立,但多个进程都可以访问。

       信号量Semaphore:信号量是一个计数器,可控制多个进程对共享资源的访问。作为一种锁机制,防止某进程正在访问共享资源时,其他进程也可访问该进程。因此。主要作为进程间以及同一进程内不同线程之间的同步手段。

       套接字Socket:与其他通信机制不同在于,可用于不同及其间的进程通信。

       信号sinal : 信号是一种比较复杂的通信方式,用于通知接受进程某个事件已经发生。

     进程调度:

       CPU的调度要极小化平均相应时间,即是极小化用户发出命令和看到某种结果之间所花费时间,还要极大化系统吞吐量,即是要在单位时间内完成尽可能多的程序,同时也要保证系统各个功能部件繁忙运作和公平调度。

       先来先服务算法FCFS(frist come frist serve)。则是类比为排队的先来后到原则。程序启动则一直运行到结束或受阻塞为止,不允许抢占。

        时间片轮换。周期性进行进程切换,改善了程序的响应时间,短程序排在长程序后面不至于长时间都无法执行。

        短任务优先算法STCF(shorted time to completion frist)。提高短任务的优先级,安排优先级高的程序先运转。分为抢占与非抢占式。

       优先级调度。STCF的缺点在于可能造成长进程饥饿。给每一个进程赋予优先级,切换进程时安装进程的优先级进行调度。可有效解决进程饥饿问题,不过问题在于响应时间不能保证。

       混合调度算法。各调度算法各有优劣,所以使用混合调度算法。将所有进程分成不同的大类,每个 大类为一个优先级。如果两个进程处于不同的大类,优先级高的先执行,如果处于同一个,则采用时间片轮换。

       其他调度算法:保证调度、彩票调度、用户公平调度等等。

       总结:进程管理即是操作系统对CPU的管理,为了提升CPU利用率使用多道编程,便有了多进程维护管理要做,同时出现进程的同步、通讯等协调管理。操作系统已实现了各管理功能,硬件CPU及一系列进程资源抽象成为了进程的概念,可以说进程算是操作系统的“无中生有”,应用程序的编程人员直接利用进程的机制,达到让应用程序高效利用硬件资源的目的。然而最为复杂的和硬件交互的部分,是OS来解决。内存原理部分、IO原理、文件系统原理等均可认为是操作系统对硬件的抽象和管理。在对操作系统的了解学习之后,做应用程序的编程,会觉得就像是在做操作系统所实现的功能的排列组合。实现应用在编码初期是最大的成就感来源,然而其实我们都是站在巨人的肩膀之上。更为可贵的是,操作系统的学习过程中,学习和体会前人在解决问题的思路, 再具体到细节时,会发现数据结构以及算法的实现,对这两者的学习和认知也会很有帮助。可以说,操作系统的学习,不同的层次,由浅及深,都会有不同层次的收获。                           



 类似资料: