(零)操作系统基础

进程管理  

(1)应用程序如何运行与OS上的

 ·Os代码和应用程序代码都在内存中

          ·运行应用程序的代码时,PC取应用程序的指令,CPU运行应用程序代码

         ·应用程序调用OS提供的函数接口,让OS帮忙提供支持时,这是PC取OS得指令并运行,并去控制外设(硬件)工作,这样就是取得OS支持,总之OS充当了应用程序控制硬件设备的中间人。

 

(2)什么是进程

进程是由程序变换而来,介绍进程时,需要先从程序说起。

1)当程序没有运行时
                    
      当程序没有被运行时,该程序(可执行文件)只是存放在硬盘上的静态数据,与你写的word文件中的数据没有本质区别

                        
                        
2)进程就是运行中的程序
                            
      当程序运行起来后,进程是所有与“程序运行”有关的代码和数据的集合体,简单的理解就是“进程”就是行进中的程序。
                        
                       

                        
3)进程也有生有死
                    
            (a)开始运行为生,运行结束即为死。
            (b)程序好比人,进程好比人生,人活着时的一切就是人生,程序活着时所涉及的一切就是进程。

                        
      

4)进程应包含三部分内容
                    
             (a)应用程序本身的代码和数据,这一部分称为应用代码部分,习惯称为应用空间

             (b)应用程序调用OS函数时,所涉及的OS中的代码和数据,这一部分称为内核代码部分,习惯称为内核空间

             (c)OS记录的进程在运行时的各种管理信息 专门进行进程管理的叫PCB进程控制块

   

(3)进程控制

1)为什么要进行进程控制

       在有OS的计算机上,应用程序必须在OS的支持下才能运行,换句话说,必须在OS的控制之下才能运行。

 

2)控制做些啥事情

      (a)分配内存空间,然后将程序调入内存并启动运行,运行起来后就变成了一个进程。

      (b)OS调度器对其进行调度

      (c)OS进行进程控制时,会负责记录进程各个方面的管理信息,这些控制(管理)信息都记录在了PCB中。

      (d)意外事件处理

      (e)当进程运行结束之后,回收内存空间、记录有各方面进程信息的PCB,

 

3)多进程并发运行

       在计算机上运行的绝不是只有一个进程,而是很多进程同时并发运行,进程在并发运行时
                    1)所有进程都是交替运行的,每个进程只运行一个ms级的时间片。                 
                    2)调度器会根据调度优先级算法,决定下一个时间片运行哪一个进程
                    3)从宏观上看,所有进程是同时并发运行的,但在微观上,在每个时刻,CPU只运行一个进程。

 

4)进程控制信息(PCB)

      我们说进程是在OS控制下运行的,OS会使用PCB管理各种进程信息,以Linux系统为例,PCB就是一个C结构体,该结构体名叫 task_struct,该结构体非常大,成员项达300个左右,用于记录该进程被OS控制运行时的各种管理信息。

     1)Linux系统的tasck_struct结构体 

           

     2)task_struct中的各种进程管理信息

            (a)进程信息

                    · 进程ID:用于唯一标识进程的编号,好比人的身份证号

                    · 程序名称:就是可执行文件的名字

                    · 可执行文件的格式:

                    · 进程时间:进程什么时候开始运行的

           (b)进程调度信息

                  · 进程运行状态:就绪态,执行态,等待态等

                  · 优先级:进程被调度的优先级,优先级高的会被优先被调度

                  · 调度标志:标记该进程是否被调度

                  · 时间片:运行时间片大小

            (c)文件信息:记录正在被进程操作文件的各种信息

            (d)内存信息:进程运行时所需内存的管理信息

            (e)休眠时间:比如当进程调用sleep函数,进程就会进入休眠。

 

 

5)进程的运行状态

       1)进程运行状态有哪些

                    (a)就绪态:表示进程准备就绪,随时等待被调度运行
                    (b)执行态:被调度运行,运行时占有CPU,运行的时间片到后让出CPU
                    (c)阻塞态:因为进程运行需要的某些条件的不满足,进程阻塞处于休眠状态
                    (d)终止态:进程结束,也就是程序运行结束,回收进程占用的内存资源

             

       2)进程状态间的切换

6)有关进程调度

          1)进程调度由调度器实现
          2)所有进程运行时,都包含就绪态、执行态、阻塞态、终止态这些状态,都会在这些状态之间来回切换           
          3)只有当进程进入执行态时,进程才会获得CPU的占有权 
          4)进程运行的时间片到后就会调度其它进程运行,每个时间片平均在10ms~20ms左右。
          

8)进程通信 

   本机进程间通信

                - 本机进程间通信的第三方 OS, 

                                            

 夸机进程间通信

                 其实就是网络通信,实现两台计算机上的程序之间的通信。

9)进程间的关系

   1)父子关系

   2)进程组关系

   3)会话期

10)轻量级的进程 — 线程

   1)进程存在的问题:进程切换很耗费时间

   2)进程问题的解决:线程

   3)线程由谁提供

             线程有两种提供方式,第一种则由操作系统提供,第二种以线程库方式提供,独立于OS之外。

             a)Linux:两种方式都有,不过常见的都是以独立于OS之外的线程库来提供。

             b)Win32:由OS提供

 

   4)与进程一样,线程也会参与调度

                   

   5)线程能够替代进程吗

            a)不能   因为线程是基于进程而存在,没有进程也无法无法实现

 

   6)进程与线程关系

            线程基于进程资源工作

                        资源(cpu和内存)以进程为单位进程分配的,因此进程被称为资源分配的最小单位

            线程的切换

                        进程内的线程切换时,不涉及进程间的切换   

            进程与线程各自的作用    

                        - 程序运行起来后就变成了进程,OS以进程为单位分配cpu、内存等计算机资源。
                        - 线程实现进程内部的多线任务

 

   7)进程和线程关系类比

 

 

 


内存管理

1)虚拟内存

1)虚拟内存的基本原理

a)原理图

(c)为什么称为虚拟内存

         CPU被欺骗了,它认为使用这个虚拟地址访问了某个内存,但是这个虚拟地址只是一个编号,这个虚拟地址对应的只是 一个虚拟的内存,实际上程序被分成两部分放在了内存上和外存上。

(d)虚拟内存机制为什么节省了内存    

          因为只加载了你要运行的那部分,其他的都在外存上,外存帮忙存了其他代码,相当于使用外存扩展了内存空间。

(e)虚拟内存机制为什么能够防止修改别人的程序空间

         自己的虚拟地址只映射了自己的物理内存空间和外存空爱,就算是程序员把地址写错了,但是错的也只是虚拟地址,由于  虚拟地址只映射了自己的空间,顶多也就把自己的空间给改了,不可能把别人的空间给改了。

2)虚拟内存机制的具体实现 

(a)将内存和程序分页

              

 

(b)加载程序,建立映射页表

               

                所有运行的进程都有一张自己页表  OS的虚拟内存机制就是使用每个进程的页表来管理这些虚拟页的。

  •                 1 加载肯定是有OS负责加载的
  •                 2 OS加载程序时候 需要一个辅助进程(该进程父进程)
  •                 3 程序被加载后成为进程 OS就会为该进程 开辟页表 (从父进程的页表复制过来 修改后得倒一张新页表)

 

(c)CPU通过“虚拟地址”取指并执行进程

 

虚拟地址/页大小(4K ) = 所在页号

 

(d)缺页异常处理

缺页中断: CPU取址运行 (内存没有在外存上    把所缺页导入内存 :(1 找空页导入   2替换掉以前的页))

                   CPU重新取址运行

 

3)动态库的实现原理

1)静态库和动态库

          静态库是在编译程序时就决定好了的,库代码已经被复制到了程序中,

          但是动态库不一样,程序使用这个动态库时,并没有将动态库代码复制到程序中,只是在程序中留下了一片空的虚拟地址作为接口,这些虚拟地址并不对应真实的指令。当我们的程序被加载到内存中运行时,才会动态的去加载动态库,因为动态库时共享的,因此动态库也被称为共享库。

 

2)动态库的实现

          动态库也叫共享库,核心是共享,因为动态库的实现需要虚拟内存机制的支持,

          如果是裸机的话,是没有OS,没有OS就没有虚拟内存机制,在裸机上只能使用静态库

 

3)程序中的动态库接口

        程序中使用了动态库的话,编译程序时,会预留一片虚拟地址。
        当程序运行起来后,这片虚拟地址会被映射到物理内存上的动态库,建立虚拟地址和动态库物理地址的对应关系。  
          

4)共享内存

不同进程共享了同一片空间后,一个往里方数据,另一个从里面取数据,就实现了通信。

与共享动态库的区别仅仅是,共享动态库时,共享空间里面放的是动态库的指令,供不同进程共享执行。
而共享内存仅仅只是一片空的共享空间,只是是用来通信用的。

2)虚拟内存总结

如下这张图是如何得到的

多进程是如何共享一个OS的:

应用空间对应的虚拟地址:用于访问应用代码。
内核空间对应的虚拟地址:用于映射到OS上,当应用代码调用OS的系统函数时,就会使用内核空间虚拟地址访问OS
使用虚拟地址,不管是访问应用代码,还是访问OS,虚拟地址都需要被转成物理地址,到实际的物理内存中去访问

 

CPU使用虚拟的地址运行每一个进程,CPU被虚拟地址欺骗后,CPU人为每一个进程都有一个自己的内存,这个欺骗CPU假内存,就称为虚拟内存。

CPU认为整个程序(进程)运行在独立的虚拟内存上,因此虚拟内存空间,也被称为进程空间。

 

虚拟内存就是通过虚拟内存机制,在物理内存和硬盘上,营造出来的一种假象