Linux 复习3

问:什么是线程?

答:线程是进程最小的执行单位,是进程中一条执行路径

问:进程和线程的区别?

答:

  1. 从执行情况来看,进程是操作系统调度的最小单位,线程是cpu调度基本单位
  2. 从资源分配来看,进程会给分配地址空间,维护代码段,数据段,堆栈区,开销较大,而线程只维护自己的栈区,开销小
  3. 同一进程下,线程比进程更容易通信,拥有共有的代码段,数据段,堆区,而进程需要基本的IPC通信才可以
  4. 多进程更容易维护,一个进程崩溃不会影响其他进程,而多线程,一个线程崩溃,整个进程崩溃

问:线程同步的方法有哪些?

答:信号量,互斥锁,条件变量,读写锁。

问:线程并发运行

答:

问:什么是线程?

答:线程是进程最小的执行单位,是进程中一条执行路径

问:进程和线程的区别?

答:

  1. 从执行情况来看,进程是操作系统调度的最小单位,线程是cpu调度基本单位
  2. 从资源分配来看,进程会给分配地址空间,维护代码段,数据段,堆栈区,开销较大,而线程只维护自己的栈区,开销小
  3. 同一进程下,线程比进程更容易通信,拥有共有的代码段,数据段,堆区,而进程需要基本的IPC通信才可以
  4. 多进程更容易维护,一个进程崩溃不会影响其他进程,而多线程,一个线程崩溃,整个进程崩溃

问:线程同步的方法有哪些?

答:信号量,互斥锁,条件变量,读写锁。

问:线程并发运行

答:一个处理器处理多个任务,但在某个时刻,只有一个线程被执行,保证了数据的一致性。

 问:为何需要线程安全的函数?

答:线程安全函数一般以_r 结尾,因为再多线程的情况下,一些共享的资源都可以别访问到,并行处理时,可能会达到同时进行,对于一些易变的数据,这种操作不安全,而线程安全函数,会对这些资源做到同步或者互斥控制,保证了数据的可靠性

问:多线程中的fork()问题?

答: 在执行fork()之前,如果一个线程对互斥锁上锁,执行fork()之后,子进程会将父进程的资源复制过来,当要去执行某段代码时,发现已经上锁,处于阻塞,等待解锁,而父进程中的线程解锁后,子进程和父进程已经是不同的内存,不会对子进程造成影响,所以子进程造成了死锁状态,解决办法 在父进程fork()之前,调用pthread_atfork()

int pthread_atfork(void (*prepare)(void), void (*parent)void(), void (*child)(void));

他会获取父进程的所有锁,在fork()返回之前对所有锁进行解锁。

问:操作系统中的线程实现?

  1.  线程实现在用户空间,对于内核来说,还是只有一个进程,在用户空间,可以用库函数来支持线程,这种模式,当线程用完cpu阻塞时,调用系统本身,将CPU资源交付给其他线程,在用户空间切换,效率高,自己维护线程调度算法,灵活度高,缺点是,当出现缺页中断导致的线程阻塞,操作系统会将整个进程阻塞,会造成其他线程无法工作
  2. 线程在内核空间,操作系统就知道了线程的存在,拥有了线程控制块,管理线程,这样的线程切换,都要进行系统调用进行阻塞,成本高,但是当一个线程摧毁时,只是将标记为更改,回收效率高
  3. 混合模式  用户态的系统负责执行线程内非阻塞线程的切换,内核系统负责阻塞线程的切换,用户态线程较多,内核态线程较小,一个内核态线程可以服务多个用户态线程,这样管理,程序员可以控制使用多少用户态线程和内核态线程,相当灵活。

问: Linux线程的实现?

答:对于内核来说,没有真正的线程,只是将线程看作进程进行管理,拥有自己的tast_struct ,看起来就是一个普通的进程,但是没有独立的内存空间。

 问: 了解协程吗?

答:协程是一种轻量级的用户态线程,拥有自己的寄存器上下文和栈,无需上下文的开销,无需担心资源共享,方便切换控制流,无法使用多核cpu,运行阻塞时,会阻塞整个进程(异步I/o解决)

 问:多线程的调试

答:利用core文件检查多线程,利用kill -11 pid 生成core文件  gdb  ./main  core.3578  可以查看多线程的问题

猜你喜欢

转载自www.cnblogs.com/lc-bk/p/12374037.html
今日推荐