初夏小谈:进程与线程小结

1.进程上下文数据的了解

进程上下文数据用于存放进程切换时正在处理的数据。

原因:如果不对这个数据进行存储,那么当CPU分时切换下一个进程时,处理此时进程数据时,就会覆盖之前的数据,这就会导致数据丢失。

2.进程与线程的概念

进程:

      用户角度:正在运行的程序

      操作系统角度:当一个程序运行起来之后,操作系统就会为这个进程创建一个PCB来描述组织这个进程。操作系统通过PCB来控制进程的运行,所以进程就是PCB,在Linux中就是task_struct结构体。

线程:在Linux操作系统中线程使用PCB来描述线程,所以线程是轻量级进程,因为它是在进程中创建的,并且操作系统不会为它分配资源。此时线程是由PCB组织描述,那么此时进程就是线程组。一个进程中最少有一个线程。

区别:

     资源分配:进程时资源分配的基本单位,线程是CPU执行和调度的基本单位。

     所属关系:进程中包含线程,并且一个进程中至少有一个线程

     资源共享:线程共享进程的虚拟地址空间,文件描述符,代码段和数据段,但是线程也拥有自己的独有资源如栈,error,标识符,寄存器等

     执行情况:CPU切换进程的代价较大,因为进程拥有大量资源。而线程更加轻便。

3.线程的组成

    线程由自己的线程标识符,线程ID,寄存器,独有的堆栈等组成

4.多进程与多线程的区别(创建的代价,调度,通信方式,稳定性)

   1.创建代价:多进程创建/销毁代价大,因为它需要操作系统给其分配资源而线程不需要。

   2.调度:线程间调度更低,只需切换页表即可。一个进程下线程共用虚拟地址空间。

   3.通信:进程间通信需要通过管道,共享内存,消息队列,信号量方式通信,这是由于进程间的独立性。而线程间直接在共享的堆上进行数据传输即可。

   4.稳定性:进程由于独立性所以稳定好,而线程由于共享进程资源所以健壮性较低,缺乏访问控制,编程/调试较为复杂。

5.死锁的了解(概念,产生,处理,预防)

  死锁概念:死锁就是多个进程之间由于互相竞争临界资源而造成的一种僵持状态。其中的进程都不能运行。

  产生:互斥条件,不可剥夺,请求与保持,环路等待

  产生场景:锁资源的竞争或者加锁/解锁顺序不当

  处理:除了互斥条件外,可破坏其他三种中任何一个或者多个。

  预防:银行家算法:操作系统在给进程分配资源时会判断当前是否满足该进程的所有资源,如果有,在判断是否分配给该进程后,会处于一种不安全的状态?如果安全则分配。死锁检测算法

6.线程池的了解(概念,作用,使用场景)

  概念:一大堆线程+一个安全的队列

  作用:1.避免了大量创建线程的时间开销

          2.防止服务器因创建线程而导致资源耗尽崩溃宕机的情况

          3.支持并发,解耦合

          4.支持忙线不均

  使用场景:适用于瞬时大量任务的需求处理

7.堆栈和线程的关系

 当线程创建后,系统会在进程的栈上分配一块栈来单独为线程使用,其它线程不可访问,而堆为操作系统在线程共享进程的堆上创建一个区域,其它线程均可访问实现线程间通信。

8.线程的创建与分离、线程的joinable时,操作系统为什么不释放线程的资源?

  线程创建:pthread_create(tid,NULL)

  线程分离:pthread_detach(tid)

  处于joinable状态的线程,进程必须等待线程退出,否则造成资源泄露。

  原因:这是处于joinable状态的线程,当线程执行完毕后,操作系统会发送一个信号给进程,但是这个信号是SIG_IGN,默认为忽略。所以进程对线程做的处理是不管它。操作系统见是这样,也不敢擅自释放这块资源,所以造成了资源泄露。

  处理方式:一、进行线程分离、二、进行修改信号重新处理信号的方法、三进程等待线程退出

9.线程安全问题?为什么会有线程安全?线程安全的处理方法?

  由于多个线程缺乏访问控制,从而对临界资源的操作导致数据的二义性。所以临界资源一旦被玩坏了,那就凉凉了。

  保证线程安全问题就是保证线程访问资源的时序可控性和唯一访问性。

  如何保证呢?互斥锁加条件变量的方式,信号量,生产者和消费者模型

10.进程地址空间

  进程地址空间特点:代码共享,数据独有

  操作系统再为一个进程分配一个资源时由于实际所用内存不多,所以它是虚拟分配一块(32位,4G空间)然后通过页表映射到实际的物理内存上。

  这种方式可以使实际内存充分利用,对内存访问控制。

11.信号量同步与互斥的问题?条件变量与互斥锁实现同步与互斥

  信号量具有等待队列的计数器。当获取资源时,会先-1如果资源数大于0,则直接返回,获取资源。若<=0则陷入等待。当资源产出,+1,时唤醒等待的进程。

12.进程状态/僵尸进程/孤儿进程/守护进程

进程状态:运行态,可中断睡眠态,不可中断睡眠态,僵尸态,死亡态,追踪态等。

僵尸进程:子进程先于父进程退出,父进程没有管,操作系统不敢擅自释放。所以造成一种僵死的状态。

僵尸进程也是由于父进程对子进程的默认处理方式为忽略处理造成的。

孤儿进程:父进程在创建子进程后,先于子进程退出,导致子进程跑到后台运行,由1号进程所收养。

守护进程:守护进程也是一种孤儿进程,区别在于守护进程是独立于终端之外,运行特定的任务。

13.写时拷贝技术,以及子进程的PID在哪存放

写时拷贝技术:在父进程创建子进程后,子进程复制父进程的PCB以及虚拟地址空间。PCB中的结构体mm_struct指向虚拟地址空间并且同时通过页表指向一个物理内存。当子进程执行数据操作后此时会重新分配一块内存,在存放到这个新的内存中。这种到需要存放新数据时才会分配内存的方式成为写实拷贝技术。

子进程的PID存放在复制的父进程的PCB中。

14.进程间通信原因以及进程间通信方式

原因:由于进程之间的独立性,导致不能直接进行数据传输。

通信方式:管道,信号量,消息队列,共享内存等

15.管道中没有数据什么现象?

管道中没有数据时:当进行读操作时,会陷入阻塞,当管道满了,写操作会阻塞。

管道中没有数据且写端关闭时:进行读操作时会直接返回0,有数据则读完后返回。

当管道中数据已满且所有读端关闭:进行写操作会触发异常SIGPIPE信号

16.线程状态(阻塞,新建,运行,就绪)

17.如何进程终止

进程终止:场景:正常退出但是没有结果不符合预期,正常退出,符合预期。异常退出

在主函数中return,调用库函数exit(),底层调用系统调用接口_exit()函数

18.库函数和系统调用接口的区别

库函数是对系统调用函数的一层封装,系统调用接口由于使用不方便,且处理完任务后直接退出。

库函数是将任务处理完后,会进行善后的一系列操作。

19.多线程与多进程的使用场景,多线程退出,程序会退出吗?

多进程适用于操作相关性比较低的场景,多线程适用于各种任务之间联系紧密度较高的场景。

在线程中return会退出线程组

20.冯诺依曼体系结构

输入设备,输出设备,控制器,运算器,存储器。且以存储器为核心的新一种结构

                                                                                                                                                     珍&源码

猜你喜欢

转载自blog.csdn.net/IT_xiaoQ/article/details/98470303
今日推荐