操作系统面试题
1、进程和线程的区别?
解析:(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程的创建调用 fork 或者 vfork,而线程的创建调用 pthread_create,进程结束后它拥有的所有线程都将销毁,父子进程不会因为对方退出而退出,线程的结束不会影响同个进程中的其他线程的结束。
(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
(6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
** (7)关于继承:a、进程的亲核性、调度属性、优先级、堆栈信息等属性都具有继承的特性(子进程、或其创建的线程自动继承)。b、进程的下的线程数目不属于进程的属性参数,不具有继承属性,子进程不会继承父进程中的线程数,或者在进程的某个线程下创建一个新的进程,新进程也仅有一个线程。**
2、死锁?死锁产生的原因?死锁的必要条件?怎么处理死锁?
解析:(–)相互等待资源而产生的一种僵持状态,如果没有外力的干预将一直持续这个状态
(–)系统资源不足、相互竞争资源、请求资源顺序不当
(2)互斥、不可抢占、循环等待、请求与保持
(3)因为互斥是不可改变的,所以只能破坏其他三个条件中的一个来解除死锁,方法:剥夺资源、杀死其中一个线程
3、Windows内存管理方式:段存储、页存储、段页存储
解析:
4、进程的几种状态?
解析:(1)run(运行状态):正在运行的进程或在等待队列中对待的进程,等待的进程只要以得到cpu就可以运行
(2)Sleep(可中断休眠状态):相当于阻塞或在等待的状态
(3)D(不可中断休眠状态):在磁盘上的进程
(4)T(停止状态):这中状态无法直观的看见,因为是进程停止后就释放了资源,所以不会留在linux中
(5)Z(僵尸状态):子进程先于父进程结束,但父进程没有调用 wait 或 waitpid 来回收子进程的资源,所以子进程就成了僵尸进程,如果父进程结束后任然没有回收子进程的资源,那么 1 号进程将回收,举例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 1 pid = fork();
2 if(pid < 0)
3 {
4 printf("fork error\n");
5 }
6 else if(pid == 0)
7 {
8 printf("2--pid = %d,cur_pid=%d,parent pid = %d\n",pid,getpid(),getppid());
9 exit(0);
10// while(1) sleep(1);
11 }else{
12 printf("3--pid = %d,cur_pid=%d,parent pid = %d\n",pid,getpid(),getppid());
13 //int child_pid = wait(NULL);
14 //printf("wait child_pid=%d\n",child_pid);
15 sleep(60);
16 exit(0);
17 }
18
执行结果:
5、IPC通信方式?
解析:(1)管道(匿名管道(pipe亲缘关系的进程通信)、命名管道(mkfifo/mknod))
(2)消息队列:是基于消息的、用无亲缘关系的进程间通信,主要函数:msgget、msgsend、msgrecv、msgctl
(3)信号量:相当于一把互斥锁,通过p、v操作,主要函数:semget、semop、semctl
(4)共享内存:是进程间通信速度最快的,所以用经常是集合信号量或互斥锁来实现同步,shmget、shmat、shmdt、shmctl
6、什么是虚拟内存?
解析:是将进程部分装入内存中,从而能实现一个很大的程序能在一个比它小的内存中运行,它的主要实现是靠程序的换进换出来实现的,因为内存中03G是用户使用,34G才是内存使用,通过映射来实现来进行逻辑地址到物理地址的映射
7、虚拟地址、逻辑地址、线性地址、物理地址的区别?
解析: 分段机制把一个逻辑地址转换为线性地址;接着,分页机制把一个线性地址转换为物理地址。
(1)虚拟地址:虚拟内存映射出来的地址
(2)逻辑地址:程序的段加偏移量形成的,C/C++程序中取地址求出来的地址就是逻辑地址
(3)线性地址:是逻辑地址到物理地址的中间层,只有启动分页机制的时候才有线性地址,如果没有分页机制,那么线性地址就是物理地址
(4)物理地址:是内存中实实在在存在的硬件地址,
逻辑地址(启动分段)–》线性地址(启动分页)–》物理地址