【Linux】---进程和线程(面试常考点)

【Linux】 进程和线程(面试常考点)

注:本文集结了很多大厂小伙伴的面经,呕心沥血撰写而成!!!
1.进程是什么?
答:进程(Process)是指计算机中已运行的程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。进程是程序真正运行的实例,若干进程可能与同一个程序相关,且每个进程皆可以同步或异步的方式独立运行。(来自百度百科)

2.为什么引入进程?
答:进程是为了提高CPU的执行效率,减少因为程序等待带来的CPU空转以及其他计算机硬件资源浪费而提出的。

3.进程间通信方式有哪些?
管道(pipe)
有名管道(named pipe)
信号量(semophore)
消息队列(message queue)
信号(signal)
套接字(socket)

4.如何用代码创建一个进程呢?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
printf("hello proc : %d!, ret: %d\n", getpid(), ret);
sleep(1);
return 0;
}

5.什么是线程?
答:线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

6.为什么引入线程?
答:为了减少进程间切换和创建的开销,提高执行效率和节省资源。

7.线程间通信方式有哪些?
事件(Event)
信号量(semaphore)
互斥量(mutex)
临界区(Critical section)

8.线程的优点
1)创建一个新线程的代价要比创建一个新进程小得多
2)与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
3)线程占用的资源要比进程少很多
4)能充分利用多处理器的可并行数量
5)在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
6)计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

9.线程的缺点

  • 性能损失
    一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
  • 健壮性降低
    编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
  • 缺乏访问控制
    进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
  • 编程难度提高
    编写与调试一个多线程程序比单线程程序困难得多

10.什么是线程异常?

  • 1)单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
  • 2)线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出

11.代码如何实现一个线程?

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
void *rout(void *arg) {
  int i;
  for( ; ; ) {
    printf("I'am thread 1\n");
    sleep(1);
 }
}
int main( void )
{
  pthread_t tid;
  int ret;
  if ( (ret=pthread_create(&tid, NULL, rout, NULL)) != 0 ) {
    fprintf(stderr, "pthread_create : %s\n", strerror(ret));
    exit(EXIT_FAILURE);
 }
  int i;
  for(; ; ) {
    printf("I'am main thread\n");
    sleep(1);
 }
}

12.什么时候用进程?什么时候用线程?
进程与线程的选择取决以下几点:

  • 需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的;
  • 线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应;
  • 因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;
  • 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求; 需要更稳定安全时,适合选择进程;需要速度时,选择线程更好;
  • I/O密集型和CPU密集型适合多线程。

13.进程和线程的区别?(点击率最高)

  • 调度:线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程 中,线程的切换不会引起进程的切换;在不同的进程中,进行线程切换,则会引起进程的切换。
  • 拥有资源:进程是拥有资源的基本单位,线程不拥有资源,但线程可以共享器隶属进程的系统资源。
  • 并发性:进程可以并发执行,而且同一进程内的多个线程也可以并发执行,大大提高了系统的吞吐量。
  • 系统开销:创建和撤销进程时,系统都要为之分配或回收资源,在进程切换时,涉及当前执行进程CPU环境的保存以及新调度的进程CPU环境的设置;而线程切换时只需保存和设置少量寄存器内容,因此开销很小,另外,由于同一进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信比较容易实现,甚至无须操作系统的干预。
  • 通信方面:进程间通信需要借助操作系统,而线程间可以直接读/写进程数据段来进行通信。同一个进程下,线程共享全局变量、静态数据等数据,进程之间的通信需要以通信的方式(IPC)进行.
  • 安全方面:多进程程序更安全,生命力强,一个进程死掉不会对另一个进程造成影响(源于有独立的地址空间);多线程程序更不易维护,一个线程死掉,整个进程就死掉了(因为共享地址空间);
    进程对资源保护要求高,开销大,效率相对较低;线程资源保护要求不高,但开销小,效率高,可频繁切换。
发布了45 篇原创文章 · 获赞 271 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/L19002S/article/details/103498333