Linux你必须知道的小知识-16

65 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

2.48 多线程和单线程有什么区别,多线程编程要注意什么,多线程加锁需要注意什么?

参考回答

  1. 区别

    (1)多线程从属于一个进程,单线程也从属于一个进程;一个线程挂掉都会导致从属的进程挂掉。

    (2)一个进程里有多个线程,可以并发执行多个任务;一个进程里只有一个线程,就只能执行一个任务。

    (3)多线程并发执行多任务,需要切换内核栈与硬件上下文,有切换的开销;单线程不需要切换,没有切换的开销。

    (4)多线程并发执行多任务,需要考虑同步的问题;单线程不需要考虑同步的问题。

  2. 多线程编程需要考虑同步的问题。线程间的同步方式包括互斥锁、信号量、条件变量、读写锁

  3. 多线程加锁,主要需要注意死锁的问题。破坏死锁的必要条件从而避免死锁。

答案解析

  1. 死锁: 是指多个进程在执行过程中,因争夺资源而造成了互相等待。此时系统产生了死锁。比如两只羊过独木桥,若两只羊互不相让,争着过桥,就产生死锁。

  2. 产生的条件:死锁发生有四个必要条件: (1)互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问,只能等待,直到进程使用完成后释放该资源;

    (2)请求保持条件:进程获得一定资源后,又对其他资源发出请求,但该资源被其他进程占有,此时请求阻塞,而且该进程不会释放自己已经占有的资源;

    (3)不可剥夺条件:进程已获得的资源,只能自己释放,不可剥夺;

    (4)环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

  3. 如何解决

    (1)资源一次性分配,从而解决请求保持的问题

    (2)可剥夺资源:当进程新的资源未得到满足时,释放已有的资源;

    (3)资源有序分配:资源按序号递增,进程请求按递增请求,释放则相反。

答案解析

举个例子,比如:如果此时有两个线程T1和T2,它们分别占有R1和R2资源

此时,T1请求R2资源的同时,T2请求R1资源。

这个时候T2说:你把R1给我,我就给你R2

T1说:不行,你要先给我R2,我才能给你R1

那么就这样,死锁产生了。如下图:

2.49 说说sleep和wait的区别?

参考回答

  1. sleep

    sleep是一个延时函数,让进程或线程进入休眠。休眠完毕后继续运行。

    在linux下面,sleep函数的参数是秒,而windows下面sleep的函数参数是毫秒。

    windows下面sleep的函数参数是毫秒。

    例如:

    #include <windows.h>// 首先应该先导入头文件 Sleep (500) ; //注意第一个字母是大写。 //就是到这里停半秒,然后继续向下执行。
    

    在 Linux C语言中 sleep的单位是秒

    例如:

    #include <unistd.h>// 首先应该先导入头文件 sleep(5); //停5秒 //就是到这里停5秒,然后继续向下执行。
    
  2. wait

    wait是父进程回收子进程PCB资源的一个系统调用。进程一旦调用了wait函数,就立即阻塞自己本身,然后由wait函数自动分析当前进程的某个子进程是否已经退出,当找到一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞,直到有一个出现为止。函数原型如下:

    #include<sys/types.h>   #include<sys/wait.h>     pid_t wait(int* status);  
    

    子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一起返回。如果不需要结束状态值,则参数status可以设成 NULL。

  3. 区别: (1)sleep是一个延时函数,让进程或线程进入休眠。休眠完毕后继续运行。

    (2)wait是父进程回收子进程PCB(Process Control Block)资源的一个系统调用。