首页 > 代码库 > 操作系统
操作系统
1.进程有哪几种状态、状态转换图及导致转换的事件?
状态:
(1).就绪态:进程已获得 处理机外的所需资源,等待分配处理机资源(时间片),只要分配到即可执行。在某一状态,可能有若干进程处于该状态。
(2).运行态:占用处理机资源运行处于此状态的进程的数目小于等于cpu 的数目。
(3).阻塞态:由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理机资源分配给该进程,也无法运行。
状态转换图:
转换的解释:
从状态转换图中,我们可以看到进程有3种状态和4种状态转换:
转换1:当进程调度程序从就绪队列中选取一个进程投入运行时引起转换1。
转换2:正在执行的进程如果因时间片用完而被暂停执行就会引起转换2。
转换3:正在执行的进程因等待的事件(如进程请求完成I/O)尚未发生而无法执行时会引发转换3。
转换4:当进程等待的事件发生时(如I/O完成),就会引发转换4。
导致转换的事件:
就绪队列非空,则一个进程的的转换3会立即引起另一个进程的转换1。这是因为一个进程发生转换3意味着正在执行的进程由执行状态变为阻塞状态,这是处理机空闲,进程调度程序必然会从就绪队列中选取一个进程并将它投入运行。
2.进程和线程的区别?
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可以与同属一个进程的其他线程共享线程所拥有的全部资源。
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
3.进程通信的几种方式?
管道(piple): 管道是一种半双工的通信方式。数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是父子进程关系。
有名管道(named piple): 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量(semophore): 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此信号量主要作为信号间以及同一进程内不同线程之间的同步手段。
消息队列(message queue): 消息队列是将消息的链表存放在内核中 并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限制等缺点。
信号(signal): 信号是一种比较复杂的通信方式用于通知或接收进程 某个事件已发生。
共享内存(shared memory): 共享内存就是映射一段能被其他进程所访问的内存。这段内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制(如信号量)配合使用。来实现进程间的同步和通信。
套接字(socket): 与其他通信机制不同的是,它可以用于不同进程及其间的通信。
4.线程同步的几种方式?
临界区(CCriticalSection): 通过对多线程的串行化来访问共享资源或一段代码,速度快,适合控制数据访问。
事件(CEvent): 为协调共同对一个共享资源的单独访问而设计的。
互斥量()CMutex): 为控制一个具有有限数量用户资源而设计。
信号量(CSemophore): 用来通知线程有一些事件已经发生,从而启动后继任务的开始。
5.线程的实现方式(也就是用户线程和内核线程的区别)?
根据操作系统内核是否对线程可感知,可将线程分为内核线程和用户线程。
内核线程建立和销毁都是由操作系统负责、通过系统调用来完成。操作系统在调度时,参考各进程内的线程运行情况作出调度决定,如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU 。
用户线程指不需要内核支持而在用户程序中实现的进程。其不依赖于操作系统核心,用户进程利用线程库提供的函数(创建、同步、调度和管理线程)来控制用户线程。
用户线程多见于一些历史悠久的操作系统,例如Unix 操作系统,不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将将使得整个进程(包括它所有的线程)阻塞。由于这里的处理器时间片分配是以进程为单位,所以每个线程执行的时间相对减少,为了在操作系统中加入线程支持,采用了再用户空间增加运行库来实现线程,这些线程库被称为”线程包”,用户线程是不能被操作系统所感知的。
引入用户线程,具体有以下4方面优势:
1.可以再不支持线程的操作系统中实现。
2.创建、销毁线程和切换线程等线程管理代价比内核线程少得多。
3.允许每个进程定制自己的调度算法,线程管理比较灵活。
4.线程能够利用的表空间和堆栈空间比内核级线程多。
用户线程的缺点主要有2点:
1.同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。
2.页面失效也会产生相应的问题。
6.用户态和核心态的区别?
当一个任务(进程)执行系统调用而陷入内核代码中,我们就称进程处于内核运行态。进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。
当进程在执行用户自己的代码时,则称其处于用户运行态。当正在执行用户程序,而突然被中断程序中断时,此时用户程序也可以象征性地称为处于内核态(因为中断处理程序将使用当前进程的内核栈)。用户切换到内核态的方式有3种:系统调用、异常、外围设备中断。
7.内存池、进程池、线程池
应用程序可以通过系统的"内存分配调用" 预先一次性申请适当大小的内存作为一个内存池,之后应用程序自己对内存的分配和释放则可以通过这个内存池来完成。只有当内存池大小需要扩展时,才需要再次调用系统的内存分配函数,其他时间对内存的一切操作都在应用程序的掌控之中。
应用程序自定义的内存池根据不同的适用场景又分为以下不同类型:
从线程安全的角度来分,内存池可分为单线程内存池和多线程内存池。单线程内存池整个生命周期只被一个线程使用,因而不需要考虑互斥访问的问题;多线程内存池有可能被多个线程共享,因此需要在每次分配和释放内存时加锁。相对而言,单线程内存池的性能更高,而多线程内存池适用范围更广。
从内存池可分配内存大小来分,可以分为固定内存池和可变内存池。所谓固定内存池是指应用程序每次从内存池中分配出来的内存单元大小事先已经确定,是固定不变的;而可变内存池每次分配的内存单元大小可以按需变化,应用范围更广,而性能比固定内存池低。
8.死锁的概念和产生原因
死锁(DeadLock): 指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态。这些永远在互相等待的进程称为死锁进程。
原因:系统资源不足,进程运行推进的顺序不合适、资源分配不当等。
9.导致死锁的4个必要条件?
1. 互斥:一个资源每次只能被一个进程使用。
2. 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3. 不剥夺:进程已获得的资源在未使用完之前,不能强行剥夺。
4. 循环等待:若干进程之间形成一种头尾相接的循环等待资源关系。
10.处理死锁的4种方式?
1. 忽略该问题。例如鸵鸟算法:可用在极少发生死锁的情况下。(鸵鸟策略)
2. 检测死锁并且恢复(检测与解除策略)。
3. 仔细对资源进行动态分配,以避免死锁。(避免策略)
4. 通过破除死锁4个必要条件,预防死锁的产生。(预防策略)
有两种方法:一种是当其申请的资源得不到满足时,也必须放弃原先占有的资源;另一种方法只适用于申请资源的进程优先级比占有该资源的进程优先级高的情形,如果一个进程申请的资源被其它资源占用,而申请资源的优先级高,那么它可以强迫占有资源的进程放弃该资源。
11.Windows 内存管理的方式?
当程序运行时,需要从内存中读出这段程序的代码,代码的位置必须在物理内存中才能被运行。由于现在操作系统中有非常多的程序运行着,内存不能够完全存放下,于是就引出了虚拟内存的概念。把那些不常用的程序片段存放在虚拟内存中,当需要用到它的时候就load入主存(物理内存)中,这就是内存管理所要做的事。内存管理要做的另一件事是:计算程序片段在主存中的物理位置,以便CPU 调度。
内存管理有块式管理、页式管理、段式和段页式管理,现在常用段页式管理:
块式管理:把主存分为若干个大块,当所需的程序片段不在主存时,就分配一块主存空间,把程序片段load 入该块主存。就算所需的程序片段只有几个字节,也只能把这一整块分配给它,这会造成内存空间的浪费,但易于管理。
页式管理:把主存分为若干页,每一页的空间要比每一块的空间小很多,因此该方法对内存空间的利用率要比块式管理高很多。
段式管理:把主存分为若干段,每一段的空间又比一页的空间小很多,这种方法在内存空间上比页式管理又高很多,但是缺点是:一个程序片段可能会被分为十几段,这样很多时间就会被浪费在计算每一段的物理地址上。
段页式管理:把主存分为若干页,每一页又分为若干段。这样就综合了段式和页式管理的优点。
12.内存连续分配采用的几种算法及其各自优势?
1. 单一连续分配:最简单的存储管理方式,优点是软件处理简单,缺点是存储器不能充分利用。多用于单用户操作系统中。
2. 动态分区分配:是多道程序环境下最简单的一种,它将内存分为若干个分区,在每个分区中按照连续分配方式分配给一个作业。分区形式:(a)固定分区分配:内存在处理作业前已被分成若干个大小不等的分区,存储管理程序根据每个作业步的最大存储量分配一个足够大的存储分区给它。当找不到一个足够大的分区时,通知作业调度挑选另一作业。这种方式分配和回收内存简单,但内存利用不充分,会产生”碎片”空间。(b)可变分区分配:内存事先并未被分区,只有当作业进入内存时,才根据作业的大小建立分区。其特点是分区的大小和个数都是可变的,但需要建立分配区表和空白区表,且表的长度是不固定的。
3. 可重定位分区分配:为使各分区中的用户程序能移到内存的一端,使碎片集中在另一端形成一个大分区,在程序执行过程中,需要对作业移动过程中的与地址有关项进行调整。这种分配方法的优点是可清除碎片,更大程度地利用内存空间,但必须硬件的支持,且要花费时间。
13.动态链接和静态链接的区别?
静态链接动态链接都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但若是使用 动态库(DLL),该DLL 不必包含在最终EXE 文件中,EXE 文件执行时可以动态地引用和卸载这个与该EXE 独立的DLL文件。另一个区别是,静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态库或静态库。
14.操作系统的4个特性
并发性(concurrency): 指在计算机系统中存在着许多并发执行的活动。并发是指宏观上看系统内有多道程序同时运行,微观上看是串行运行(因为在大多数计算机系统中一般只有一个CPU,任意时刻只能有一道程序占用CPU)。
共享性(sharing): 系统中各个并发活动要共享计算机系统中的各种软、硬件资源,因此操作系统必须解决在多道程序间合理地分配和使用资源问题。
虚拟性(virtual): 虚拟指把物理上的一台设备编程逻辑上的多台设备。例如操作系统中采用了spooling 技术,可以利用快速、大容量可共享的磁盘作为中介,模拟多个非共享的低速输入输出设备,这样的设备称为虚拟设备。
异步性: 在多道程序环境下允许多个进程并发执行,但只有进程在获得所需的资源后方能执行。在单处理机环境下,每次只允许一个进程执行,其余进程只能等待。
操作系统