在理解进程和线程概念之前首选要对并发有一定的感性认识,如果服务器同一时间内只能服务于一个客户端,其他客户端都再那里傻等的话,可见其性能的低下估计会被客户骂出翔来,因此并发编程应运而生,并发是网络编程中必须考虑的问题。实现并发的方式有多种:比如多进程、多线程、IO多路复用。

多进程

进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。

Linux系统函数fork()可以在父进程中创建一个子进程,这样的话,在一个进程接到来自客户端新的请求时就可以复制出一个子进程让其来处理,父进程只需负责监控请求的到来,然后创建子进程让其去处理,这样就能做到并发处理。

# -*- coding:utf-8 -*-

import os

print('当前进程:%s 启动中 ....' % os.getpid())

pid = os.fork()

if pid == 0:

print('子进程:%s,父进程是:%s' % (os.getpid(), os.getppid()))

else:

print('进程:%s 创建了子进程:%s' % (os.getpid(),pid ))

输出结果:

当前进程:27223 启动中 ....

进程:27223 创建了子进程:27224

子进程:27224,父进程是:27223

fork函数会返回两次结果,因为操作系统会把当前进程的数据复制一遍,然后程序就分两个进程继续运行后面的代码,fork分别在父进程和子进程中返回,在子进程返回的值pid永远是0,在父进程返回的是子进程的进程id。

多线程

线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。

线程和进程各自有什么区别和优劣呢?

进程是资源分配的最小单位,线程是程序执行的最小单位。

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

老外的原话是这么说的 —-《Unix网络编程》:

fork is expensive. Memory is copied from the parent to the child, all descriptors are duplicated in the child, and so on. Current implementations use a technique called copy-on-write, which avoids a copy of the parent’s data space to the child until the child needs its own copy. But, regardless of this optimization, fork is expensive.

IPC is required to pass information between the parent and child after the fork. Passing information from the parent to the child before the fork is easy, since the child starts with a copy of the parent’s data space and with a copy of all the parent’s descriptors. But, returning information from the child to the parent takes more work.

Threads help with both problems. Threads are sometimes called lightweight processes since a thread is “lighter weight” than a process. That is, thread creation can be 10–100 times faster than process creation.

All threads within a process share the same global memory. This makes the sharing of information easy between the threads, but along with this simplicity comes the problem

linux面试题线程与进程,​一道面试题:说说进程和线程的区别相关推荐

  1. 有的线程它死了,于是它变成一道面试题

    来自:why不止技术 有些线程它活着,但它躺在池中碌碌无为: 有的线程它死了,于是它变成一道面试题. 这次的文章,要从一次阿里巴巴的面试说起. 我记得那天是周一,刚刚经历过周末过的放松,干劲十足的我正 ...

  2. 从一道面试题谈linux下fork的运行机制

    http://kb.cnblogs.com/page/76622/ 今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目: 给出如下C程序,在linux下使用gcc编译: #i ...

  3. 机制 linux_从一道面试题谈linux下fork的运行机制

    今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目: 给出如下C程序,在linux下使用gcc编译: #include "stdio.h" #includ ...

  4. 线程执行一半断了_有的线程它死了,于是它变成一道面试题

    ----本文首发于公众号,关注文末公众号阅读体验更佳 有些线程它活着,但它躺在池中碌碌无为: 有的线程它死了,于是它变成一道面试题. 这次的文章,要从一次阿里的面试说起. 我记得那天是周一,刚刚经历过 ...

  5. 一道面试题:三个线程循环有序输出10次ABCABC...

    面试遇到的一道面试题:三个线程循环有序输出10次ABCABC... 解决思路:使用synchronized,wait和notifyAll控制线程同步 package com.myj.test.thre ...

  6. Linux ps -aux 和 ps -ef 查看进程信息说明+ps查看进程中的线程

    Linux ps -aux 和 ps -ef 查看进程信息说明+ps查看进程中的线程 1. ps -aux | grep xxx 1.1 ps -aux 输出格式: 1.2. 例子 1.3 注意:有时 ...

  7. 分享 10 道 Nodejs 进程相关面试题

    通过对以下 10 个面试题的分享,助您更好的理解 Node.js 的进程和线程相关知识 作者简介:五月君,Nodejs Developer,热爱技术.喜欢分享的 90 后青年,公众号 "No ...

  8. Java线程相关的热门面试题

    1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成 ...

  9. 「一道面试题」输入URL到渲染全面梳理中-页面渲染篇

    前置知识 此文是一道面试题,又不仅仅是一道面试题,不过这道题共分了三篇来说,嗯..可想而知 接上文,上文我们讲了网络通信的部分,详细请看「一道面试题」输入URL到渲染全面梳理上-网络通信篇, 那么该说 ...

  10. 从一道面试题来看计算机专业基础知识的重要性

    以前碰到过这样一道面试题: // 请分析如下代码的执行结果. #include <stdio.h>int main() {int i = 0;int arr[3] = {0};for(;i ...

最新文章

  1. Spring Boot 2.0 常见问题总结(一)
  2. firefox兼容性问题
  3. 警告:‘xxxx’ 将随后被初始化
  4. OpenCASCADE:Mac OS X平台使用Code::Blocks构建OCCT
  5. 使用php吧excel数据存到数据库,php如何存excel数据到数据库
  6. 格兰杰因果关系检验r语言_R语言系列第四期:R语言单样本双样本差异性检验
  7. 如何让两个线程交替打印整数1-100?你的答案呢?
  8. 小白系列:LNMP搭建
  9. 荐书 | 心理学如何编程,看看这9本书
  10. HTML表格、列表、表单
  11. 思科路由器连接电脑配置
  12. Failed to declare queue(s):[XXX]问题解决
  13. 机器的崛起:隐藏的控制论历史(二)
  14. FinFET基础知识合集
  15. (原)详解生产线物流规划的原理及操作方式
  16. 909-MySQL的MVCC机制下,可重复读级别不能完全解决虚读
  17. USB键盘在DOS下无法用,在BIOS和WIN中正常,奇怪情况,原来是PS2接口有问题
  18. C语言花样霓虹灯程序,LM4229显示屏的单片机按键控制多种花样霓虹灯设计报告与源码...
  19. 微信支付消息推送Websocket服务器的创建
  20. GSEA | 基因富集分析

热门文章

  1. Akamai:三季度DDoS攻击总数同比上涨138% 规模超100 Gbps
  2. Docker简介(转)
  3. Android 开机自启动应用
  4. Asp.Net Web API 2第十四课——Content Negotiation(内容协商)
  5. SCAU 8628 相亲
  6. OA系统身份认证的设计
  7. 1.性能之巅 洞悉系统、企业与云计算 --- 绪论
  8. 6.Swoole WebSocket
  9. 9.Memcached 介绍
  10. 14.为主题配置图片性能