2021-07-21

一、进程与线程

什么是进程,什么是线程?进程和线程有什么区别?

  • 进程:进程是程序的一次执行,是系统进行资源分配和调度的独立单位,他的作用是是程序能够并发执行提高资源利用率和吞吐率。

  • 线程:多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

区别:

1. 拥有资源

进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

2. 调度

线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。

3. 系统开销

由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

4. 通信方面

线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。

什么是僵尸进程,孤儿进程?

  • 僵尸进程:当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构。
  • 孤儿进程:指的是在其父进程执行完成或被终止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

进程间通信的方式?

1. 管道

我们先来看一条Linux命令:ps -ef | grep mysql
这天命令中的 ‘|’ 就是一个管道,他表示将ps -ef的输出结果,作为grep mysql的输入,这种管道是没命名字,所以称为匿名管道,用完了就销毁。与之对应的是命名管道,他需要手动进行创建。

匿名管道
管道的通信是依赖于进程的文件描述符实现的,而匿名管道没有实体,也就是没有管道文件,因此只能通过fork来复制父进程的文件描述符。因此,匿名管道的通信范围是存在父子关系的进程。

命名管道
命名管道可以在不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。

管道的通信方式效率低,不适合进程间频繁地交换数据。不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则。

2. 消息队列

消息队列是保存在内核中的消息链表。如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。

消息队列生命周期随内核,如果没有释放消息队列或者没有关闭操作系统,消息队列会一直存在,而前面提到的匿名管道的生命周期,是随进程的创建而建立,随进程的结束而销毁。

消息队列的缺点:

  • 消息队列不适合比较大数据的传输:因为在内核中每个消息体都有一个最大长度的限制,同时所有队列所包含的全部消息体的总长度也是有上限。

  • 消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销:因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时,会发生从内核态拷贝数据到用户态的过程。

3. 共享内存

共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度。

4. 信号量

若使用共享内存作为进程间通信的方式,会出现多进程竞争同个共享资源会造成数据的错乱。

信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。

5. 信号

信号一般用于异常情况,在 Linux 操作系统中, 为了响应各种各样的事件,提供了几十种信号,分别代表不同的意义。通过kill -l可以查看所有的信号

在这里插入图片描述

如在shell进程中通过键盘输入Ctrl+C 会产生 SIGINT 信号,表示终止该进程;
kill -9 命令表示向进程发送 SIGKILL 信号

6. Socket

上述五种方法都只能在同一主机下进行进程间通信,而Socket可以实现跨网络的不同主机间的进程间通信。与不同网络主机下进程进行Socket通信需要向下封装成TCP/IP包。

发生死锁的四个必要条件

  • 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
  • 占有和等待:已经得到了某个资源的进程可以再请求新的资源。
  • 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
  • 循环等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源

内存管理

1. 虚拟内存

为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。
虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。

2. 内存分页

每个进程都有独立的4GB虚拟地址空间,共享4GB物理地址空间。每个进程的代码段和数据段在逻辑上被拆分为以页为单位的小内存快。接着操作系统开始为这些虚拟内存页分配真实的物理内存页,它查找物理内存中可用的页,然后在页表中登记这些物理页地址,这样就完成了虚拟页到物理页的映射。

3. 内存分段

逻辑地址空间是由一组段构成。每个段都有名称和长度。地址指定了段名称和段内偏移。因此用户通过两个量来指定地址:段名称和段偏移。
分段逻辑地址的定义:【分段号, 偏移】

I/O多路复用

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值