关于多线程和多进程常见的一些面试题总结

题目1:“Linux中线程互斥/同步有哪几种方式”

线程间的同步方法大体可分为两类:用户模式和内核模式。
内核模式: 利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态
用户模式就是不需要切换到内核态,只在用户态完成操作。

用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。
内核模式下的方法有:事件,信号量,互斥量。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
生产者消费者 用到信号量

题目2:“同样可以实现互斥,互斥锁和信号量有什么区别”

在这里插入图片描述

信号量作为通信使用时,进程/线程对信号量+1或者-1,很有可能只是通知对方某件事情已经完成,并没有锁的概念。

题目3:多线程同步和互斥有何异同,在什么情况下分别使用他们?举例。

线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。

题目4:“请用普通的锁实现一个读写锁”

在这里插入图片描述
count_mutex和write_mutex均为互斥量
read_count为一个实数,表示读者数量
count_mutex 作用:

  1. 对read_count进行++ – 的时候的保护
  2. 当第一个读者发现write_mutex被锁的时候,写者在进行写操作,第一个读者进行等待,此时没有释放count_mutex,后续读者不能进入临界区

第9行原因:
第一个读者开始读的时候,不能有写者进行写操作,所以需要将write_mutex锁住。

第8-10行必须写在lock(count_mutex ) unlock(count_mutex ) 中原因:
因为多线程情况下,如果写在外面,线程1可能对read_count++,read_count=1;
切换线程2对read_count进行++,read_count=2;
再次切换回线程1,执行if判断后,无法将write_mutex加锁。
在这里插入图片描述

题目5:“产生三个线程ABC,并让它们顺次打印ABC”

在这里插入图片描述
信号量是应用于同步,相当于A通知B,B通知C,C通知A

题目6:“死锁是怎么产生的?如何避免”

在这里插入图片描述
https://baike.baidu.com/item/死锁避免?fr=aladdin

题目7:“Linux中进程通信有哪些方式”

在这里插入图片描述
https://www.ibm.com/developerworks/cn/linux/l-ipc/

题目8:“Linux中进程空间布局”

Linux下进程虚拟内存,32位下是4GB
高地址1GB是内核空间
低地址3GB为用户空间

用户空间从下往上为代码段,数据段,BSS段,堆,Menory Mapping Segment段, 栈
代码段:要执行的代码
数据段:已经初始化 的静态变量和全局变量
BSS段: 未初始化 的静态变量和全局变量
堆:动态申请的内存从下往上增长。大小比栈大很多,通过brk值设置
栈: 程序运行过程中的局部变量和函数参数等压栈出栈 从上往下增长
一般来说栈大小RLIMIT_STACK是8M,是可以设置的。 参数过多可能会栈溢出(超过了栈的应用空间)

Menory Mapping Segment段 内存映射段,可以将内存映射到磁盘的某些空间或者动态链接库。
虚函数表放在数据段,具体的虚函数放在代码段里。
在这里插入图片描述
在这里插入图片描述

题目9:“内存缺页发生在哪里?”

在3GB的用户空间。
整个4GB是虚假的内存空间,真正的进程运行时,通过缺页中断,段页管理等映射到物理内存

在这里插入图片描述
https://blog.csdn.net/chdhust/article/details/8705239

C语言是一种广泛应用于系统编程的编程语言,支持多进程多线程编程。下面是关于C语言多进程多线程的一些常见面试题及其回答: 1. 多进程多线程的区别是什么? 多进程是指在一个程序中同时运行多个进程,每个进程都有自己独立的内存空间和系统资源,进程之间通信需要使用进程间通信机制。而多线程是指在一个进程中创建多个线程,这些线程共享同一进程的内存空间和系统资源,线程之间通信更加简单,可以直接访问共享变量。 2. 如何在C语言中创建新的进程? 在C语言中,可以使用fork()函数创建新的进程。fork()函数会复制当前进程的所有资源和代码,得到一个新的进程,新的进程会从fork()函数的调用点开始执行。 3. 如何在C语言中创建新的线程? 在C语言中,可以使用pthread_create()函数创建新的线程。pthread_create()函数会在调用点创建一个新的线程,并指定线程的执行函数,新的线程会从执行函数的起始点开始执行。 4. 进程间通信的方式有哪些? 进程间通信方式有管道、命名管道、信号量、共享内存、消息队列等。这些方式可以用于不同进程之间的数据交换和同步。 5. 线程同步的方式有哪些? 线程同步的方式有互斥锁、条件变量、读写锁、信号量等。这些方式可以用于不同线程之间的数据共享和访问控制,保证线程的安全性。 总结: C语言支持多进程多线程编程,多进程多线程的区别在于进程之间需要使用进程间通信机制进行通信,而线程之间可以直接访问共享变量。创建新的进程可以使用fork()函数,创建新的线程可以使用pthread_create()函数。进程间通信的方式有管道、命名管道、信号量、共享内存、消息队列等,线程同步的方式有互斥锁、条件变量、读写锁、信号量等。了解这些概念和方式对于C语言多进程多线程编程的理解和应用非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值