Linux面试小问题

来源:互联网 发布:excel将数据分组 编辑:程序博客网 时间:2024/06/04 19:07


1、软中断和硬中断的区别?

(1)硬中断为硬件产生中断信号,CPU相应中断信号;而软中断与硬件无关,由CPU调度。比如产生一个EXT中断或者MSI中断、Mailbox中断等,触发CPU来响应,这是硬中断。软中断一般作为中断的下半部来处理,CPU在中断处理函数的上半部处理需要尽快完成的工作,然后由内核来调度下半部的执行,这里的下半部可以使用软中断来实现,或者tasklet、workqueue来实现。

(2)软中断一般是处理I/O请求,不会中断CPU,由内核调度。而硬中断一般是响应硬件中断信号,会中断CPU,会触发内核中的中断函数。流程上,软中断从进程切换到驱动程序,而硬中断会是硬件->CPU->中断处理函数。

从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。 
如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。

①硬中断是由外部设备对CPU的中断,具有随机性和突发性;软中断由程序控制,执行中断指令产生的,无面外部施加中断请求信号,因此不是随机的而是安排好的。如信号就是软件中断,键盘输入、鼠标点击就是硬件中断。 
②硬中断的中断响应周期,CPU需要发中断回合信号(NMI(Non Maskable Interrupt,不可屏蔽中断)不需要),软中断的中断响应周期内,CPU不需发中断回合信号。 
③硬中断的中断号是由中断控制器提供的(NMI硬中断的中断号系统指定为02H);软中断的中断号由指令直接给出,无需使用中断控制器。 
④硬中断是可屏蔽的(NMI硬中断不可屏蔽),软中断不可屏蔽。

2、UDP和TCP可以绑定同一个端口? 
答: 
TCP、UDP可以绑定同一端口来进行通信。端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区),TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,可以拥有相同的端口号,并不冲突。

3、Linux环境中,如何产生子进程,由如何判断哪个是子进程和父进程? 
答: 
使用fork()来产生子进程。通过fork()的返回值来判断当前进程是父进程还是子进程,父进程返回子进程的进程ID,子进程返回0,如果fork失败,返回-1,错误号保存在errno中。


4、子进程可以访问父进程的变量吗? 
答: 
子进程可以访问父进程变量。子进程“继承”父进程的数据空间,堆和栈,其地址总是一样的,因为在fork时整个虚拟地址空间被复制,但是虚拟地址空间所对应的物理内存却没有复制。比如,这个时候父子进程中变量 x对应的虚拟地址和物理地址都相同,但等到虚拟地址空间被写时,对应的物理内存空间被复制,这个时候父子进程中变量x对应的虚拟地址还是相同的,但是物理地址不同,这就是”写时复制”。还有父进程和子进程是始终共享正文段(代码段)。


5、除了使用fork产生子进程,还有其它的方法吗? 
答: 
vfork()函数的调用序列和返回值与fork相同,同样可以创建一个新进程,但两者的语义不同。 
vfork()与fork的区别有二: 
(1)vfork出的子进程不拷贝父进程的地址空间,即使父进程的数据被修改。新进程的目的是exec一新程序。 
(2)在vfork调用中,子进程先运行,父进程挂起,直到子进程调用exec或exit,在这以后,父子进程的执行顺序不再有限制。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。


6、进程间通信的几种方式?哪种效率最高? 
答: 
(1)管道(PIPE)和命名管道(FIFO)——比如shell的重定向。 
(2)信号(Signal)——比如杀死某些进程kill -9,比如使用命令nohup使进程忽略SIGHUP信号,让进程在终端退出后,运行在系统后台。信号是一种软件中断。 
(3)消息队列(Message Queue)——相比共享内存会慢一些,缓冲区有限制,但不用加锁,适合命令等小块数据。 
(4)共享内存(Shared Memory)——最快的IPC方式,同一块物理内存映射到进程A、B各自的进程地址空间,可以看到对方的数据更新,需要注意同步机制,比如互斥锁、信号量。适合传输大量数据。 
(5)信号量(Semaphore)。 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。不是用于交换大批数据,而用于多线程之间的同步.常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步和互斥。如对信号量执行PV操作,实现生产者与消费者之间的同步。 
(6)套接字(Socket)——Socket网络编程,网络中不同主机间的进程间通信,属高级进程间通信。


1)无名管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。  

缺点:是默认缓冲区太小,只有4K ;数据本身没有边界,需要应用程序自己解释

2)有名管道:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 

     有名管道虽然可以提供给任意关系的进程使用.但是由于其长期存在于系统之中,使用不当容易出错。

3)默认缓冲区和单消息上限都要大一些 ,为64K,它并不局限于父子进程间通信,只要一个相同的key,就可以让不同的进程定位到同一个消息队列上,它也可以用来给双向通信,不过稍微加个标识,可以通过消息中的type进行区分,比如一个任务分派进程,创建了若干个执行子进程,不管是父进程发送分派任务的消息,还是子进程发送任务执行的消息,都将type设置为目标进程的pid,因为msgrcv可以指定只接收消息类型为type的消息,这样就实现了子进程只接收自己的任务,父进程只接收任务结果。

      用户在使用消息缓冲进行通信时不再需要考虑同步问题.使用方便,但是信息的复制需要额外消耗CPU的时间.不适宜于信息量大或操作频繁的场合。

4)共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点共享内存的几乎可以认为没有上限,它也是不局限与父子进程,采用跟消息队列类似的定位方式,因为内存是共享的,不存在任何单向的限制,最大的问题就是需要应用程序自己做互斥。必须由各进程利用其他同步工具解决。另外,由于内存实体存在于计算机系统中.所以只能由处于同一个计算机系统中的诸进程共享。不方便网络通信。


7、Linux多线程同步方式 ? 
答: 
(1)互斥量(mutex); 
(2)读写锁(reader-writer lock); 
(3)自旋锁(spin lock); 
(4)条件变量(condition); 
(5)信号量(semaphore)。如同进程一样,线程也可以通过信号量来实现同步; 
(6)屏障(barrier)。


8、如何解决哲学家进餐问题? 
答: 
哲学家进餐问题是由荷兰学者Dijkstra提出的经典的线程和进程间步问题之一。产生死锁的四个必要条件是: 
(1)互斥条件; 
(2)请求和保持条件; 
(3)不可剥夺条件; 
(4)环路等待条件。 
筷子是绝对互斥的,我们可以破坏其它三种条件来解决哲学家进餐问题。解决办法如下: 
(1)破坏请求保持条件 
利用原子思想完成。即只有拿起两支筷子的哲学家才可以进餐,否则,一支筷子也不拿。 
(2)破坏不可剥夺条件 
当哲学家相互等待时,选择一个哲学家作为牺牲者,放弃手中的筷子,这样就保证有一位哲学家可以就餐了。 
(3)破坏环路等待条件 
解法一:奇数号哲学家先拿他左边的筷子,偶数号哲学家先拿他右边的筷子。这样破坏了同方向环路; 
解法二:至多允许N-1位哲学家进餐,将最后一个哲学家停止申请资源,断开环路。最终能保证有一位哲学家能进餐,用完释放两只筷子,从而使更多的哲学家能够进餐。


9、硬链接和软连接的区别?

硬链接文件和原文件指向同样的数据,两者就像克隆一样,inode号也相同,当删除原 文件时,硬链接文件仍然存在有效。但硬链接文件不同于文件的复制。应该说硬链接文件的产生只是原文件所在目录文件的内容发生改变,原文件的数据并没有得到复制,而复制文件,磁盘上有两份数据。简单说,硬链接就是一个类似于别名的概念。当原来的名字没有了,别名照样可以使用(可以防止误删)。只有当最后一个连接被删除的时候,文件的数据块和目录的链接才会被释放。    

      软连接和windows系统的快捷方式含义一样,软链接和原文件的inode不同,该文件的内容是向原文件的路径信息。对软件链接进行读写操作的时候,系统会自动把该操作转化成对源文件的操作。但删除链接文件时,仅删除链接文件,不删除源文件。

      软链接就好像是指针一样。而硬链接就是引用。


10、多进程时wait用来干什么?

等待子进程执行完毕:如果其所有子进程都在运行,则阻塞;如果一个子进程已经终止,正在等待的父进程获取到终止状态,则取得该子进程的终止状态立即返回;如果他没有任何子进程,则立即出错返回。









原创粉丝点击