进程和线程有何区别? 


进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

线程上下文切换比进程上下文切换要快得多。

与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表少得多。


中断和轮询的特点?


对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。

程序中断通常简称中断,是指CPU在正常运行程序的过程中,由于预先安排或发生了各种随机的内部或外部事件,使CPU中断正在运行的程序,而转到为响应的服务程序去处理。

轮询——效率低,等待时间很长,CPU利用率不高。

中断——容易遗漏一些问题,CPU利用率高。


什么是临界区?如何解决冲突?

临界区指的是一个访问共用资源的程序片段。

临界区管理:

软件方法:设置一个指示变量;

硬件方法:test and build指令、swap指令、关中断


分段和分页:

  页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

  分页的作业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。


说出你所知道的保持进程同步的方法?

原子操作

信号量机制

自旋锁:对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

管程:利用共享数据结构抽象地表示系统中的共享资源,而把对该共享数据结构实施的操作定义为一组过程。


Linux中常用到的命令

  显示文件目录命令ls        如ls

  改变当前目录命令cd        如cd /home

  建立子目录mkdir           如mkdir xiong

  删除子目录命令rmdir       如rmdir /mnt/cdrom

  删除文件命令rm            如rm /ucdos.bat

  文件复制命令cp            如cp /ucdos /fox

  获取帮助信息命令man      如man ls

  显示文件的内容less        如less mwm.lx

  重定向与管道type          如type readme>>direct,将文件readme的内容追加到文direct中


makefile文件的作用是什么?


makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”。


什么是中断?中断时CPU做什么工作?


  中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。


你知道操作系统的内容分为几块吗?什么叫做虚拟内存?他和主存的关系如何?内存管理属于操作系统的内容吗?


  操作系统的主要组成部分:进程和线程的管理,存储管理,设备管理,文件管理。虚拟内存是一些系统页文件,存放在磁盘上,每个系统页文件大小为4K,物理内存也被分页,每个页大小也为4K,这样虚拟页文件和物理内存页就可以对应,实际上虚拟内存就是用于物理内存的临时存放的磁盘空间。页文件就是内存页,物理内存中每页叫物理页,磁盘上的页文件叫虚拟页,物理页+虚拟页就是系统所有使用的页文件的总和。


线程是否具有相同的堆栈?


  每个线程有自己的堆栈。


什么是缓冲区溢出?有什么危害?其原因是什么?


  缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。


  危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为***者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到***的目的。


  造成缓冲区溢出的主原因是程序中没有仔细检查用户输入的参数。


什么是死锁?其条件是什么?怎样避免死锁?


死锁的概念略。


产生死锁的条件:互斥访问、占有并等待、非抢占、循环等待。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。


死锁的处理策略:

死锁的防止:静态分配、层次分配。

死锁的避免:银行家算法。

死锁的检测和解除。



进程间的通信是如何实现的?

管道:速度慢,容量有限

消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。

信号量:不能传递复杂消息,只能用来同步

共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了一块内存的。