一.进程和线程的区别?
1. 进程是资源分配的最小单位, 线程是cpu进行调度的最小单位。
2. 一个进程可以看做一个运行的程序, 一个进程中可以包含多个线程, 线程在进程内执行。
3. 多进程是指操作系统能同时运行多个任务(程序),多线程是指在同一程序中有多个顺序流在执行。
4. 进程拥有自己的内存空间。线程使用进程的内存空间,和该进程的其他线程共享这个空间。
5. 线程可以控制同一进程的其他线程。进程无法控制兄弟进程,只能控制其子进程。
6. 线程可以使用 wait(),notify(),notifyAll()等方法直接与其他线程(同一进程)通信, 进程需要使用“进程间通信”(IPC)来与操作系统中的其他进程通信。
7. 在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
二. 什么是线程的上下文
1. 某一时间点CPU寄存器和程序计数器的内容,被称为上下文。
2. 寄存器是CPU内部的少量速度很快的闪存。
3. 程序计数器是一个专用的寄存器,被用来表示指令序列中CPU正在执行的位置。
三.什么会引起线程的上下文切换
1. 当前线程任务正常完成,CPU调度下一个任务
2. 当前任务被挂起,比如用了sleep方法,wait方法,yeild方法等,让出了CPU
3. 多个任务抢占锁资源,当前任务没抢到,就会被调度器挂起,然后调度器会执行下一个任务
4. 当前任务执行I/O等会引起阻塞的操作,调度器会挂起这个任务,然后执行下一个任务
四. Java 进程间的几种通信方式
1. 管道(pipe): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
2. 有名管道 (named pipe): 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信
3. 信号量(semophore): 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
4. 消息队列(message queue): 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大 小受限等缺点
5. 信号 (sinal): 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生
6. 共享内存(shared memory): 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信
7. 套接字(socket):套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
五.信号量与信号的区别?
1. 信号:(signal)是一种处理异步事件的方式。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。
2. 信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
3. 简单地说,信号就是一种异步通信,通知进程某种事件的发生;信号量是进程/线程同步与互斥的一种机制,保证进程/线程间之间的有序执行或对公共资源的有序访问。
六.select、poll、epoll 区别有哪些?
1. select:它仅仅知道了,有 I/O 事件发生了,却并不知道是哪那几个流(可能有一个,多个, 甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以 select 具有 O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
2. poll:poll 本质上和 select 没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个 fd 对应的设备状态,但是它没有最大连接数的限制,原因是它是基于链表来存储的.
3. epoll:epoll 可以理解为 event poll,不同于忙轮询和无差别轮询,epoll 会把哪个流发生了怎样的 I/O 事件通知我们。所以我们说 epoll 实际上是事件驱动(每个事件关联上 fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了 O(1)),通过红黑树和双链表数据结构,并结合回调机制,造就了 epoll 的高效,epoll_create(),epoll_ctl()和 epoll_wait()系统调用。
七.select 和 epoll 的底层结构是什么原理
1. select: 支持阻塞操作的设备驱动通常会实现一组自身的等待队列如读/写等待队列用于支持上层(用户层)所需的 BLOCK 或 NONBLOCK 操作。当应用程序通过设备驱动访问该设备时 (默认为 BLOCK 操作),若该设备当前没有数据可读或写,则将该用户进程插入到该设备驱动对应的读/写等待队列让其睡眠一段时间,等到有数据可读/写时再将该进程唤醒。 select 就是巧妙的利用等待队列机制让用户进程适当在没有资源可读/写时睡眠,有资源可读/写时唤醒。
2. epoll: epoll由三个系统调用组成,分别是 epoll_create,epoll_ctl 和 epoll_wait。 epoll_create 用于创建和初始化一些内部使用的数据结构;epoll_ctl 用于添加,删除或者修改指定的 fd 及其期待的事件,epoll_wait 就是用于等待任何先前指定的 fd 事件。
八.当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤?
1. 域名解析
2. 发起 TCP 的 3 次握手
3. 建立 TCP 连接后发起 http 请求
4. 服务器响应 http 请求
5. 浏览器得到 html 代码
6. 浏览器解析 html 代码,并请求 html 代码中的资源(如 js、css、图片等)
7. 浏览器对页面进行渲染呈现给用户 。
九.UDP 协议和 TCP 协议的区别?
1. TCP 基于连接,UDP 基于无连接
2. TCP 要求系统资源较多,UDP 较少
3. UDP 程序结构较简单
4. TCP 保证数据正确性,UDP 可能丢包
5. TCP 保证数据顺序,UDP 不保证
十.父进程如果宕掉,子进程会怎样?
1. 如果父进程是会话首进程,那么父进程退出后,子进程也会退出;
2. 如果父进程不是会话首 进程,那么父进程退出后,子进程不会退出,而它的一个或多个子进程还在运行,那么这些子 进程就成为孤儿进程。
十一. 孤儿进程和僵尸进程有什么区别?
1. 孤儿进程:父进程结束了,而它的一个或多个子进程还在运行,那么这些子进程就成为孤儿进 程(father died)。子进程的资源由 init 进程(进程号 PID = 1)回收。
2. 僵尸进程:子进程退出了,但是父进程没有用 wait 或 waitpid 去获取子进程的状态信息, 那么子进程的进程描述符仍然保存在系统中,这种进程称为僵死进程。