1. 进程和线程区别
- 进程和线程是什么
- 进程是一个“执行中的程序”,分配资源的基本单位
- 线程是进程的一个实体,是CPU调度和分派的基本单位。
- 区别
- 进程有独立的地址空间,线程没有。
- 进程有独立的内存单元,线程共享内存。
- 调度和切换:线程上下文切换比进程上下文切换要快得多。
2. 死锁的必要条件,怎么处理死锁。
- 指多个进程因竞争共享资源而造成的一种僵局
- 产生死锁原因
- 竞争系统资源
- 进程的推进顺序不当
- 解决死锁的基本方法
- 预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件
- 避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁
- 检测死锁:首先为每个进程和每个资源指定一个唯一的号码;
然后建立资源分配表和进程等待表 - 解除死锁:当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
- 剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
- 撤消进程:可以直接撤消死锁进程或撤消代价最小的进程
3. Window内存管理方式:段存储,页存储,段页存储。
- 页式和段式系统的异同点
- 相似点
- 两者都采用离散分配方式,且都通过地址映射机构来实现地址变换。
- 区别
- 页是信息的物理单位,分页仅仅是由于系统管理的需要,而不是用户的需要。段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段是由用户设计划分,目的是为了更好地满足用户的需要。
- 相似点
- 段存储
- 基本原理:
- 把程序按照内容或过程函数关系分段,每段都有自己的名字。
- 一个用户作业或进程所包括的段对应一个二维线形虚拟空间。
- 段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换为实际内存物理地址。
- 优点
- 针对不同类型的段采用不同的保护,分别编写和编译。
- 缺点
- 会产生碎片
- 基本原理:
- 页存储
- 基本原理
- 将各进程的虚拟空间划分为若干个长度相等的页。
- 然后把页式虚拟地址与内存地址建立一一对应的页表;
- 用相应的硬件地址变换机构来解决离散地址变换问题
- 优点
- 没有外碎片,每个内碎片不超过页的大小
- 缺点
- 程序全部装入内存,要求有相应的硬件支持,这增加了机器成本,增加了系统开销。
- 基本原理
- 段页存储
- 基本原理
- 系统必须为每个作业或进程建立一张段表以管理内存.
- 由于一个段又被划分成了若干个页。每个段必须建立一张页表以把段中的虚页变换成内存中的实际页面。
- 优点
- 段式与页式
- 缺点
- 由于管理软件的增加,复杂性和开销随之增加,需要占用的硬件及内存也有所增加,使得速度降下来。
- 基本原理
4. 进程的几种状态。
一般来说,进程有三个状态,即就绪状态,运行状态,阻塞状态
- 就绪状态
- 当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
- 执行状态
- 进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态; 在多处理机系统中,则有多个进程处于执行状态。
- 阻塞状态
- 正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即进程的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。致使进程阻塞的典型事件有:请求I/O,申请缓冲空间等。通常将这种处于阻塞状态的进程也排成一个队列。有的系统则根据阻塞原因的不同而把处于阻塞状态的进程排成多个队列。
5.1 . IPC几种通信方式(Android)。
- Binder机制
- 优点:更加简洁和快速,消耗的内存资源小,减少进程的开销。
- 使用方式
- Binder通信基于Service和Client。 所有需要IBinder通信的进程都必须创建一个IBinder接口。系统中有一个名为Service Manager的守护进程管理着系统中的各个服务,它负责监听是否有其他程序向其发送请求,如果有请求就响应,如果没有则继续监听等待。每个服务都要在Service Manager中注册,而请求服务的客户端则向Service Manager请求服务。在Android虚拟机启动之前,系统会先启动Service Manager进程,Service Manager就会打开Binder驱动,并通知Binder Kernel驱动程序,这个进程将作为System Service Manager,然后该进程将进入一个循环,等待处理来自其他进程的数据。
- 使用Bundle ----> 用于android四大组件间的进程间通信
- android的四大组件都可使用Bundle传递数据 所以如果要实现四大组件间的进程间通信 完全可以使用Bundle来实现 简单方便
- 使用文件共享 ---->用于单线程读写
- 这种方式在单线程读写的时候比较好用 如果有多个线程并发读写的话需要限制线程的同步读写
- AIDL android 接口定义语言 ---->主要用于调用远程服务的方法的情况 还可以注册接口
- 在服务端定义aidl文件 自动生成java文件
- 然后在service中实现这个aidl 在onbind中返回这个对象
- 在客户端把服务端的aidl文件完全复制过来 包名必须完全一致
- 在onServiceConnected方法 中 把 Ibinder对象 用asInterface方法转化成 aidl对象,然后调用方法即可
5.2 . IPC几种通信方式(操作系统)
- 信号量
- 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。
- 共享内存
- 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
- 共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。
- 它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
- 消息队列
- 消息队列是消息的链表,存放在内核中并由消息队列标识符标识。
- 消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
6. 什么是虚拟内存
- 进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。这
- 它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。
- 虚拟内存不只是“用磁盘空间来扩展物理内存”的意思——这只是扩充内存级别以使其包含硬盘驱动器而已。把内存扩展到磁盘只是使用虚拟内存技术的一个结果,它的作用也可以通过覆盖或者把处于不活动状态的程序以及它们的数据全部交换到磁盘上等方式来实现。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,以借此“欺骗”程序,使它们以为自己正在使用一大块的“连续”地址。
7. 虚拟地址、逻辑地址、线性地址、物理地址的区别。 (X86平台。)
- 虚拟地址(虚拟内存)
- 对整个内存(不要与机器上插那条对上号)的抽像描述,如call 0x0811111111
- 逻辑地址(虚拟地址)
- 地址经过分段转化为线性地址
- 程序产生的与段相关的偏移地址部分
- 机器语言指令中,用来指定一个操作数或者是一条指令的地址。
- 我们说的连接器为A分配的0x08111111这个地址就是逻辑地址。
- 线性地址
- 经过分页转为物理地址
- 物理地址
- 地址变换的最终结果,内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。