概述
- 相对路径--相对于进程的工作目录。
- windows中不存在父子进程层次,创建\被创者身份平等。
- 被并发的进程共享的资源可以是互斥\同时共享,互斥共享的资源称为临界资源。
- 并发--一段时间内多个任务被轮流处理,切换很快,单核处理器,并行--某一时刻多个任务,多核或多个处理器支持。
- 虚拟技术:时分\空分复用
- 异步IO:系统调用后,调用者不阻塞进程,而是立马返回,系统调用完成后,通过状态、通知、回调来通知调用者。并发时的异步:走走停停,以不可知的速度向前推进。
- 操作系统功能:1.自上为用户程序提供抽象接口,自下管理物理硬件2.管理计算机资源(对用户程序透明)3.可以说运行在内核态的程序就叫操作系统。
体现在进程(通信、控制)\内存地址空间分配\文件\设备管理
- 进程在用户态需要内核态的功能,就进行系统调用陷入内核,由操作系统代为完成。
系统调用和库函数调用
系统中的共享资源都由OS内核统一管理,保证系统的稳定性和安全性,防止用户随意修改系统重要数据。系统调用就是操作系统所提供的在用户程序中可以调用的接口,运行在内核态,在用户程序中,凡是与资源有关的操作(按照功能可分为:内存分配、进行I/O设备传输、管理文件、进程控制、进程通信)都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代替它完成。通常,一个操作系统提供的系统调用有几十个乃至上百个之多。
库函数是将常用的代码块编写放入文件中,形成可重用的模块,编写应用程序时调用,由第三方提供,运行在用户态/用户地址空间。
在移植性方面,不同操作系统的系统调用一般是不同的,移植性差;库函数移植性相对好一点。比如说在所有的ANSI C编译器版本中,C库函数是相同的。调用开销方面,系统调用需要在用户态和内核态切换CPU上下文环境,开销较大,库函数调用开销较小。
另一种OS提供的含有系统调用的库函数一般是对多个系统调用的封装,方便了用户程序的调用,可以实现更多的功能。用户程序一般是调用它间接使用系统调用,用C定义接口,如与对应系统调用重名的read()读磁盘上文件。
调用的过程是将库函数参数压到栈上,然后执行到函数内的系统调用,OS将它的唯一编号放入寄存器,然后执行指令trap(执行int $0x80)产生中断进入内核,OS查询中断向量表,调用对应中断的服务程序,服务程序将系统调用编号拿出来,对照操作系统一直维护的系统调用表,找到该系统调用程序体的内存地址,访问该地址,执行系统调用。执行完毕后返回库函数,库函数负责检查系统调用的执行情况,根据检查的结果返回相应的值。
这里trap指令产生一个陷入中断并且是软中断(软件发出,不会直接中断CPU),系统调用可当做一个中断处理函数,靠中断机制切换到内核模式来进行调用。
库函数一般可以概括的分为两类,一类是随着操作系统提供的,另一类是由第三方提供的。系统提供的库函数把系统调用进行封装或者组合,可以实现更多的功能,也就是上面写的内嵌系统调用的库函数,这样的库函数能够实现一些对内核来说比较复杂的操作。比如,read()函数根据参数,直接就能读文件,而背后隐藏的比如文件在硬盘的哪个磁道,哪个扇区,加载到内存的哪个位置等等这些包含了系统调用的操作,程序员是不必关心的。而对于第三方的库,它其实和系统库一样,只是它直接利用系统调用的可能性要小一些,而是利用系统库函数来实现功能。
- 大内核(单体系统):系统全部功能如文件系统、设备驱动都放进内核,整个操作系统以功能模块的方式编写,链接成一个大型可执行二进制程序,在内核态以单一程序的方式运行,各模块共享信息,性能高,但拓展性差,拓展功能代码需要与内核代码重新编译。
微内核:在微内核结构下,将一部分操作系统功能模块移出内核,只有最核心的功能在内核中,如IPC、地址空间分配,其余模块(即服务,如文件系统、设备驱动)运行在用户态。需要频繁切换性能低,但扩展性好,且不容易因一个功能错误导致系统崩溃(所以只在高可靠性要求场景如军事、工业、航空中流行)。
中断分为外中断(一般就是我们说的中断,由cpu执行指令以外的事件引起,如 I/O 完成中断)、异常(内中断,由 CPU 执行指令的内部事件引起,如操作地址越界。)、陷入trap(软中断,在用户程序中使用系统调用引起)。
中断由外因引起,异常由CPU本身原因引起。
中断发生后处理步骤一般是:1.保存CPU环境。2.查询中断向量表。3.调用中断处理服务函数。4.恢复CPU环境。
10. 通常计算机采用的是分时系统,就是系统把CPU时间分成很短的时间片分配给多个进程,让它们轮流共享CPU,各进程占用cpu的时间并非严格限定,如果一个进程需要,可以给它分配更多的时间片,优点是有较强的交互性、多作业并发提高资源利用率。而实时操作系统,计算机及时响应外部事件请求(低优先级任务会被高优先级直接挂起),事件处理必须遵从严格的时间限制与执行顺序,超过时限的进程可能直接被终止,优点是可靠性安全性相对更高,但交互性略差。
进程管理
- 进程是资源分配和拥有的基本单位,一个进程就是一个正在执行程序的实例,进程有自己的程序(即指令)、虚拟地址空间、PCB表项、IO设备、输入、输出、运行状态。
比如说用户运行自己的程序,系统就创建一个进程,并为它分配虚拟内存空间(虚拟地址空间,包括堆栈指针的指向)、一个控制线程(主线程)、IO设备。PCB描述基本信息和运行状态。该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU该进程才真正运行。
进程切换时先要从用户态切换到内核态,保存当前进程的状态(三态),cpu上下文环境(拥有自己的虚拟cpu,切换进程时老的存入内存,新的装入cpu,一般装的都是PCB里的东西),程序的内存映像,程序计数器(保存下一条指令的地址),设置新进程的cpu环境和内存映像,然后切换到用户态,进程切换次数太多降低cpu效率,调度算法需要注意。
进程有cpu密集型\IO密集型,要尽快让IO密集型获取cpu,来保持磁盘的忙碌。
- OS维护着一张进程表(进程控制块PCB),描述进程基本信息(其中有各态转换需要保存的信息,从而保证运行时IO中断导致的阻塞结束后能再次就绪)和运行状态,创建、撤销进程都需要对PCB操作。
- 进程从开始到结束的完整过程(四个)①创建进程、申请空PCB填信息、分配资源、进入就绪态②调度程序的时间片到来,跳转到运行态,用完了继续就绪③请求资源如IO则进入阻塞态等待资源,得到资源时转为就绪态④运行完毕后回收资源、PCB。
- 守护进程是一个在后台运行并且不受任何终端控制的特殊进程,用于执行特定的系统任务(如处理打印、web页面、电子邮件),很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。
- 进程可能在启动系统、运行的程序(父进程)用系统调用创建、用户请求时被创建,但本质上都是存在的进程创建新进程(如unix中所有进程都属于出现在启动映像中的特殊进程init为根的一颗树)。fork()创建的子进程一开始内存映像和父一样,随后一般执行一个execve()修改并运行新程序,但win中开始就不一样。
- 进程可能正常退出、出错退出、被其他进程杀死。
7. 线程是CPU调度和分配的基本单位,也是